move pxd's to inc dir, split off sctp.pxd
authorTero Marttila <terom@fixme.fi>
Sun, 16 Aug 2009 03:12:46 +0300
changeset 1 0ca9278146d7
parent 0 975801b28d85
child 2 171e77f8d675
move pxd's to inc dir, split off sctp.pxd
.hgignore
inc/addr.pxd
inc/libc.pxd
inc/sctp.pxd
libc.pxd
sctp/sock.pyx
setup.py
sock/addr.pyx
--- /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/
--- /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
+
--- /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
+
+# <linux/types.h>
+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)
+
+# <sys/socket.h>
+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)
--- /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
+
+# <netinet/sctp.h>
+# 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)
+
+
--- 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
-
-# <linux/types.h>
-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)
-
-# <sys/socket.h>
-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)
--- 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 *
-
-# <netinet/sctp.h>
-# 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 = <sockaddr_storage *> alloca(addr_count * sizeof(sockaddr_storage))
+    addrs_out = <libc.sockaddr_storage *> 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 = <sockaddr_in *>(&addrs_out[i])
+        addr_in = <libc.sockaddr_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, <sockaddr *>addrs_out, addr_count, flags)
+    return sctp_bindx(sd, <libc.sockaddr *>addrs_out, addr_count, flags)
 
--- /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']),
+    ]
+)
+
--- 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