qmsk/net/socket/platform.pxd
author Tero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 21:51:46 +0300
changeset 53 b2d407968973
parent 27 12468e38227e
permissions -rw-r--r--
experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
"""
    Platform definitions for... 64-bit linux. They're all the same, right?
"""

from qmsk.net.libc cimport *

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
    
    # option levels for get/setsockopt
    enum :
        SOL_SOCKET

    # options for get/setsockopt
    enum :
        SO_ERROR

    # 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 "sys/un.h" :
    enum :
        UNIX_PATH_MAX

    struct sockaddr_un :
        sa_family_t     sun_family
        char            sun_path[UNIX_PATH_MAX]
    
    # actually a macro
    # sockaddr_un -> size_t actual length of the sockaddr
    size_t SUN_LEN (sockaddr_un *sa)

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)