[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xend: Implement DGRAM (connectionless) type socket listeners
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1237286180 0 # Node ID 24af58657d8e86d4d5dc0828001cf710cf6e44fe # Parent 0e1449d6f2315f375bce09341a6476146e151018 xend: Implement DGRAM (connectionless) type socket listeners Introduce SocketDgramListener and UnixDgramListener classes. We already have STREAM (connection) type socket listener classes in the source tree, but we need DGRAM (connectionless) type listeners to receive udev events. Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@xxxxxxxxxxxxx> --- tools/python/xen/web/connection.py | 37 +++++++++++++++++++++++++++++++++++++ tools/python/xen/web/unix.py | 32 +++++++++++++++++++++++--------- 2 files changed, 60 insertions(+), 9 deletions(-) diff -r 0e1449d6f231 -r 24af58657d8e tools/python/xen/web/connection.py --- a/tools/python/xen/web/connection.py Fri Mar 13 10:09:25 2009 +0000 +++ b/tools/python/xen/web/connection.py Tue Mar 17 10:36:20 2009 +0000 @@ -292,3 +292,40 @@ def hostAllowed(addrport, hosts_allowed) return True log.warn("Rejected connection from %s (%s).", addrport[0], fqdn) return False + + +class SocketDgramListener: + """A connectionless server socket, running listen in a thread. + """ + + def __init__(self, protocol_class): + self.protocol = protocol_class() + self.sock = self.createSocket() + threading.Thread(target=self.main).start() + + + def close(self): + try: + self.sock.close() + except: + pass + + + def createSocket(self): + raise NotImplementedError() + + + def main(self): + try: + while True: + try: + data = self.sock.recv(BUFFER_SIZE) + self.protocol.dataReceived(data) + except socket.error, ex: + if ex.args[0] not in (EWOULDBLOCK, EAGAIN, EINTR): + break + finally: + try: + self.close() + except: + pass diff -r 0e1449d6f231 -r 24af58657d8e tools/python/xen/web/unix.py --- a/tools/python/xen/web/unix.py Fri Mar 13 10:09:25 2009 +0000 +++ b/tools/python/xen/web/unix.py Tue Mar 17 10:36:20 2009 +0000 @@ -27,16 +27,19 @@ import connection import connection -def bind(path): - """Create a Unix socket, and bind it to the given path. The socket is -created such that only the current user may access it.""" +def bind(path, type = socket.SOCK_STREAM): + """Create a Unix socket, and bind it to the given path. + The socket is created such that only the current user may access it.""" - parent = os.path.dirname(path) - mkdir.parents(parent, stat.S_IRWXU, True) - if os.path.exists(path): - os.unlink(path) + if path[0] == '\0': # Abstract namespace is used for the path + pass + else: + parent = os.path.dirname(path) + mkdir.parents(parent, stat.S_IRWXU, True) + if os.path.exists(path): + os.unlink(path) - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + sock = socket.socket(socket.AF_UNIX, type) sock.bind(path) return sock @@ -48,8 +51,19 @@ class UnixListener(connection.SocketList def createSocket(self): - return bind(self.path) + return bind(self.path, socket.SOCK_STREAM) def acceptConnection(self, sock, _): connection.SocketServerConnection(sock, self.protocol_class) + + +class UnixDgramListener(connection.SocketDgramListener): + def __init__(self, path, protocol_class): + self.path = path + connection.SocketDgramListener.__init__(self, protocol_class) + + + def createSocket(self): + return bind(self.path, socket.SOCK_DGRAM) + _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |