cimport qmsk.net.py as py
cdef class sockaddr_un (sockaddr) :
def __init__ (self, char *addr) :
"""
Construct using given literal IPv4 address and TCP/UDP port
addr - IPv4 address, defaults to INADDR_ANY (0.0.0.0)
port - TCP/UDP port, defaults to 0 (ephemeral)
"""
if len(addr) > sizeof(self.sockaddr.sun_path) - 1 :
raise ValueError("AF_UNIX path is too long: " + addr)
# zero
libc.memset(&self.sockaddr, 0, sizeof(self.sockaddr))
# store our family
# XXX: this should be a class attribute...
self._init_family(platform.AF_UNIX)
# constant af
self.sockaddr.sun_family = self.family
# set the sun_path
memcpy(self.sockaddr.sun_path, addr, len(addr))
self.sockaddr.sun_path[len(addr)] = '\0'
cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
if sa_ptr :
sa_ptr[0] = <platform.sockaddr *> &self.sockaddr
if sa_len :
sa_len[0] = sizeof(self.sockaddr)
return 0
cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
assert sa_len == sizeof(self.sockaddr)
libc.memcpy(&self.sockaddr, sa, sa_len)
property path :
"""
The string path
XXX: abstract namespace
"""
def __get__ (self) :
return self.sockaddr.sun_path
def __cmp__ (self, other_obj) :
"""
A sockaddr_un is equal to any other sockaddr_un which has the same path
>>> assert sockaddr_un() == sockaddr_un()
>>> assert sockaddr_un('/foo/bar') == sockaddr_un('/foo/bar')
>>> addr = sockaddr_un(); assert addr == addr
"""
if not isinstance(other_obj, sockaddr_un) :
return <object> py.Py_NotImplemented
cdef sockaddr_un other = other_obj
cdef platform.sockaddr_un *sa1 = &self.sockaddr, *sa2 = &other.sockaddr
if other is self :
return 0
return (
libc.memcmp(<void *> &sa1.sin_path, <void *> &sa2.sin_path, sizeof(sa1.sin_path))
)
def __str__ (self) :
"""
Return the literal ASCII representation for this sockaddr as an '<path> string
>>> str(sockaddr_un('/foo'))
'/foo'
"""
# format
return "%s" % self.path