libc.pxd
changeset 6 10bd48c9b6ce
parent 5 59bed837c265
equal deleted inserted replaced
5:59bed837c265 6:10bd48c9b6ce
     1 """
     1 """
     2     Libc stuff
     2     Libc stuff
     3 """
     3 """
     4 
     4 
     5 cdef extern from "stdint.h":
     5 cdef extern from "stdint.h" :
     6     # yes, these are "wrong"
     6     # yes, these are "wrong"
     7     ctypedef unsigned char uint8_t
     7     ctypedef unsigned char uint8_t
     8     ctypedef unsigned short uint16_t
     8     ctypedef unsigned short uint16_t
     9     ctypedef unsigned int uint32_t
     9     ctypedef unsigned int uint32_t
    10     
    10     
    11     ctypedef signed char int8_t
    11     ctypedef signed char int8_t
    12     ctypedef signed short int16_t
    12     ctypedef signed short int16_t
    13     ctypedef signed int int32_t
    13     ctypedef signed int int32_t
       
    14 
       
    15 cdef extern from "sys/types.h" :
       
    16     # potentially wrong...
       
    17     ctypedef signed long ssize_t
    14 
    18 
    15 # <linux/types.h>
    19 # <linux/types.h>
    16 cdef extern from "linux/types.h" :
    20 cdef extern from "linux/types.h" :
    17     ctypedef uint8_t __u8
    21     ctypedef uint8_t __u8
    18     ctypedef uint16_t __u16
    22     ctypedef uint16_t __u16
    32     char* strerror (int errno)
    36     char* strerror (int errno)
    33 
    37 
    34 cdef extern from "alloca.h" :
    38 cdef extern from "alloca.h" :
    35     void* alloca (size_t size)
    39     void* alloca (size_t size)
    36 
    40 
       
    41 cdef extern from "sys/uio.h" :
       
    42     struct iovec :
       
    43         void *iov_base
       
    44         size_t iov_len
       
    45 
       
    46 cdef extern from "arpa/inet.h" :
       
    47     # XXX: correct?!
       
    48     ctypedef uint32_t socklen_t
       
    49     
       
    50     char* c_inet_ntop "inet_ntop" (int af, void *sockaddr, char *buf, socklen_t len)
       
    51     int c_inet_pton "inet_pton" (int af, char *src, void *dst)
       
    52 
    37 # <sys/socket.h>
    53 # <sys/socket.h>
    38 cdef extern from "sys/socket.h" :
    54 cdef extern from "sys/socket.h" :
       
    55     # socket types
    39     enum :
    56     enum :
    40         SOCK_STREAM
    57         SOCK_STREAM
    41         SOCK_DGRAM
    58         SOCK_DGRAM
       
    59         SOCK_RAW
       
    60         SOCK_RDM
    42         SOCK_SEQPACKET
    61         SOCK_SEQPACKET
    43 
    62         SOCK_PACKET
       
    63     
       
    64     # packet/address families
    44     enum :
    65     enum :
    45         PF_UNSPEC
    66         PF_UNSPEC
    46         PF_LOCAL
    67         PF_LOCAL
       
    68         PF_UNIX     # same as PF_LOCAL
       
    69         PF_FILE     # same as PF_LOCAL
    47         PF_INET
    70         PF_INET
    48         PF_INET6
    71         PF_INET6
    49     
    72         PF_NETLINK
    50     # these are #defines
    73         PF_ROUTE    # same as PF_NETLINK
    51     enum :
    74 
    52         PF_UNIX
    75     
    53 
    76     # aliases for PF_*
       
    77     enum :
    54         AF_UNSPEC
    78         AF_UNSPEC
    55         AF_LOCAL
    79         AF_LOCAL
    56         AF_UNIX
    80         AF_UNIX
       
    81         AF_FILE
    57         AF_INET
    82         AF_INET
    58         AF_INET6
    83         AF_INET6
    59 
    84         AF_NETLINK
       
    85         AF_ROUTE
       
    86     
       
    87     # base sockaddr stuff
    60     ctypedef uint16_t sa_family_t
    88     ctypedef uint16_t sa_family_t
       
    89 
       
    90     struct sockaddr :
       
    91         sa_family_t     sa_family
       
    92 
       
    93     struct sockaddr_storage :
       
    94         sa_family_t     ss_family
       
    95 
       
    96     # flag values
       
    97     enum :
       
    98         MSG_OOB
       
    99         MSG_PEEK
       
   100         MSG_DONTROUTE
       
   101         MSG_CTRUNC
       
   102         MSG_PROXY
       
   103         MSG_TRUNC
       
   104         MSG_DONTWAIT
       
   105         MSG_EOR
       
   106         MSG_WAITALL
       
   107         MSG_FIN
       
   108         MSG_SYN
       
   109         MSG_CONFIRM
       
   110         MSG_RST
       
   111         MSG_ERRQUEUE
       
   112         MSG_NOSIGNAL
       
   113         MSG_MORE
       
   114         MSG_CMSG_CLOEXEC
       
   115     
       
   116     ## send/recv-msg
       
   117     struct msghdr :
       
   118         void *msg_name              # sockaddr
       
   119         socklen_t msg_namelen
       
   120 
       
   121         iovec *msg_iov              # message data
       
   122         size_t msg_iovlen
       
   123 
       
   124         void *msg_control           # aux data
       
   125         size_t msg_controllen
       
   126 
       
   127         int msg_flags               # flags
       
   128 
       
   129     struct cmsghdr :
       
   130         size_t cmsg_len             # length including this cmsghdr struct
       
   131 
       
   132         int cmsg_level              # originating protocol (IPPROTO_* ???)
       
   133         int cmsg_type               # protocol-specific type
       
   134 
       
   135     ## socket-level cmsghdr types
       
   136     enum :
       
   137         SCM_RIGHTS
       
   138         SCM_CREDENTIALS
       
   139 
       
   140     #- ucred
       
   141 
       
   142     # SO_LINGER parameters
       
   143     struct linger :
       
   144         int l_onoff
       
   145         int l_linger
       
   146 
       
   147 
       
   148     ## API
       
   149     int socket (int domain, int socktype, int protocol)
       
   150     int bind (int fd, sockaddr *addr, socklen_t len)
       
   151     int connect (int fd, sockaddr *addr, socklen_t len)
       
   152     int listen (int fd, int n)
       
   153     int accept (int fd, sockaddr *addr, socklen_t *len)
       
   154     int shutdown (int fd, int how)
       
   155 
       
   156     int getsockname (int fd, sockaddr *addr, socklen_t *len)
       
   157     int getpeername (int fd, sockaddr *addr, socklen_t *len)
       
   158 
       
   159     ssize_t send (int fd, void *buf, size_t n, int flags)
       
   160     ssize_t recv (int fd, void *buf, size_t n, int flags)
       
   161     ssize_t sendto (int fd, void *buf, size_t n, int flags, sockaddr *addr, socklen_t addr_len)
       
   162     ssize_t recvfrom (int fd, void *buf, size_t n, int flags, sockaddr *addr, socklen_t addr_len)
       
   163     ssize_t sendmsg (int fd, msghdr *msg, int flags)
       
   164     ssize_t recvmsg (int fd, msghdr *msg, int flags)
       
   165 
       
   166     int getsockopt (int fd, int level, int optname, void *optval, socklen_t optlen)
       
   167     int setsockopt (int fd, int level, int optname, void *optval, socklen_t optlen)
       
   168 
       
   169     enum :
       
   170         SHUT_RD
       
   171         SHUT_WR
       
   172         SHUT_RDWR
       
   173 
       
   174 cdef extern from "netinet/in.h" :
       
   175     ## socket protocol types
       
   176     enum :
       
   177         IPPROTO_IP
       
   178         IPPROTO_ICMP
       
   179         IPPROTO_IGMP
       
   180         IPPROTO_TCP
       
   181         IPPROTO_UDP
       
   182         IPPROTO_IPV6
       
   183         IPPROTO_ICMPV6
       
   184         IPPROTO_SCTP
       
   185         IPPROTO_RAW
       
   186 
       
   187     
       
   188     ## ports
    61     ctypedef uint16_t in_port_t
   189     ctypedef uint16_t in_port_t
       
   190 
       
   191     ## AF_INET
    62     ctypedef uint32_t in_addr_t
   192     ctypedef uint32_t in_addr_t
    63 
       
    64     ## AF_INET
       
    65     struct in_addr :
   193     struct in_addr :
    66         in_addr_t s_addr
   194         in_addr_t s_addr
    67 
   195     
       
   196     # XXX: should these be in another cdef?
       
   197     in_addr_t INADDR_ANY
       
   198 
       
   199     ## AF_INET6
       
   200     struct in6_addr :
       
   201         # XXX: check POSIX...
       
   202         uint8_t s6_addr[16]
       
   203         uint16_t s6_addr16[8]
       
   204         uint32_t s6_addr32[4]
       
   205 
       
   206     # common in6_addr's
       
   207     in6_addr in6addr_any
       
   208     in6_addr in6addr_loopback
       
   209 
       
   210     ## constants
       
   211     enum :
       
   212         INET_ADDRSTRLEN
       
   213         INET6_ADDRSTRLEN
       
   214 
       
   215     ## sockaddrs
    68     struct sockaddr_in :
   216     struct sockaddr_in :
    69         sa_family_t     sin_family
   217         sa_family_t     sin_family
    70         in_port_t       sin_port
   218         in_port_t       sin_port
    71         in_addr         sin_addr
   219         in_addr         sin_addr
    72 
       
    73     # XXX: should these be in another cdef?
       
    74     in_addr_t INADDR_ANY
       
    75 
       
    76     ## AF_INET6
       
    77     struct in6_addr :
       
    78         pass
       
    79 
   220 
    80     struct sockaddr_in6 :
   221     struct sockaddr_in6 :
    81         sa_family_t     sin6_family
   222         sa_family_t     sin6_family
    82         in_port_t       sin6_port
   223         in_port_t       sin6_port
    83         uint32_t        sin6_flowinfo
   224         uint32_t        sin6_flowinfo
    84         in6_addr        sin6_addr
   225         in6_addr        sin6_addr
    85         uint32_t        sin6_scope_id
   226         uint32_t        sin6_scope_id
    86 
   227 
    87     # common in6_addr's
       
    88     in6_addr in6addr_any
       
    89     in6_addr in6addr_loopback
       
    90 
       
    91     ## actually from bits/socket.h...
       
    92     struct sockaddr :
       
    93         sa_family_t     sa_family
       
    94 
       
    95     struct sockaddr_storage :
       
    96         sa_family_t     ss_family
       
    97 
       
    98 cdef extern from "arpa/inet.h" :
       
    99     uint16_t htons(uint16_t)
   228     uint16_t htons(uint16_t)
   100     uint32_t htonl(uint32_t)
   229     uint32_t htonl(uint32_t)
   101     uint16_t ntohs(uint16_t)
   230     uint16_t ntohs(uint16_t)
   102     uint32_t ntohl(uint32_t)
   231     uint32_t ntohl(uint32_t)
   103     
       
   104     # XXX: correct?!
       
   105     ctypedef size_t socklen_t
       
   106 
       
   107     ## constants
       
   108     enum :
       
   109         INET_ADDRSTRLEN
       
   110         INET6_ADDRSTRLEN
       
   111     
       
   112     char* c_inet_ntop "inet_ntop" (int af, void *sockaddr, char *buf, socklen_t len)
       
   113     int c_inet_pton "inet_pton" (int af, char *src, void *dst)
       
   114 
   232 
   115 cdef extern from "netdb.h" :
   233 cdef extern from "netdb.h" :
   116     ## getaddrinfo
   234     ## getaddrinfo
   117     struct addrinfo :
   235     struct addrinfo :
   118         int         ai_flags
   236         int         ai_flags
   165 cdef object inet_ntop (int af, void *sockaddr)
   283 cdef object inet_ntop (int af, void *sockaddr)
   166 cdef object inet_pton (int af, char *addr, void *sockaddr_out)
   284 cdef object inet_pton (int af, char *addr, void *sockaddr_out)
   167 
   285 
   168 # sockaddr, flags -> (host, service)
   286 # sockaddr, flags -> (host, service)
   169 cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags)
   287 cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags)
       
   288 
       
   289 ## general errno-based errors
       
   290 #cdef class Errno (py.OSError) :
       
   291 #    """
       
   292 #        Some libc function returned an error code:
       
   293 #
       
   294 #            func        - the name of the function called
       
   295 #            err         - the system error code
       
   296 #            strerror    - human-readable error code -> message
       
   297 #    """
       
   298 #
       
   299 #    cdef readonly char *func
       
   300 #    cdef readonly int err
       
   301 #    cdef readonly object strerror
       
   302 #
       
   303 #cdef class GAIError (py.OSError) :
       
   304 #    """
       
   305 #        Some libc GAI function returnd an error code:
       
   306 #
       
   307 #            func        - the name of the function called
       
   308 #            err         - the GAI_* error code
       
   309 #            strerror    - human-readable error code -> message
       
   310 #    """
       
   311 #
       
   312 #    cdef readonly char *func
       
   313 #    cdef readonly int err
       
   314 #    cdef readonly object strerror
       
   315 #