qmsk/net/libc.pxd
author Tero Marttila <terom@fixme.fi>
Sun, 16 Aug 2009 19:01:21 +0300
changeset 7 74fde84264b1
child 10 94b0d5a208c1
permissions -rw-r--r--
broke Cython with this package magic
"""
    Libc stuff
"""

cdef extern from "stdint.h" :
    # yes, these are "wrong"
    ctypedef unsigned char uint8_t
    ctypedef unsigned short uint16_t
    ctypedef unsigned int uint32_t
    
    ctypedef signed char int8_t
    ctypedef signed short int16_t
    ctypedef signed int int32_t

cdef extern from "sys/types.h" :
    # potentially wrong...
    ctypedef signed long ssize_t

# <linux/types.h>
cdef extern from "linux/types.h" :
    ctypedef uint8_t __u8
    ctypedef uint16_t __u16
    ctypedef uint32_t __u32
    
    ctypedef int8_t __s8
    ctypedef int16_t __s16
    ctypedef int32_t __s32

cdef extern from "errno.h" :
    int errno
    
cdef extern from "string.h" :
    void* memcpy (void *dest, void *src, size_t n)
    void* memset (void *s, int c, size_t n)

    char* strerror (int errno)

cdef extern from "alloca.h" :
    void* alloca (size_t size)

cdef extern from "sys/uio.h" :
    struct iovec :
        void *iov_base
        size_t iov_len

cdef extern from "arpa/inet.h" :
    # XXX: correct?!
    ctypedef uint32_t socklen_t
    
    char* c_inet_ntop "inet_ntop" (int af, void *sockaddr, char *buf, socklen_t len)
    int c_inet_pton "inet_pton" (int af, char *src, void *dst)

# <sys/socket.h>
cdef extern from "sys/socket.h" :
    # socket types
    enum :
        SOCK_STREAM
        SOCK_DGRAM
        SOCK_RAW
        SOCK_RDM
        SOCK_SEQPACKET
        SOCK_PACKET
    
    # packet/address families
    enum :
        PF_UNSPEC
        PF_LOCAL
        PF_UNIX     # same as PF_LOCAL
        PF_FILE     # same as PF_LOCAL
        PF_INET
        PF_INET6
        PF_NETLINK
        PF_ROUTE    # same as PF_NETLINK

    
    # aliases for PF_*
    enum :
        AF_UNSPEC
        AF_LOCAL
        AF_UNIX
        AF_FILE
        AF_INET
        AF_INET6
        AF_NETLINK
        AF_ROUTE
    
    # base sockaddr stuff
    ctypedef uint16_t sa_family_t

    struct sockaddr :
        sa_family_t     sa_family

    struct sockaddr_storage :
        sa_family_t     ss_family

    # flag values
    enum :
        MSG_OOB
        MSG_PEEK
        MSG_DONTROUTE
        MSG_CTRUNC
        MSG_PROXY
        MSG_TRUNC
        MSG_DONTWAIT
        MSG_EOR
        MSG_WAITALL
        MSG_FIN
        MSG_SYN
        MSG_CONFIRM
        MSG_RST
        MSG_ERRQUEUE
        MSG_NOSIGNAL
        MSG_MORE
        MSG_CMSG_CLOEXEC
    
    ## send/recv-msg
    struct msghdr :
        void *msg_name              # sockaddr
        socklen_t msg_namelen

        iovec *msg_iov              # message data
        size_t msg_iovlen

        void *msg_control           # aux data
        size_t msg_controllen

        int msg_flags               # flags

    struct cmsghdr :
        size_t cmsg_len             # length including this cmsghdr struct

        int cmsg_level              # originating protocol (IPPROTO_* ???)
        int cmsg_type               # protocol-specific type

    ## socket-level cmsghdr types
    enum :
        SCM_RIGHTS
        SCM_CREDENTIALS

    #- ucred

    # SO_LINGER parameters
    struct linger :
        int l_onoff
        int l_linger


    ## API
    int socket (int domain, int socktype, int protocol)
    int bind (int fd, sockaddr *addr, socklen_t len)
    int connect (int fd, sockaddr *addr, socklen_t len)
    int listen (int fd, int n)
    int accept (int fd, sockaddr *addr, socklen_t *len)
    int shutdown (int fd, int how)

    int getsockname (int fd, sockaddr *addr, socklen_t *len)
    int getpeername (int fd, sockaddr *addr, socklen_t *len)

    ssize_t send (int fd, void *buf, size_t n, int flags)
    ssize_t recv (int fd, void *buf, size_t n, int flags)
    ssize_t sendto (int fd, void *buf, size_t n, int flags, sockaddr *addr, socklen_t addr_len)
    ssize_t recvfrom (int fd, void *buf, size_t n, int flags, sockaddr *addr, socklen_t addr_len)
    ssize_t sendmsg (int fd, msghdr *msg, int flags)
    ssize_t recvmsg (int fd, msghdr *msg, int flags)

    int getsockopt (int fd, int level, int optname, void *optval, socklen_t optlen)
    int setsockopt (int fd, int level, int optname, void *optval, socklen_t optlen)

    enum :
        SHUT_RD
        SHUT_WR
        SHUT_RDWR

