"""
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)