# HG changeset patch # User Tero Marttila # Date 1250381566 -10800 # Node ID 0ca9278146d762f24816c464f0d17f051fa825a1 # Parent 975801b28d85d92bcf9c05e952265d83fa303555 move pxd's to inc dir, split off sctp.pxd diff -r 975801b28d85 -r 0ca9278146d7 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Sun Aug 16 03:12:46 2009 +0300 @@ -0,0 +1,7 @@ +syntax: regexp + +\.sw[op]$ +\.pyc$ +\.so$ + +^build/ diff -r 975801b28d85 -r 0ca9278146d7 inc/addr.pxd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/addr.pxd Sun Aug 16 03:12:46 2009 +0300 @@ -0,0 +1,28 @@ +cimport libc + +cdef class sockaddr : + """ + A network-level socket address + + >>> sockaddr().family + 0 + >>> sockaddr().port + Traceback (most recent call last): + ... + NotImplementedError + >>> sockaddr().getnameinfo() + Traceback (most recent call last): + ... + NotImplementedError + """ + + # address family + # XXX: this should be a class constant! It's part of our type safety! + cdef readonly libc.sa_family_t family + + cdef void _init_family (self, libc.sa_family_t family=?) + + # get the sockaddr/socklen + # each of these can be NULL to ignore it + cdef int _get_sockaddr (self, libc.sockaddr **sa_ptr, libc.socklen_t *sa_len) except -1 + diff -r 975801b28d85 -r 0ca9278146d7 inc/libc.pxd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/libc.pxd Sun Aug 16 03:12:46 2009 +0300 @@ -0,0 +1,131 @@ +""" + 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 "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 "alloca.h" : + void* alloca (size_t size) + +# +cdef extern from "sys/socket.h" : + enum : + SOCK_STREAM + SOCK_DGRAM + SOCK_SEQPACKET + + enum : + PF_UNSPEC + PF_LOCAL + PF_INET + PF_INET6 + + # these are #defines + enum : + PF_UNIX + + AF_UNSPEC + AF_LOCAL + AF_UNIX + AF_INET + AF_INET6 + + ctypedef uint16_t sa_family_t + ctypedef uint16_t in_port_t + ctypedef uint32_t in_addr_t + + ## AF_INET + struct in_addr : + in_addr_t s_addr + + struct sockaddr_in : + sa_family_t sin_family + in_port_t sin_port + in_addr sin_addr + + # XXX: should these be in another cdef? + in_addr_t INADDR_ANY + + ## AF_INET6 + struct in6_addr : + pass + + 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 + + # common in6_addr's + in6_addr in6addr_any + in6_addr in6addr_loopback + + ## actually from bits/socket.h... + struct sockaddr : + sa_family_t sa_family + + struct sockaddr_storage : + sa_family_t ss_family + +cdef extern from "arpa/inet.h" : + uint16_t htons(uint16_t) + uint32_t htonl(uint32_t) + uint16_t ntohs(uint16_t) + uint32_t ntohl(uint32_t) + + # XXX: correct?! + ctypedef size_t socklen_t + + ## constants + enum : + INET_ADDRSTRLEN + INET6_ADDRSTRLEN + + 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 "netdb.h" : + 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) diff -r 975801b28d85 -r 0ca9278146d7 inc/sctp.pxd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/sctp.pxd Sun Aug 16 03:12:46 2009 +0300 @@ -0,0 +1,201 @@ +cimport libc + +from libc cimport __u8, __u16, __u32, __s8, __s16, __s32 + +# +# this defines the kernel SCTP -> userspace API extensions, such as structure types etc. +cdef extern from "netinet/sctp.h" : + ## types + ctypedef __s32 sctp_assoc_t + + ## constants + # sockapi + int SOL_SCTP + int IPPROTO_SCTP + + # sockopts + int SCTP_RTOINFO + int SCTP_ASSOCINFO + int SCTP_INITMSG + int SCTP_NODELAY + int SCTP_AUTOCLOSE + int SCTP_SET_PEER_PRIMARY_ADDR + int SCTP_PRIMARY_ADDR + int SCTP_ADAPTATION_LAYER + int SCTP_DISABLE_FRAGMENTS + int SCTP_PEER_ADDR_PARAMS + int SCTP_DEFAULT_SEND_PARAM + int SCTP_EVENTS + int SCTP_I_WANT_MAPPED_V4_ADDR + int SCTP_MAXSEG + int SCTP_STATUS + int SCTP_GET_PEER_ADDR_INFO + int SCTP_DELAYED_ACK_TIME + int SCTP_CONTEXT + int SCTP_FRAGMENT_INTERLEAVE + int SCTP_PARTIAL_DELIVERY_POINT + int SCTP_MAX_BURST + + ## send/recv-msg cmsghdr's + struct sctp_initmsg : + __u16 sinit_num_ostreams + __u16 sinit_max_instreams + __u16 sinit_max_attempts + __u16 sinit_max_init_timeo + + struct sctp_sndrcvinfo : + __u16 sinfo_stream + __u16 sinfo_ssn + __u16 sinfo_flags + __u32 sinfo_ppid + __u32 sinfo_context + __u32 sinfo_timetolive + __u32 sinfo_tsn + __u32 sinfo_cumtsn + sctp_assoc_t sinfo_assoc_id + + # sctp_sndrcvinfo.sinfo_flags values + enum sctp_sinfo_flags : + SCTP_UNORDERED # Send/receive message unordered + SCTP_ADDR_OVER # Override the primary destination + SCTP_ABORT # Send an ABORT message to the peer + SCTP_EOF # Initiate graceful shutdown process + + ## notifications + struct sctp_assoc_change : + __u16 sac_type + __u16 sac_flags + __u32 sac_length + __u16 sac_state + __u16 sac_error + __u16 sac_outbound_streams + __u16 sac_inbound_streams + sctp_assoc_t sac_assoc_id + __u8 sac_info[0] + + # sctp_assoc_change.sac_state + enum sctp_sac_state : + SCTP_COMM_UP + SCTP_COMM_LOST + SCTP_RESTART + SCTP_SHUTDOWN_COMP + SCTP_CANT_STR_ASSOC + + struct sctp_paddr_change : + __u16 spc_type + __u16 spc_flags + __u32 spc_length + libc.sockaddr_storage spc_aaddr + int spc_state + int spc_error + sctp_assoc_t spc_assoc_id + + enum sctp_spc_state : + SCTP_ADDR_AVAILABLE + SCTP_ADDR_UNREACHABLE + SCTP_ADDR_REMOVED + SCTP_ADDR_ADDED + SCTP_ADDR_MADE_PRIM + SCTP_ADDR_CONFIRMED + + struct sctp_remote_error : + __u16 sre_type + __u16 sre_flags + __u32 sre_length + __u16 sre_error + sctp_assoc_t sre_assoc_id + __u8 sre_data[0] + + + struct sctp_send_failed : + __u16 ssf_type + __u16 ssf_flags + __u32 ssf_length + __u32 ssf_error + sctp_sndrcvinfo ssf_info + sctp_assoc_t ssf_assoc_id + __u8 ssf_data[0] + + enum sctp_ssf_flags : + SCTP_DATA_UNSENT + SCTP_DATA_SENT + + struct sctp_shutdown_event : + __u16 sse_type + __u16 sse_flags + __u32 sse_length + sctp_assoc_t sse_assoc_id + + struct sctp_adaptation_event : + __u16 sai_type + __u16 sai_flags + __u32 sai_length + __u32 sai_adaptation_ind + sctp_assoc_t sai_assoc_id + + struct sctp_pdapi_event : + __u16 pdapi_type + __u16 pdapi_flags + __u32 pdapi_length + __u32 pdapi_indication + sctp_assoc_t pdapi_assoc_id + + enum : + SCTP_PARTIAL_DELIVERY_ABORTED + + struct sctp_event_subscribe : + __u8 sctp_data_io_event + __u8 sctp_association_event + __u8 sctp_address_event + __u8 sctp_send_failure_event + __u8 sctp_peer_error_event + __u8 sctp_shutdown_event + __u8 sctp_partial_delivery_event + __u8 sctp_adaptation_layer_event + + struct sn_header : + __u16 sn_type + __u16 sn_flags + __u32 sn_length + + union sctp_notification : + sn_header sn_header + + sctp_assoc_change sn_assoc_change + sctp_paddr_change sn_paddr_change + sctp_remote_error sn_remote_error + sctp_send_failed sn_send_failed + sctp_shutdown_event sn_shutdown_event + sctp_adaptation_event sn_adaptation_event + sctp_pdapi_event sn_pdapi_event + + enum sctp_sn_type : + SCTP_SN_TYPE_BASE + SCTP_ASSOC_CHANGE + SCTP_PEER_ADDR_CHANGE + SCTP_SEND_FAILED + SCTP_REMOTE_ERROR + SCTP_SHUTDOWN_EVENT + SCTP_PARTIAL_DELIVERY_EVENT + SCTP_ADAPTATION_INDICATION + + enum sctp_sn_error : + SCTP_FAILED_THRESHOLD + SCTP_RECEIVED_SACK + SCTP_HEARTBEAT_SUCCESS + SCTP_RESPONSE_TO_USER_REQ + SCTP_INTERNAL_ERROR + SCTP_SHUTDOWN_GUARD_EXPIRES + SCTP_PEER_FAULTY + + ctypedef sctp_sn_error sctp_sn_error_t + + + ## sctp_bindx + int SCTP_BINDX_ADD_ADDR + int SCTP_BINDX_REM_ADDR + + int sctp_bindx (int sd, libc.sockaddr *addrs, int addrcnt, int flags) + int sctp_connectx (int sd, libc.sockaddr *addrs, int addrcnt) + + diff -r 975801b28d85 -r 0ca9278146d7 libc.pxd --- a/libc.pxd Sun Aug 16 02:58:32 2009 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -""" - 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 "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 "alloca.h" : - void* alloca (size_t size) - -# -cdef extern from "sys/socket.h" : - enum : - SOCK_STREAM - SOCK_DGRAM - SOCK_SEQPACKET - - enum : - PF_UNSPEC - PF_LOCAL - PF_INET - PF_INET6 - - # these are #defines - enum : - PF_UNIX - - AF_UNSPEC - AF_LOCAL - AF_UNIX - AF_INET - AF_INET6 - - ctypedef uint16_t sa_family_t - ctypedef uint16_t in_port_t - ctypedef uint32_t in_addr_t - - ## AF_INET - struct in_addr : - in_addr_t s_addr - - struct sockaddr_in : - sa_family_t sin_family - in_port_t sin_port - in_addr sin_addr - - # XXX: should these be in another cdef? - in_addr_t INADDR_ANY - - ## AF_INET6 - struct in6_addr : - pass - - 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 - - # common in6_addr's - in6_addr in6addr_any - in6_addr in6addr_loopback - - ## actually from bits/socket.h... - struct sockaddr : - sa_family_t sa_family - - struct sockaddr_storage : - sa_family_t ss_family - -cdef extern from "arpa/inet.h" : - uint16_t htons(uint16_t) - uint32_t htonl(uint32_t) - uint16_t ntohs(uint16_t) - uint32_t ntohl(uint32_t) - - # XXX: correct?! - ctypedef size_t socklen_t - - ## constants - enum : - INET_ADDRSTRLEN - INET6_ADDRSTRLEN - - 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 "netdb.h" : - 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) diff -r 975801b28d85 -r 0ca9278146d7 sctp/sock.pyx --- a/sctp/sock.pyx Sun Aug 16 02:58:32 2009 +0300 +++ b/sctp/sock.pyx Sun Aug 16 03:12:46 2009 +0300 @@ -2,204 +2,9 @@ This C(ython) extension module provides an interface to the libsctp library and associated socket API. """ -from libc cimport * - -# -# this defines the kernel SCTP -> userspace API extensions, such as structure types etc. -cdef extern from "netinet/sctp.h" : - ## types - ctypedef __s32 sctp_assoc_t - - ## constants - # sockapi - int SOL_SCTP - int IPPROTO_SCTP - - # sockopts - int SCTP_RTOINFO - int SCTP_ASSOCINFO - int SCTP_INITMSG - int SCTP_NODELAY - int SCTP_AUTOCLOSE - int SCTP_SET_PEER_PRIMARY_ADDR - int SCTP_PRIMARY_ADDR - int SCTP_ADAPTATION_LAYER - int SCTP_DISABLE_FRAGMENTS - int SCTP_PEER_ADDR_PARAMS - int SCTP_DEFAULT_SEND_PARAM - int SCTP_EVENTS - int SCTP_I_WANT_MAPPED_V4_ADDR - int SCTP_MAXSEG - int SCTP_STATUS - int SCTP_GET_PEER_ADDR_INFO - int SCTP_DELAYED_ACK_TIME - int SCTP_CONTEXT - int SCTP_FRAGMENT_INTERLEAVE - int SCTP_PARTIAL_DELIVERY_POINT - int SCTP_MAX_BURST - - ## send/recv-msg cmsghdr's - struct sctp_initmsg : - __u16 sinit_num_ostreams - __u16 sinit_max_instreams - __u16 sinit_max_attempts - __u16 sinit_max_init_timeo - - struct sctp_sndrcvinfo : - __u16 sinfo_stream - __u16 sinfo_ssn - __u16 sinfo_flags - __u32 sinfo_ppid - __u32 sinfo_context - __u32 sinfo_timetolive - __u32 sinfo_tsn - __u32 sinfo_cumtsn - sctp_assoc_t sinfo_assoc_id - - # sctp_sndrcvinfo.sinfo_flags values - enum sctp_sinfo_flags : - SCTP_UNORDERED # Send/receive message unordered - SCTP_ADDR_OVER # Override the primary destination - SCTP_ABORT # Send an ABORT message to the peer - SCTP_EOF # Initiate graceful shutdown process - - ## notifications - struct sctp_assoc_change : - __u16 sac_type - __u16 sac_flags - __u32 sac_length - __u16 sac_state - __u16 sac_error - __u16 sac_outbound_streams - __u16 sac_inbound_streams - sctp_assoc_t sac_assoc_id - __u8 sac_info[0] - - # sctp_assoc_change.sac_state - enum sctp_sac_state : - SCTP_COMM_UP - SCTP_COMM_LOST - SCTP_RESTART - SCTP_SHUTDOWN_COMP - SCTP_CANT_STR_ASSOC - - struct sctp_paddr_change : - __u16 spc_type - __u16 spc_flags - __u32 spc_length - sockaddr_storage spc_aaddr - int spc_state - int spc_error - sctp_assoc_t spc_assoc_id - - enum sctp_spc_state : - SCTP_ADDR_AVAILABLE - SCTP_ADDR_UNREACHABLE - SCTP_ADDR_REMOVED - SCTP_ADDR_ADDED - SCTP_ADDR_MADE_PRIM - SCTP_ADDR_CONFIRMED +from sctp cimport * - struct sctp_remote_error : - __u16 sre_type - __u16 sre_flags - __u32 sre_length - __u16 sre_error - sctp_assoc_t sre_assoc_id - __u8 sre_data[0] - - - struct sctp_send_failed : - __u16 ssf_type - __u16 ssf_flags - __u32 ssf_length - __u32 ssf_error - sctp_sndrcvinfo ssf_info - sctp_assoc_t ssf_assoc_id - __u8 ssf_data[0] - - enum sctp_ssf_flags : - SCTP_DATA_UNSENT - SCTP_DATA_SENT - - struct sctp_shutdown_event : - __u16 sse_type - __u16 sse_flags - __u32 sse_length - sctp_assoc_t sse_assoc_id - - struct sctp_adaptation_event : - __u16 sai_type - __u16 sai_flags - __u32 sai_length - __u32 sai_adaptation_ind - sctp_assoc_t sai_assoc_id - - struct sctp_pdapi_event : - __u16 pdapi_type - __u16 pdapi_flags - __u32 pdapi_length - __u32 pdapi_indication - sctp_assoc_t pdapi_assoc_id - - enum : - SCTP_PARTIAL_DELIVERY_ABORTED - - struct sctp_event_subscribe : - __u8 sctp_data_io_event - __u8 sctp_association_event - __u8 sctp_address_event - __u8 sctp_send_failure_event - __u8 sctp_peer_error_event - __u8 sctp_shutdown_event - __u8 sctp_partial_delivery_event - __u8 sctp_adaptation_layer_event - - struct sn_header : - __u16 sn_type - __u16 sn_flags - __u32 sn_length - - union sctp_notification : - sn_header sn_header - - sctp_assoc_change sn_assoc_change - sctp_paddr_change sn_paddr_change - sctp_remote_error sn_remote_error - sctp_send_failed sn_send_failed - sctp_shutdown_event sn_shutdown_event - sctp_adaptation_event sn_adaptation_event - sctp_pdapi_event sn_pdapi_event - - enum sctp_sn_type : - SCTP_SN_TYPE_BASE - SCTP_ASSOC_CHANGE - SCTP_PEER_ADDR_CHANGE - SCTP_SEND_FAILED - SCTP_REMOTE_ERROR - SCTP_SHUTDOWN_EVENT - SCTP_PARTIAL_DELIVERY_EVENT - SCTP_ADAPTATION_INDICATION - - enum sctp_sn_error : - SCTP_FAILED_THRESHOLD - SCTP_RECEIVED_SACK - SCTP_HEARTBEAT_SUCCESS - SCTP_RESPONSE_TO_USER_REQ - SCTP_INTERNAL_ERROR - SCTP_SHUTDOWN_GUARD_EXPIRES - SCTP_PEER_FAULTY - - ctypedef sctp_sn_error sctp_sn_error_t - - - ## sctp_bindx - int SCTP_BINDX_ADD_ADDR - int SCTP_BINDX_REM_ADDR - - int sctp_bindx (int sd, sockaddr *addrs, int addrcnt, int flags) - int sctp_connectx (int sd, sockaddr *addrs, int addrcnt) - +cimport libc def bindx (int sd, object addrs, int flags) : """ @@ -211,26 +16,28 @@ """ # automatically allocated array of sockaddr_storage's for passing given addresses to sctp_bindx - cdef sockaddr_storage *addrs_out + cdef libc.sockaddr_storage *addrs_out # used to iterate through addrs_out - cdef sockaddr_in *addr_in + cdef libc.sockaddr_in *addr_in # number of addresses given cdef size_t addr_count = len(addrs) # alloc stack storage for converting addresses - addrs_out = alloca(addr_count * sizeof(sockaddr_storage)) + addrs_out = libc.alloca(addr_count * sizeof(libc.sockaddr_storage)) for i, address in enumerate(addrs) : # XXX: assume socket-style IPv4 for now... addr, port = address - addr_in = (&addrs_out[i]) + addr_in = (&addrs_out[i]) - addr_in.sin_family = AF_INET - addr_in.sin_port = htons(port) - inet_aton(addr, &addr_in.sin_addr) + addr_in.sin_family = libc.AF_INET + addr_in.sin_port = libc.htons(port) + + # XXX: known broken + libc.inet_aton(addr, &addr_in.sin_addr) - return sctp_bindx(sd, addrs_out, addr_count, flags) + return sctp_bindx(sd, addrs_out, addr_count, flags) diff -r 975801b28d85 -r 0ca9278146d7 setup.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/setup.py Sun Aug 16 03:12:46 2009 +0300 @@ -0,0 +1,16 @@ +from distutils.core import setup +from distutils.extension import Extension +from Cython.Distutils import build_ext + +def cython_ext (name, files, **opts) : + return Extension(name, files, include_dirs=['inc'], **opts) + +setup( + cmdclass = {'build_ext': build_ext}, + ext_modules = [ + cython_ext("libc", ["libc.pyx"]), + cython_ext("sock.addr", ["sock/addr.pyx"]), + cython_ext("sctp.sock", ["sctp/sock.pyx"], libraries=['sctp']), + ] +) + diff -r 975801b28d85 -r 0ca9278146d7 sock/addr.pyx --- a/sock/addr.pyx Sun Aug 16 02:58:32 2009 +0300 +++ b/sock/addr.pyx Sun Aug 16 03:12:46 2009 +0300 @@ -4,25 +4,9 @@ cimport libc -cdef class sockaddr : - """ - A network-level socket address +from addr cimport * - >>> sockaddr().family - 0 - >>> sockaddr().port - Traceback (most recent call last): - ... - NotImplementedError - >>> sockaddr().getnameinfo() - Traceback (most recent call last): - ... - NotImplementedError - """ - - # address family - cdef readonly libc.sa_family_t family - +cdef class sockaddr : cdef void _init_family (self, libc.sa_family_t family=libc.AF_UNSPEC) : self.family = family