--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/qmsk.net.socket.platform.pxd Sun Aug 16 20:18:39 2009 +0300
@@ -0,0 +1,1 @@
+../qmsk/net/socket/platform.pxd
\ No newline at end of file
--- a/qmsk/net/libc.pxd Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/libc.pxd Sun Aug 16 20:18:39 2009 +0300
@@ -43,249 +43,6 @@
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)
-
-# <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
-
- # 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) :
# """
--- a/qmsk/net/libc.pyx Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/libc.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -1,46 +1,6 @@
from libc cimport *
from py cimport raise_errno
-cdef object inet_ntop (int af, void *sockaddr) :
- """
- Wrapper around inet_ntop, returning a PyString
- """
-
- # XXX: longest possible address...
- cdef char buf[INET6_ADDRSTRLEN]
-
- if c_inet_ntop(af, sockaddr, buf, sizeof(buf)) == NULL :
- raise_errno('inet_ntop')
-
- # autoconvert -> str
- return buf
-
-cdef object inet_pton (int af, char *addr, void *sockaddr_out) :
- cdef int ret
-
- ret = c_inet_pton(af, addr, sockaddr_out)
-
- if ret < 0 :
- raise_errno('inet_pton')
-
- elif ret == 0 :
- raise NameError("Invalid network address for specified address family: %r" % (addr, ))
-
-cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) :
- cdef char hostbuf[NI_MAXHOST]
- cdef char servbuf[NI_MAXSERV]
- cdef int err
-
- err = c_getnameinfo(sa, salen, hostbuf, sizeof(hostbuf), servbuf, sizeof(servbuf), flags)
-
- if err :
- # XXX: raise a GAIError
- raise Exception(gai_strerror(err))
-# raise GAIError('getnameinfo', err)
-
- else :
- return hostbuf, servbuf
-
#cdef class Errno (py.OSError) :
# def __init__ (self, func) :
# self.func = func
--- a/qmsk/net/sctp/constants.pyx Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/sctp/constants.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -1,4 +1,4 @@
-cimport sctp.sock as sctp
+cimport qmsk.net.sctp.sock as sctp
SOL_SCTP = sctp.SOL_SCTP
IPPROTO_SCTP = sctp.IPPROTO_SCTP
--- a/qmsk/net/sctp/sock.pxd Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/sctp/sock.pxd Sun Aug 16 20:18:39 2009 +0300
@@ -2,6 +2,8 @@
from libc cimport __u8, __u16, __u32, __s8, __s16, __s32
+cimport qmsk.net.socket.platform as platform
+
# <netinet/sctp.h>
# this defines the kernel SCTP -> userspace API extensions, such as structure types etc.
cdef extern from "netinet/sctp.h" :
@@ -87,7 +89,7 @@
__u16 spc_type
__u16 spc_flags
__u32 spc_length
- libc.sockaddr_storage spc_aaddr
+ platform.sockaddr_storage spc_aaddr
int spc_state
int spc_error
sctp_assoc_t spc_assoc_id
@@ -198,9 +200,9 @@
SCTP_BINDX_ADD_ADDR
SCTP_BINDX_REM_ADDR
- int c_sctp_bindx "sctp_bindx" (int sd, libc.sockaddr *addrs, int addrcnt, int flags)
+ int c_sctp_bindx "sctp_bindx" (int sd, platform.sockaddr *addrs, int addrcnt, int flags)
# XXX: missing return-sctp_assoc_t-id argument!
- int c_sctp_connectx "sctp_connectx" (int sd, libc.sockaddr *addrs, int addrcnt)
+ int c_sctp_connectx "sctp_connectx" (int sd, platform.sockaddr *addrs, int addrcnt)
--- a/qmsk/net/sctp/sock.pyx Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/sctp/sock.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -11,6 +11,7 @@
from qmsk.net.sctp.sock cimport *
from qmsk.net.socket.addr cimport sockaddr
+from qmsk.net.socket cimport platform
cimport libc
from py cimport raise_errno
@@ -38,8 +39,8 @@
cdef char *addr_ptr = addr_buf
# fill it
- cdef libc.sockaddr *sa
- cdef libc.socklen_t sa_len
+ cdef platform.sockaddr *sa
+ cdef platform.socklen_t sa_len
for addr in addrs :
# get address's sockaddr info
@@ -71,7 +72,7 @@
addrsoup_store(addrs, addr_buf)
# then call
- if c_sctp_bindx(sd, <libc.sockaddr *> addr_buf, len(addrs), flags) < 0 :
+ if c_sctp_bindx(sd, <platform.sockaddr *> addr_buf, len(addrs), flags) < 0 :
raise_errno('sctp_bindx')
def sctp_connectx (int sd, object addrs) :
@@ -93,6 +94,6 @@
addrsoup_store(addrs, addr_buf)
# then call
- if c_sctp_connectx(sd, <libc.sockaddr *> addr_buf, len(addrs)) < 0 :
+ if c_sctp_connectx(sd, <platform.sockaddr *> addr_buf, len(addrs)) < 0 :
raise_errno('sctp_connectx')
--- a/qmsk/net/socket/__init__.py Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/socket/__init__.py Sun Aug 16 20:18:39 2009 +0300
@@ -0,0 +1,6 @@
+# combine all the modules
+#from qmsk.net.socket.addr import *
+#from qmsk.net.socket.socket import *
+#from qmsk.net.socket.platform import *
+#from qmsk.net.socket.constants import *
+
--- a/qmsk/net/socket/addr.pxd Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/socket/addr.pxd Sun Aug 16 20:18:39 2009 +0300
@@ -8,6 +8,8 @@
cimport libc
+cimport qmsk.net.socket.platform as platform
+
cdef class sockaddr :
"""
A network-level socket address
@@ -28,22 +30,22 @@
# address family
# XXX: this should be a class constant! It's part of our type safety!
- cdef readonly libc.sa_family_t family
+ cdef readonly platform.sa_family_t family
- cdef void _init_family (self, libc.sa_family_t family = ?)
+ cdef void _init_family (self, platform.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
+ cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1
- cdef libc.sockaddr* _get_sockaddr_ptr (self) except NULL
- cdef libc.socklen_t _get_sockaddr_len (self) except -1
+ cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL
+ cdef platform.socklen_t _get_sockaddr_len (self) except -1
# set the sockaddr, socklen must match
- cdef int _set_sockaddr (self, libc.sockaddr *sa, size_t sa_len) except -1
+ cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1
# build a sockaddr from the given sockaddr struct, based on sa_family
-cdef sockaddr build_sockaddr (libc.sockaddr *sa, size_t sa_len)
+cdef sockaddr build_sockaddr (platform.sockaddr *sa, size_t sa_len)
cdef class addrinfo :
"""
@@ -55,10 +57,10 @@
cdef readonly sockaddr addr
cdef readonly object canonname
- cdef _init_addrinfo (self, libc.addrinfo *c_ai)
+ cdef _init_addrinfo (self, platform.addrinfo *c_ai)
# build and return a new addrinfo instance
-cdef addrinfo build_addrinfo (libc.addrinfo *c_ai)
+cdef addrinfo build_addrinfo (platform.addrinfo *c_ai)
cdef class endpoint :
"""
--- a/qmsk/net/socket/addr.pyx Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/socket/addr.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -1,44 +1,46 @@
cimport libc
-from addr cimport *
+from qmsk.net.socket.addr cimport *
+
+cimport qmsk.net.socket.platform as platform
cdef class sockaddr :
- cdef void _init_family (self, libc.sa_family_t family=libc.AF_UNSPEC) :
+ cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) :
self.family = family
# XXX:use size_t
- cdef int _get_sockaddr (self, libc.sockaddr **sa_ptr, libc.socklen_t *sa_len) except -1 :
+ cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
"""
Get the sockaddr pointer and sockaddr length for this address
"""
raise NotImplementedError()
- cdef libc.sockaddr* _get_sockaddr_ptr (self) except NULL :
+ cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL :
"""
Get the sockaddr pointer
"""
- cdef libc.sockaddr *sa
- cdef libc.socklen_t sa_len
+ cdef platform.sockaddr *sa
+ cdef platform.socklen_t sa_len
self._get_sockaddr(&sa, &sa_len)
return sa
- cdef libc.socklen_t _get_sockaddr_len (self) except -1 :
+ cdef platform.socklen_t _get_sockaddr_len (self) except -1 :
"""
Get the sockaddr len
"""
- cdef libc.sockaddr *sa
- cdef libc.socklen_t sa_len
+ cdef platform.sockaddr *sa
+ cdef platform.socklen_t sa_len
self._get_sockaddr(&sa, &sa_len)
return sa_len
- cdef int _set_sockaddr (self, libc.sockaddr *sa, size_t sa_len) except -1 :
+ cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
"""
Set the sockaddr value for this address; sa_len must match!
"""
@@ -50,17 +52,17 @@
Returns a (host, serv) tuple for this address à la getnameinfo
"""
- cdef libc.sockaddr *sa
- cdef libc.socklen_t sa_len
+ cdef platform.sockaddr *sa
+ cdef platform.socklen_t sa_len
# XXX: take as args?
- cdef int flags = libc.NI_NUMERICHOST | libc.NI_NUMERICSERV
+ cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV
# get our abstract sockaddr
self._get_sockaddr(&sa, &sa_len)
# get nice text format
- return libc.getnameinfo(sa, sa_len, flags)
+ return platform.getnameinfo(sa, sa_len, flags)
property addr :
"""
@@ -106,9 +108,9 @@
"""
# the struct sockaddr_in
- cdef libc.sockaddr_in sockaddr
+ cdef platform.sockaddr_in sockaddr
- def __init__ (self, object addr=None, libc.in_port_t port=0) :
+ def __init__ (self, object addr=None, platform.in_port_t port=0) :
"""
Construct using given literal IPv4 address and TCP/UDP port
@@ -118,33 +120,33 @@
# store our family
# XXX: this should be a class attribute...
- self._init_family(libc.AF_INET)
+ self._init_family(platform.AF_INET)
# constant af
self.sockaddr.sin_family = self.family
# set the sin_port
- self.sockaddr.sin_port = libc.htons(port)
+ self.sockaddr.sin_port = platform.htons(port)
if addr :
# set the sin_addr
# this automatically converts the addr from str -> char *
- libc.inet_pton(self.family, addr, &self.sockaddr.sin_addr)
+ platform.inet_pton(self.family, addr, &self.sockaddr.sin_addr)
else :
# set as INADDR_ANY
- self.sockaddr.sin_addr.s_addr = libc.INADDR_ANY
+ self.sockaddr.sin_addr.s_addr = platform.INADDR_ANY
- cdef int _get_sockaddr (self, libc.sockaddr **sa_ptr, libc.socklen_t *sa_len) except -1 :
+ cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
if sa_ptr :
- sa_ptr[0] = <libc.sockaddr *> &self.sockaddr
+ sa_ptr[0] = <platform.sockaddr *> &self.sockaddr
if sa_len :
sa_len[0] = sizeof(self.sockaddr)
return 0
- cdef int _set_sockaddr (self, libc.sockaddr *sa, size_t sa_len) except -1 :
+ cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
assert sa_len == sizeof(self.sockaddr)
libc.memcpy(&self.sockaddr, sa, sa_len)
@@ -155,7 +157,7 @@
"""
def __get__ (self) :
- return libc.ntohs(self.sockaddr.sin_port)
+ return platform.ntohs(self.sockaddr.sin_port)
def __str__ (self) :
"""
@@ -180,45 +182,45 @@
'[::]:0'
"""
- cdef libc.sockaddr_in6 sockaddr
+ cdef platform.sockaddr_in6 sockaddr
- def __init__ (self, object addr=None, libc.in_port_t port=0) :
+ def __init__ (self, object addr=None, platform.in_port_t port=0) :
"""
Construct using given literal IPv6 address and TCP/UDP port
- addr - IPv6 address, defaults to in6addr_any (::)
+ addr - IPv6 address, defaults to platform.in6addr_any (::)
port - TCP/UDP port, defaults to 0 (ephemeral)
"""
# store our family
# XXX: this should be a class attribute...
- self._init_family(libc.AF_INET6)
+ self._init_family(platform.AF_INET6)
# constant af
self.sockaddr.sin6_family = self.family
# set the sin_port
- self.sockaddr.sin6_port = libc.htons(port)
+ self.sockaddr.sin6_port = platform.htons(port)
if addr :
# set the sin_addr
# this automatically converts the addr from str -> char *
- libc.inet_pton(self.family, addr, &self.sockaddr.sin6_addr)
+ platform.inet_pton(self.family, addr, &self.sockaddr.sin6_addr)
else :
# set as INADDR_ANY
- self.sockaddr.sin6_addr = libc.in6addr_any
+ self.sockaddr.sin6_addr = platform.in6addr_any
- cdef int _get_sockaddr (self, libc.sockaddr **sa_ptr, libc.socklen_t *sa_len) except -1 :
+ cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 :
if sa_ptr :
- sa_ptr[0] = <libc.sockaddr *> &self.sockaddr
+ sa_ptr[0] = <platform.sockaddr *> &self.sockaddr
if sa_len :
sa_len[0] = sizeof(self.sockaddr)
return 0
- cdef int _set_sockaddr (self, libc.sockaddr *sa, size_t sa_len) except -1 :
+ cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 :
assert sa_len == sizeof(self.sockaddr)
libc.memcpy(&self.sockaddr, sa, sa_len)
@@ -229,7 +231,7 @@
"""
def __get__ (self) :
- return libc.ntohs(self.sockaddr.sin6_port)
+ return platform.ntohs(self.sockaddr.sin6_port)
def __str__ (self) :
@@ -242,12 +244,12 @@
# mapping of AF -> sockaddr, user-modifyable
SOCKADDR_BY_FAMILY = {
- libc.AF_INET: sockaddr_in,
- libc.AF_INET6: sockaddr_in6,
+ platform.AF_INET: sockaddr_in,
+ platform.AF_INET6: sockaddr_in6,
}
# build a sockaddr from the given sockaddr struct, based on sa_family
-cdef sockaddr build_sockaddr (libc.sockaddr *sa, size_t sa_len) :
+cdef sockaddr build_sockaddr (platform.sockaddr *sa, size_t sa_len) :
# lookup correct class to use
addr_type = SOCKADDR_BY_FAMILY[sa.sa_family]
@@ -261,7 +263,7 @@
cdef class addrinfo :
- cdef _init_addrinfo (self, libc.addrinfo *ai) :
+ cdef _init_addrinfo (self, platform.addrinfo *ai) :
#ai.flags = c_ai.ai_flags
self.family = ai.ai_family
self.socktype = ai.ai_socktype
@@ -272,7 +274,7 @@
def __str__ (self) :
return "family=%d, socktype=%d, protocol=%d, addr=%s, canonname=%s" % (self.family, self.socktype, self.protocol, self.addr, self.canonname)
-cdef addrinfo build_addrinfo (libc.addrinfo *c_ai) :
+cdef addrinfo build_addrinfo (platform.addrinfo *c_ai) :
cdef addrinfo ai = addrinfo()
ai._init_addrinfo(c_ai)
@@ -295,13 +297,13 @@
self.hostname = str(hostname)
self.service = str(service)
- cpdef getaddrinfo (self, int family, int socktype, int protocol = 0, int flags = libc.AI_PASSIVE) :
+ cpdef getaddrinfo (self, int family, int socktype, int protocol = 0, int flags = platform.AI_PASSIVE) :
"""
Look up our hostname/service using the given socket parameters, and return a sequence of addrinfo objects.
"""
# XXX: Cython doesn't support proper compound value literals...
- cdef libc.addrinfo hints
+ cdef platform.addrinfo hints
libc.memset(&hints, 0, sizeof(hints))
hints.ai_flags = flags
@@ -309,7 +311,7 @@
hints.ai_socktype = socktype
hints.ai_protocol = protocol
- cdef libc.addrinfo *res, *r
+ cdef platform.addrinfo *res, *r
cdef int err
cdef object ret = []
@@ -323,12 +325,12 @@
service = self.service
# operate!
- err = libc.c_getaddrinfo(hostname, service, &hints, &res)
+ err = platform.c_getaddrinfo(hostname, service, &hints, &res)
try :
if err :
# XXX: raise a GAIError
- raise Exception(libc.gai_strerror(err))
+ raise Exception(platform.gai_strerror(err))
# gather results
r = res
@@ -342,7 +344,7 @@
return ret
finally :
- libc.c_freeaddrinfo(res)
+ platform.c_freeaddrinfo(res)
def __str__ (self) :
return "hostname=%s, service=%s" % (self.hostname, self.service)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk/net/socket/constants.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -0,0 +1,84 @@
+cimport qmsk.net.socket.platform as platform
+
+SOCK_STREAM = platform.SOCK_STREAM
+SOCK_DGRAM = platform.SOCK_DGRAM
+SOCK_RAW = platform.SOCK_RAW
+SOCK_RDM = platform.SOCK_RDM
+SOCK_SEQPACKET = platform.SOCK_SEQPACKET
+SOCK_PACKET = platform.SOCK_PACKET
+
+PF_UNSPEC = platform.PF_UNSPEC
+PF_LOCAL = platform.PF_LOCAL
+PF_UNIX = platform.PF_UNIX # same as PF_LOCAL
+PF_FILE = platform.PF_FILE # same as PF_LOCAL
+PF_INET = platform.PF_INET
+PF_INET6 = platform.PF_INET6
+PF_NETLINK = platform.PF_NETLINK
+PF_ROUTE = platform.PF_ROUTE # same as PF_NETLINK
+
+AF_UNSPEC = platform.AF_UNSPEC
+AF_LOCAL = platform.AF_LOCAL
+AF_UNIX = platform.AF_UNIX
+AF_FILE = platform.AF_FILE
+AF_INET = platform.AF_INET
+AF_INET6 = platform.AF_INET6
+AF_NETLINK = platform.AF_NETLINK
+AF_ROUTE = platform.AF_ROUTE
+
+MSG_OOB = platform.MSG_OOB
+MSG_PEEK = platform.MSG_PEEK
+MSG_DONTROUTE = platform.MSG_DONTROUTE
+MSG_CTRUNC = platform.MSG_CTRUNC
+MSG_PROXY = platform.MSG_PROXY
+MSG_TRUNC = platform.MSG_TRUNC
+MSG_DONTWAIT = platform.MSG_DONTWAIT
+MSG_EOR = platform.MSG_EOR
+MSG_WAITALL = platform.MSG_WAITALL
+MSG_FIN = platform.MSG_FIN
+MSG_SYN = platform.MSG_SYN
+MSG_CONFIRM = platform.MSG_CONFIRM
+MSG_RST = platform.MSG_RST
+MSG_ERRQUEUE = platform.MSG_ERRQUEUE
+MSG_NOSIGNAL = platform.MSG_NOSIGNAL
+MSG_MORE = platform.MSG_MORE
+MSG_CMSG_CLOEXEC = platform.MSG_CMSG_CLOEXEC
+
+SCM_RIGHTS = platform.SCM_RIGHTS
+SCM_CREDENTIALS = platform.SCM_CREDENTIALS
+
+SHUT_RD = platform.SHUT_RD
+SHUT_WR = platform.SHUT_WR
+SHUT_RDWR = platform.SHUT_RDWR
+
+IPPROTO_IP = platform.IPPROTO_IP
+IPPROTO_ICMP = platform.IPPROTO_ICMP
+IPPROTO_IGMP = platform.IPPROTO_IGMP
+IPPROTO_TCP = platform.IPPROTO_TCP
+IPPROTO_UDP = platform.IPPROTO_UDP
+IPPROTO_IPV6 = platform.IPPROTO_IPV6
+IPPROTO_ICMPV6 = platform.IPPROTO_ICMPV6
+IPPROTO_SCTP = platform.IPPROTO_SCTP
+IPPROTO_RAW = platform.IPPROTO_RAW
+
+INET_ADDRSTRLEN = platform.INET_ADDRSTRLEN
+INET6_ADDRSTRLEN = platform.INET6_ADDRSTRLEN
+
+AI_PASSIVE = platform.AI_PASSIVE
+AI_CANONNAME = platform.AI_CANONNAME
+AI_NUMERICHOST = platform.AI_NUMERICHOST
+AI_V4MAPPED = platform.AI_V4MAPPED
+AI_ALL = platform.AI_ALL
+AI_ADDRCONFIG = platform.AI_ADDRCONFIG
+#AI_ = platform.AI_*IDN*
+AI_NUMERICSERV = platform.AI_NUMERICSERV
+
+NI_NOFQDN = platform.NI_NOFQDN
+NI_NUMERICHOST = platform.NI_NUMERICHOST
+NI_NAMEREQD = platform.NI_NAMEREQD
+NI_NUMERICSERV = platform.NI_NUMERICSERV
+NI_DGRAM = platform.NI_DGRAM
+
+NI_MAXHOST = platform.NI_MAXHOST
+NI_MAXSERV = platform.NI_MAXSERV
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk/net/socket/platform.pxd Sun Aug 16 20:18:39 2009 +0300
@@ -0,0 +1,250 @@
+"""
+ Platform definitions for... 64-bit linux. They're all the same, right?
+"""
+
+from 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
+
+ # 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)
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk/net/socket/platform.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -0,0 +1,46 @@
+
+from qmsk.net.socket.platform cimport *
+
+from py cimport raise_errno
+
+## function wrappers
+cdef object inet_ntop (int af, void *sockaddr) :
+ """
+ Wrapper around inet_ntop, returning a PyString
+ """
+
+ # XXX: longest possible address...
+ cdef char buf[INET6_ADDRSTRLEN]
+
+ if c_inet_ntop(af, sockaddr, buf, sizeof(buf)) == NULL :
+ raise_errno('inet_ntop')
+
+ # autoconvert -> str
+ return buf
+
+cdef object inet_pton (int af, char *addr, void *sockaddr_out) :
+ cdef int ret
+
+ ret = c_inet_pton(af, addr, sockaddr_out)
+
+ if ret < 0 :
+ raise_errno('inet_pton')
+
+ elif ret == 0 :
+ raise NameError("Invalid network address for specified address family: %r" % (addr, ))
+
+cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) :
+ cdef char hostbuf[NI_MAXHOST]
+ cdef char servbuf[NI_MAXSERV]
+ cdef int err
+
+ err = c_getnameinfo(sa, salen, hostbuf, sizeof(hostbuf), servbuf, sizeof(servbuf), flags)
+
+ if err :
+ # XXX: raise a GAIError
+ raise Exception(gai_strerror(err))
+# raise GAIError('getnameinfo', err)
+
+ else :
+ return hostbuf, servbuf
+
--- a/qmsk/net/socket/socket.pyx Sun Aug 16 19:22:02 2009 +0300
+++ b/qmsk/net/socket/socket.pyx Sun Aug 16 20:18:39 2009 +0300
@@ -1,11 +1,11 @@
from qmsk.net.socket.socket cimport *
from qmsk.net.socket.addr cimport sockaddr, build_sockaddr
+cimport qmsk.net.socket.platform as platform
cimport libc, py
from py cimport raise_errno
-
# XXX: do some GIL-releasin'
cdef class socket :
@@ -16,7 +16,7 @@
self.fd = fd
- def socket (self, int family = libc.AF_INET, int socktype = libc.SOCK_STREAM, int protocol = 0) :
+ def socket (self, int family = platform.AF_INET, int socktype = platform.SOCK_STREAM, int protocol = 0) :
"""
Create a new socket endpoint with the given family/domain, socktype and optionally, specific protocol.
@@ -29,7 +29,7 @@
raise Exception("Socket fd already exists")
# socket()
- self.fd = libc.socket(family, socktype, protocol)
+ self.fd = platform.socket(family, socktype, protocol)
# trap
if self.fd < 0 :
@@ -44,14 +44,14 @@
ephemeral port.
"""
- cdef libc.sockaddr *sa_ptr
- cdef libc.socklen_t sa_len
+ cdef platform.sockaddr *sa_ptr
+ cdef platform.socklen_t sa_len
# get the address
addr._get_sockaddr(&sa_ptr, &sa_len)
# bind()
- if libc.bind(self.fd, sa_ptr, sa_len) :
+ if platform.bind(self.fd, sa_ptr, sa_len) :
raise_errno('bind')
def listen (self, int backlog) :
@@ -65,7 +65,7 @@
"""
# listen()
- if libc.listen(self.fd, backlog) :
+ if platform.listen(self.fd, backlog) :
raise_errno('listen')
def connect (self, sockaddr addr) :
@@ -81,14 +81,14 @@
addr - the remote address to connect to.
"""
- cdef libc.sockaddr *sa_ptr
- cdef libc.socklen_t sa_len
+ cdef platform.sockaddr *sa_ptr
+ cdef platform.socklen_t sa_len
# get the address
addr._get_sockaddr(&sa_ptr, &sa_len)
# connect()
- if libc.connect(self.fd, sa_ptr, sa_len) :
+ if platform.connect(self.fd, sa_ptr, sa_len) :
raise_errno('connect')
def accept (self) :
@@ -103,13 +103,13 @@
"""
# prep the sockaddr that we will return
- cdef libc.sockaddr_storage ss
- cdef libc.socklen_t ss_len = sizeof(ss)
+ cdef platform.sockaddr_storage ss
+ cdef platform.socklen_t ss_len = sizeof(ss)
cdef socket_t sock_fd
# accept()
- sock_fd = libc.accept(self.fd, <libc.sockaddr *> &ss, &ss_len)
+ sock_fd = platform.accept(self.fd, <platform.sockaddr *> &ss, &ss_len)
if sock_fd < 0 :
raise_errno('accept')
@@ -118,7 +118,7 @@
sock_obj = socket(sock_fd)
# prep the new addr
- sock_addr = build_sockaddr(<libc.sockaddr *> &ss, ss_len)
+ sock_addr = build_sockaddr(<platform.sockaddr *> &ss, ss_len)
return sock_obj, sock_addr
@@ -140,7 +140,7 @@
py.PyObject_AsCharBuffer(buf, &buf_ptr, &buf_len)
# send()
- ret = libc.send(self.fd, <void *> buf_ptr, buf_len, flags)
+ ret = platform.send(self.fd, <void *> buf_ptr, buf_len, flags)
if ret < 0 :
raise_errno('send')
--- a/setup.py Sun Aug 16 19:22:02 2009 +0300
+++ b/setup.py Sun Aug 16 20:18:39 2009 +0300
@@ -27,6 +27,8 @@
ext_modules = [
cython_ext("qmsk.net.libc", ["qmsk/net/libc.pyx"]),
cython_ext("qmsk.net.py", ["qmsk/net/py.pyx"]),
+ cython_ext("qmsk.net.socket.platform", ["qmsk/net/socket/platform.pyx"]),
+ cython_ext("qmsk.net.socket.constants", ["qmsk/net/socket/constants.pyx"]),
cython_ext("qmsk.net.socket.addr", ["qmsk/net/socket/addr.pyx"]),
cython_ext("qmsk.net.socket.socket", ["qmsk/net/socket/socket.pyx"]),
cython_ext("qmsk.net.sctp.sock", ["qmsk/net/sctp/sock.pyx"], libraries=['sctp']),