qmsk/net/socket/platform.pxd
changeset 10 94b0d5a208c1
child 11 7ae92c2b433f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk/net/socket/platform.pxd	Sun Aug 16 20:18:39 2009 +0300
@@ -0,0 +1,250 @@
+"""
+    Platform definitions for... 64-bit linux. They're all the same, right?
+"""
+
+from 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
+    
+    # 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)
+
+