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@ab.jp.nec.com>
This commit is contained in:
Keir Fraser committed 2009-03-17 10:36:20 +00:00
1 parent 550686e4fd
commit c48f8a0105
2 files changed
+60 -9

No files matched your search

+37
View File
@@ -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
+23 -9
View File
@@ -27,16 +27,19 @@ from xen.util import mkdir
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.SocketListener):
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)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.