cdef extern from "netinet/in.h" :
    ## socket protocol types
    enum :
        IPPROTO_IP
        IPPROTO_ICMP
        IPPROTO_IGMP
        IPPROTO_TCP
        IPPROTO_UDP
        IPPROTO_IPV6
        IPPROTO_ICMPV6
        IPPROTO_SCTP
        IPPROTO_RAW

    
    ## ports
    ctypedef uint16_t in_port_t

    ## AF_INET
    ctypedef uint32_t in_addr_t
    struct in_addr :
        in_addr_t s_addr
    
    # XXX: should these be in another cdef?
    in_addr_t INADDR_ANY

    ## AF_INET6
    struct in6_addr :
        # XXX: check POSIX...
        uint8_t s6_addr[16]
        uint16_t s6_addr16[8]
        uint32_t s6_addr32[4]

    # common in6_addr's
    in6_addr in6addr_any
    in6_addr in6addr_loopback

    ## constants
    enum :
        INET_ADDRSTRLEN
        INET6_ADDRSTRLEN

    ## sockaddrs
    struct sockaddr_in :
        sa_family_t     sin_family
        in_port_t       sin_port
        in_addr         sin_addr

    struct sockaddr_in6 :
        sa_family_t     sin6_family
        in_port_t       sin6_port
        uint32_t        sin6_flowinfo
        in6_addr        sin6_addr
        uint32_t        sin6_scope_id

    uint16_t htons(uint16_t)
    uint32_t htonl(uint32_t)
    uint16_t ntohs(uint16_t)
    uint32_t ntohl(uint32_t)

cdef extern from "netdb.h" :
    ## getaddrinfo
    struct addrinfo :
        int         ai_flags
        int         ai_family
        int         ai_socktype
        int         ai_protocol
        int         ai_addrlen
        sockaddr   *ai_addr
        char       *ai_canonname
        addrinfo   *ai_next
    
    enum :
        AI_PASSIVE
        AI_CANONNAME
        AI_NUMERICHOST
        AI_V4MAPPED
        AI_ALL
        AI_ADDRCONFIG
        # AI_*IDN*
        AI_NUMERICSERV

    int c_getaddrinfo "getaddrinfo" (
            char *node, char *service, 
            addrinfo *hints, addrinfo **res
    )

    void c_freeaddrinfo "freeaddrinfo" (addrinfo *res)

    ## getnameinfo
    int c_getnameinfo "getnameinfo" (
            sockaddr *sa, socklen_t salen, 
            char *host, size_t hostlen, 
            char *serv, size_t servlen, 
            int flags
    )

    enum :
        NI_NOFQDN
        NI_NUMERICHOST
        NI_NAMEREQD
        NI_NUMERICSERV
        NI_DGRAM

        NI_MAXHOST
        NI_MAXSERV

    char* gai_strerror (int err)

# python-friendly wrapper around inet_ntop
cdef object inet_ntop (int af, void *sockaddr)
cdef object inet_pton (int af, char *addr, void *sockaddr_out)

# sockaddr, flags -> (host, service)
cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags)

## general errno-based errors
#cdef class Errno (py.OSError) :
#    """
#        Some libc function returned an error code:
#
#            func        - the name of the function called
#            err         - the system error code
#            strerror    - human-readable error code -> message
#    """
#
#    cdef readonly char *func
#    cdef readonly int err
#    cdef readonly object strerror
#
#cdef class GAIError (py.OSError) :
#    """
#        Some libc GAI function returnd an error code:
#
#            func        - the name of the function called
#            err         - the GAI_* error code
#            strerror    - human-readable error code -> message
#    """
#
#    cdef readonly char *func
#    cdef readonly int err
#    cdef readonly object strerror
#