libc.pyx
author Tero Marttila <terom@fixme.fi>
Sun, 16 Aug 2009 02:58:32 +0300
changeset 0 975801b28d85
child 4 664a1dfe08ac
permissions -rw-r--r--
initial code
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
from libc cimport *
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
cdef object inet_ntop (int af, void *sockaddr) :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
    """
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
        Wrapper around inet_ntop, returning a PyString
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
    """
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    # XXX: longest possible address...
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    cdef char buf[INET6_ADDRSTRLEN]
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    if c_inet_ntop(af, sockaddr, buf, sizeof(buf)) == NULL :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        # XXX: errno?
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
        raise OSError()
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    # autoconvert -> str
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    return buf
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
cdef object inet_pton (int af, char *addr, void *sockaddr_out) :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    if c_inet_pton(af, addr, sockaddr_out) < 0 :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        raise OSError()
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    cdef char hostbuf[NI_MAXHOST]
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    cdef char servbuf[NI_MAXSERV]
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    cdef int err
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    err = c_getnameinfo(sa, salen, hostbuf, sizeof(hostbuf), servbuf, sizeof(servbuf), flags)
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    if err :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        # XXX: raise a GAIError
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        raise Exception(gai_strerror(err))
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    else :
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        return hostbuf, servbuf
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35