diff --git a/IPython/html/notebookapp.py b/IPython/html/notebookapp.py
index e5d2298bf..206473cfb 100644
--- a/IPython/html/notebookapp.py
+++ b/IPython/html/notebookapp.py
@@ -112,7 +112,7 @@ def random_ports(port, n):
for i in range(min(5, n)):
yield port + i
for i in range(n-5):
- yield port + random.randint(-2*n, 2*n)
+ yield max(1, port + random.randint(-2*n, 2*n))
def load_handlers(name):
"""Load the (URL pattern, handler) tuples for each component."""
@@ -590,9 +590,14 @@ class NotebookApp(BaseIPythonApplication):
break
# restore the monekypatch
socket.AI_ADDRCONFIG = saved_AI_ADDRCONFIG
- if e.errno != errno.EADDRINUSE:
+ if e.errno == errno.EADDRINUSE:
+ self.log.info('The port %i is already in use, trying another random port.' % port)
+ continue
+ elif e.errno in (errno.EACCES, getattr(errno, 'WSAEACCES', errno.EACCES)):
+ self.log.warn("Permission to listen on port %i denied" % port)
+ continue
+ else:
raise
- self.log.info('The port %i is already in use, trying another random port.' % port)
else:
self.port = port
success = True