libc.pxd
changeset 7 74fde84264b1
parent 6 10bd48c9b6ce
child 8 b3880dafbab1
equal deleted inserted replaced
6:10bd48c9b6ce 7:74fde84264b1
     1 """
       
     2     Libc stuff
       
     3 """
       
     4 
       
     5 cdef extern from "stdint.h" :
       
     6     # yes, these are "wrong"
       
     7     ctypedef unsigned char uint8_t
       
     8     ctypedef unsigned short uint16_t
       
     9     ctypedef unsigned int uint32_t
       
    10     
       
    11     ctypedef signed char int8_t
       
    12     ctypedef signed short int16_t
       
    13     ctypedef signed int int32_t
       
    14 
       
    15 cdef extern from "sys/types.h" :
       
    16     # potentially wrong...
       
    17     ctypedef signed long ssize_t
       
    18 
       
    19 # <linux/types.h>
       
    20 cdef extern from "linux/types.h" :
       
    21     ctypedef uint8_t __u8
       
    22     ctypedef uint16_t __u16
       
    23     ctypedef uint32_t __u32
       
    24     
       
    25     ctypedef int8_t __s8
       
    26     ctypedef int16_t __s16
       
    27     ctypedef int32_t __s32
       
    28 
       
    29 cdef extern from "errno.h" :
       
    30     int errno
       
    31     
       
    32 cdef extern from "string.h" :
       
    33     void* memcpy (void *dest, void *src, size_t n)
       
    34     void* memset (void *s, int c, size_t n)
       
    35 
       
    36     char* strerror (int errno)
       
    37 
       
    38 cdef extern from "alloca.h" :
       
    39     void* alloca (size_t size)
       
    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 
       
    53 # <sys/socket.h>
       
    54 cdef extern from "sys/socket.h" :
       
    55     # socket types
       
    56     enum :
       
    57         SOCK_STREAM
       
    58         SOCK_DGRAM
       
    59         SOCK_RAW
       
    60         SOCK_RDM
       
    61         SOCK_SEQPACKET
       
    62         SOCK_PACKET
       
    63     
       
    64     # packet/address families
       
    65     enum :
       
    66         PF_UNSPEC
       
    67         PF_LOCAL
       
    68         PF_UNIX     # same as PF_LOCAL
       
    69         PF_FILE     # same as PF_LOCAL
       
    70         PF_INET
       
    71         PF_INET6
       
    72         PF_NETLINK
       
    73         PF_ROUTE    # same as PF_NETLINK
       
    74 
       
    75     
       
    76     # aliases for PF_*
       
    77     enum :
       
    78         AF_UNSPEC
       
    79         AF_LOCAL
       
    80         AF_UNIX
       
    81         AF_FILE
       
    82         AF_INET
       
    83         AF_INET6
       
    84         AF_NETLINK
       
    85         AF_ROUTE
       
    86     
       
    87     # base sockaddr stuff
       
    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
       
   189     ctypedef uint16_t in_port_t
       
   190 
       
   191     ## AF_INET
       
   192     ctypedef uint32_t in_addr_t
       
   193     struct in_addr :
       
   194         in_addr_t s_addr
       
   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
       
   216     struct sockaddr_in :
       
   217         sa_family_t     sin_family
       
   218         in_port_t       sin_port
       
   219         in_addr         sin_addr
       
   220 
       
   221     struct sockaddr_in6 :
       
   222         sa_family_t     sin6_family
       
   223         in_port_t       sin6_port
       
   224         uint32_t        sin6_flowinfo
       
   225         in6_addr        sin6_addr
       
   226         uint32_t        sin6_scope_id
       
   227 
       
   228     uint16_t htons(uint16_t)
       
   229     uint32_t htonl(uint32_t)
       
   230     uint16_t ntohs(uint16_t)
       
   231     uint32_t ntohl(uint32_t)
       
   232 
       
   233 cdef extern from "netdb.h" :
       
   234     ## getaddrinfo
       
   235     struct addrinfo :
       
   236         int         ai_flags
       
   237         int         ai_family
       
   238         int         ai_socktype
       
   239         int         ai_protocol
       
   240         int         ai_addrlen
       
   241         sockaddr   *ai_addr
       
   242         char       *ai_canonname
       
   243         addrinfo   *ai_next
       
   244     
       
   245     enum :
       
   246         AI_PASSIVE
       
   247         AI_CANONNAME
       
   248         AI_NUMERICHOST
       
   249         AI_V4MAPPED
       
   250         AI_ALL
       
   251         AI_ADDRCONFIG
       
   252         # AI_*IDN*
       
   253         AI_NUMERICSERV
       
   254 
       
   255     int c_getaddrinfo "getaddrinfo" (
       
   256             char *node, char *service, 
       
   257             addrinfo *hints, addrinfo **res
       
   258     )
       
   259 
       
   260     void c_freeaddrinfo "freeaddrinfo" (addrinfo *res)
       
   261 
       
   262     ## getnameinfo
       
   263     int c_getnameinfo "getnameinfo" (
       
   264             sockaddr *sa, socklen_t salen, 
       
   265             char *host, size_t hostlen, 
       
   266             char *serv, size_t servlen, 
       
   267             int flags
       
   268     )
       
   269 
       
   270     enum :
       
   271         NI_NOFQDN
       
   272         NI_NUMERICHOST
       
   273         NI_NAMEREQD
       
   274         NI_NUMERICSERV
       
   275         NI_DGRAM
       
   276 
       
   277         NI_MAXHOST
       
   278         NI_MAXSERV
       
   279 
       
   280     char* gai_strerror (int err)
       
   281 
       
   282 # python-friendly wrapper around inet_ntop
       
   283 cdef object inet_ntop (int af, void *sockaddr)
       
   284 cdef object inet_pton (int af, char *addr, void *sockaddr_out)
       
   285 
       
   286 # sockaddr, flags -> (host, service)
       
   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 #