[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/5] 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> diff -r c30742011bb8 tools/python/xen/web/connection.py --- a/tools/python/xen/web/connection.py Thu Mar 12 18:48:09 2009 +0000 +++ b/tools/python/xen/web/connection.py Fri Mar 13 16:36:19 2009 +0900 @@ -292,3 +292,40 @@ 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 c30742011bb8 tools/python/xen/web/unix.py --- a/tools/python/xen/web/unix.py Thu Mar 12 18:48:09 2009 +0000 +++ b/tools/python/xen/web/unix.py Fri Mar 13 16:36:19 2009 +0900 @@ -27,16 +27,19 @@ 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 @@ 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-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |