# 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
|