From: Ondřej Nový Date: Wed, 11 Apr 2018 14:17:04 +0000 (+0200) Subject: Ignore ENOPROTOOPT errors from SO_REUSEADDR or SO_ERROR X-Git-Tag: v5.1.0b1~13^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=adcffa673bf90e9a95f5eed321c32cc6e2acdb50;p=thirdparty%2Ftornado.git Ignore ENOPROTOOPT errors from SO_REUSEADDR or SO_ERROR Some systems, for example Hurd doesn't support SO_REUSEADDR. --- diff --git a/tornado/iostream.py b/tornado/iostream.py index 63110a1a6..53ca94ecc 100644 --- a/tornado/iostream.py +++ b/tornado/iostream.py @@ -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 diff --git a/tornado/netutil.py b/tornado/netutil.py index 08c9d8862..89fe1b3bb 100644 --- a/tornado/netutil.py +++ b/tornado/netutil.py @@ -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)