fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
cdef class sockaddr :
cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) :
self.family = family
# XXX:use size_t
cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
"""
Get the sockaddr pointer and sockaddr length for this address
"""
raise NotImplementedError()
cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL :
"""
Get the sockaddr pointer
"""
cdef platform.sockaddr *sa
cdef platform.socklen_t sa_len
self._get_sockaddr(&sa, &sa_len)
return sa
cdef platform.socklen_t _get_sockaddr_len (self) except -1 :
"""
Get the sockaddr len
"""
cdef platform.sockaddr *sa
cdef platform.socklen_t sa_len
self._get_sockaddr(&sa, &sa_len)
return sa_len
cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
"""
Set the sockaddr value for this address; sa_len must match!
"""
raise NotImplementedError()
def getnameinfo (self) :
"""
Returns a (host, serv) tuple for this address à la getnameinfo
>>> addr = sockaddr_in()
>>> assert addr.getnameinfo() == (addr.addr, str(addr.port))
"""
cdef platform.sockaddr *sa
cdef platform.socklen_t sa_len
# XXX: take as args?
cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV
# get our abstract sockaddr
self._get_sockaddr(&sa, &sa_len)
# get nice text format
return platform.getnameinfo(sa, sa_len, flags)
property addr :
"""
The ASCII literal network address
"""
def __get__ (self) :
"""
Default implmentation using getnameinfo()
"""
addr, port = self.getnameinfo()
return addr
property port :
"""
The integer port number
"""
def __get__ (self) :
"""
Default implementation using getnameinfo() and int()
"""
addr, port = self.getnameinfo()
return int(port)
def __repr__ (self) :
return "sockaddr(%d, %s, %d)" % (self.family, self.addr, self.port)