On 2 August 2016 at 10:45, Paul Boca <pb...@cloudbasesolutions.com> wrote:
> AF_UNIX sockets are not supported on Windows. > Instead of an AF_UNIX socket use localhost tcp connections to communicate > between components. This makes the python sockets compatible with > the ones used in Windows applications. > > In case the socket returns WSAEWOULDBLOCK, it is replaced by EAGAIN error > in order to be compatible with Windows. > > Signed-off-by: Paul-Daniel Boca <pb...@cloudbasesolutions.com> > Acked-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com> > I am skipping this. I suppose this does not work anymore as the servers can use named pipes. > --- > V2: Fixed Python function inet_open_active, treat WSAEWOULDBLOCK error as > EINPROGRESS on Windows > V3: Use context managers for file handle leaks > V4: No changes > V5: No changes > V6: No changes > V7: Fix for JSON-RPC tests - treat WSAEWOULDBLOCK error as EAGAIN > for compatibility > V8: No changes > V9: No changes > V10: No changes > V11: No changes > --- > python/ovs/jsonrpc.py | 4 ++++ > python/ovs/socket_util.py | 56 > +++++++++++++++++++++++++++++++++++++------- > python/ovs/stream.py | 9 +++++-- > python/ovs/unixctl/server.py | 6 +++-- > 4 files changed, 62 insertions(+), 13 deletions(-) > > diff --git a/python/ovs/jsonrpc.py b/python/ovs/jsonrpc.py > index 6300c67..1bc3493 100644 > --- a/python/ovs/jsonrpc.py > +++ b/python/ovs/jsonrpc.py > @@ -14,6 +14,7 @@ > > import errno > import os > +import sys > > import six > > @@ -274,6 +275,9 @@ class Connection(object): > except UnicodeError: > error = errno.EILSEQ > if error: > + if (sys.platform == "win32" > + and error == errno.WSAEWOULDBLOCK): > + error = errno.EAGAIN > if error == errno.EAGAIN: > return error, None > else: > diff --git a/python/ovs/socket_util.py b/python/ovs/socket_util.py > index b358b05..949d27a 100644 > --- a/python/ovs/socket_util.py > +++ b/python/ovs/socket_util.py > @@ -17,6 +17,7 @@ import os > import os.path > import random > import socket > +import sys > > import six > from six.moves import range > @@ -54,6 +55,26 @@ def free_short_name(short_name): > ovs.fatal_signal.unlink_file_now(link_name) > > > +def compat_read_unix_socket(path): > + try: > + with open(path, "r+") as file_handle: > + ret = int(file_handle.readline()) > + except IOError as e: > + vlog.warn("%s: open: %s" % (path, e.strerror)) > + raise socket.error(errno.ENOENT) > + > + return ret > + > + > +def compat_write_unix_socket(path, port): > + try: > + with open(path, "w") as file_handle: > + file_handle.write(str(port)) > + except IOError as e: > + vlog.warn("%s: open: %s" % (path, e.strerror)) > + raise socket.error(errno.ENOENT) > + > + > def make_unix_socket(style, nonblock, bind_path, connect_path, > short=False): > """Creates a Unix domain socket in the given 'style' (either > socket.SOCK_DGRAM or socket.SOCK_STREAM) that is bound to 'bind_path' > (if > @@ -65,7 +86,10 @@ def make_unix_socket(style, nonblock, bind_path, > connect_path, short=False): > None.""" > > try: > - sock = socket.socket(socket.AF_UNIX, style) > + if sys.platform == "win32": > + sock = socket.socket(socket.AF_INET, style) > + else: > + sock = socket.socket(socket.AF_UNIX, style) > except socket.error as e: > return get_exception_errno(e), None > > @@ -81,17 +105,28 @@ def make_unix_socket(style, nonblock, bind_path, > connect_path, short=False): > return e.errno, None > > ovs.fatal_signal.add_file_to_unlink(bind_path) > - sock.bind(bind_path) > + if sys.platform == "win32": > + sock.bind(("127.0.0.1", 0)) > + compat_write_unix_socket(bind_path, sock.getsockname()[1]) > + else: > + sock.bind(bind_path) > > - try: > - os.fchmod(sock.fileno(), 0o700) > - except OSError as e: > - pass > + try: > + os.fchmod(sock.fileno(), 0o700) > + except OSError as e: > + pass > if connect_path is not None: > try: > - sock.connect(connect_path) > + if sys.platform == "win32": > + port = compat_read_unix_socket(connect_path) > + sock.connect(("127.0.0.1", port)) > + else: > + sock.connect(connect_path) > except socket.error as e: > - if get_exception_errno(e) != errno.EINPROGRESS: > + error = get_exception_errno(e) > + if sys.platform == "win32" and error == > errno.WSAEWOULDBLOCK: > + error = errno.EINPROGRESS > + if error != errno.EINPROGRESS: > raise > return 0, sock > except socket.error as e: > @@ -228,7 +263,10 @@ def inet_open_active(style, target, default_port, > dscp): > try: > sock.connect(address) > except socket.error as e: > - if get_exception_errno(e) != errno.EINPROGRESS: > + error = get_exception_errno(e) > + if sys.platform == "win32" and error == errno.WSAEWOULDBLOCK: > + error = errno.EINPROGRESS > + if error != errno.EINPROGRESS: > raise > return 0, sock > except socket.error as e: > diff --git a/python/ovs/stream.py b/python/ovs/stream.py > index 97b22ac..b3aa5d9 100644 > --- a/python/ovs/stream.py > +++ b/python/ovs/stream.py > @@ -15,7 +15,7 @@ > import errno > import os > import socket > - > +import sys > import six > > import ovs.poller > @@ -136,6 +136,8 @@ class Stream(object): > if not error: > while True: > error = stream.connect() > + if sys.platform == "win32" and error == > errno.WSAEWOULDBLOCK: > + error = errno.EAGAIN > if error != errno.EAGAIN: > break > stream.run() > @@ -338,12 +340,15 @@ class PassiveStream(object): > try: > sock, addr = self.socket.accept() > ovs.socket_util.set_nonblocking(sock) > - if (sock.family == socket.AF_UNIX): > + if (sys.platform != "win32" > + and sock.family == socket.AF_UNIX): > return 0, Stream(sock, "unix:%s" % addr, 0) > return 0, Stream(sock, 'ptcp:%s:%s' % (addr[0], > str(addr[1])), 0) > except socket.error as e: > error = ovs.socket_util.get_exception_errno(e) > + if sys.platform == "win32" and error == > errno.WSAEWOULDBLOCK: > + error = errno.EAGAIN > if error != errno.EAGAIN: > # XXX rate-limit > vlog.dbg("accept: %s" % os.strerror(error)) > diff --git a/python/ovs/unixctl/server.py b/python/ovs/unixctl/server.py > index 8595ed8..749a335 100644 > --- a/python/ovs/unixctl/server.py > +++ b/python/ovs/unixctl/server.py > @@ -148,6 +148,8 @@ class UnixctlServer(object): > def run(self): > for _ in range(10): > error, stream = self._listener.accept() > + if sys.platform == "win32" and error == errno.WSAEWOULDBLOCK: > + error = errno.EAGAIN > if not error: > rpc = ovs.jsonrpc.Connection(stream) > self._conns.append(UnixctlConnection(rpc)) > @@ -155,8 +157,8 @@ class UnixctlServer(object): > break > else: > # XXX: rate-limit > - vlog.warn("%s: accept failed: %s" % (self._listener.name, > - os.strerror(error))) > + vlog.warn("%s: accept failed: %s %d %d" > + % (self._listener.name, os.strerror(error), > error)) > > for conn in copy.copy(self._conns): > error = conn.run() > -- > 2.7.2.windows.1 > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev