]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Ignore ENOPROTOOPT errors from SO_REUSEADDR or SO_ERROR
authorOndřej Nový <ondrej.novy@firma.seznam.cz>
Wed, 11 Apr 2018 14:17:04 +0000 (16:17 +0200)
committerBen Darnell <ben@bendarnell.com>
Sat, 19 May 2018 23:50:28 +0000 (19:50 -0400)
Some systems, for example Hurd doesn't support SO_REUSEADDR.

tornado/iostream.py
tornado/netutil.py

index 63110a1a65827c045efd6b444ccf709e9205ed19..53ca94eccb6196f2d02f9a01419565230012d81f 100644 (file)
@@ -1410,7 +1410,12 @@ class IOStream(BaseIOStream):
         return future
 
     def _handle_connect(self):
-        err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
+        try:
+            err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
+        except socket.error as e:
+            err = e.args[0]
+            if err == errno.ENOPROTOOPT:
+                err = 0
         if err != 0:
             self.error = socket.error(err, os.strerror(err))
             # IOLoop implementations may vary: some of them return
index 08c9d886276fa4987381f5447516b0ecdc9be710..89fe1b3bbaa66b1a2e71dd170d8363bb31acf6d0 100644 (file)
@@ -138,9 +138,17 @@ def bind_sockets(port, address=None, family=socket.AF_UNSPEC,
             raise
         set_close_exec(sock.fileno())
         if os.name != 'nt':
-            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+            try:
+                sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+            except socket.error as e:
+                if e.args[0] != errno.ENOPROTOOPT:
+                    raise
         if reuse_port:
-            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+            try:
+                sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+            except socket.error as e:
+                if e.args[0] != errno.ENOPROTOOPT:
+                    raise
         if af == socket.AF_INET6:
             # On linux, ipv6 sockets accept ipv4 too by default,
             # but this makes it impossible to bind to both
@@ -180,7 +188,11 @@ if hasattr(socket, 'AF_UNIX'):
         """
         sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
         set_close_exec(sock.fileno())
-        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        try:
+            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+        except socket.error as e:
+            if e.args[0] != errno.ENOPROTOOPT:
+                raise
         sock.setblocking(0)
         try:
             st = os.stat(file)