diff -r 10bd48c9b6ce -r 74fde84264b1 qmsk/net/libc.pxd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qmsk/net/libc.pxd Sun Aug 16 19:01:21 2009 +0300 @@ -0,0 +1,315 @@ +""" + 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 + +# +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) + +# +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 +#