qmsk/net/socket/platform.pyx
author Tero Marttila <terom@fixme.fi>
Sun, 16 Aug 2009 20:18:39 +0300
changeset 10 94b0d5a208c1
child 11 7ae92c2b433f
permissions -rw-r--r--
split up socket.platform

from qmsk.net.socket.platform cimport *

from py cimport raise_errno

## function wrappers
cdef object inet_ntop (int af, void *sockaddr) :
    """
        Wrapper around inet_ntop, returning a PyString
    """

    # XXX: longest possible address...
    cdef char buf[INET6_ADDRSTRLEN]

    if c_inet_ntop(af, sockaddr, buf, sizeof(buf)) == NULL :
        raise_errno('inet_ntop')
    
    # autoconvert -> str
    return buf

cdef object inet_pton (int af, char *addr, void *sockaddr_out) :
    cdef int ret

    ret = c_inet_pton(af, addr, sockaddr_out)
    
    if ret < 0 :
        raise_errno('inet_pton')

    elif ret == 0 :
        raise NameError("Invalid network address for specified address family: %r" % (addr, ))

cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) :
    cdef char hostbuf[NI_MAXHOST]
    cdef char servbuf[NI_MAXSERV]
    cdef int err

    err = c_getnameinfo(sa, salen, hostbuf, sizeof(hostbuf), servbuf, sizeof(servbuf), flags)

    if err :
        # XXX: raise a GAIError
        raise Exception(gai_strerror(err))
#        raise GAIError('getnameinfo', err)

    else :
        return hostbuf, servbuf