qmsk/net/libc.pyx
changeset 7 74fde84264b1
child 10 94b0d5a208c1
equal deleted inserted replaced
6:10bd48c9b6ce 7:74fde84264b1
       
     1 from libc cimport *
       
     2 from py cimport raise_errno
       
     3 
       
     4 cdef object inet_ntop (int af, void *sockaddr) :
       
     5     """
       
     6         Wrapper around inet_ntop, returning a PyString
       
     7     """
       
     8 
       
     9     # XXX: longest possible address...
       
    10     cdef char buf[INET6_ADDRSTRLEN]
       
    11 
       
    12     if c_inet_ntop(af, sockaddr, buf, sizeof(buf)) == NULL :
       
    13         raise_errno('inet_ntop')
       
    14     
       
    15     # autoconvert -> str
       
    16     return buf
       
    17 
       
    18 cdef object inet_pton (int af, char *addr, void *sockaddr_out) :
       
    19     cdef int ret
       
    20 
       
    21     ret = c_inet_pton(af, addr, sockaddr_out)
       
    22     
       
    23     if ret < 0 :
       
    24         raise_errno('inet_pton')
       
    25 
       
    26     elif ret == 0 :
       
    27         raise NameError("Invalid network address for specified address family: %r" % (addr, ))
       
    28 
       
    29 cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) :
       
    30     cdef char hostbuf[NI_MAXHOST]
       
    31     cdef char servbuf[NI_MAXSERV]
       
    32     cdef int err
       
    33 
       
    34     err = c_getnameinfo(sa, salen, hostbuf, sizeof(hostbuf), servbuf, sizeof(servbuf), flags)
       
    35 
       
    36     if err :
       
    37         # XXX: raise a GAIError
       
    38         raise Exception(gai_strerror(err))
       
    39 #        raise GAIError('getnameinfo', err)
       
    40 
       
    41     else :
       
    42         return hostbuf, servbuf
       
    43 
       
    44 #cdef class Errno (py.OSError) :
       
    45 #    def __init__ (self, func) :
       
    46 #        self.func = func
       
    47 #        self.err = errno
       
    48 #        self.strerror = strerror(errno)
       
    49 #
       
    50 #    def __str__ (self) :
       
    51 #        return "%s: %s" % (self.func, self.strerror)
       
    52 #
       
    53 #cdef class GAIError (py.OSError) :
       
    54 #    def __init__ (self, func, err) :
       
    55 #        self.func = func
       
    56 #        self.err = err
       
    57 #        self.strerror = gai_strerror(err)
       
    58 #
       
    59 #    def __str__ (self) :
       
    60 #        return "%s: %s" % (self.func, self.strerror)
       
    61 #