--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/libc.pxd Sun Aug 16 04:15:07 2009 +0300
@@ -0,0 +1,1 @@
+../libc.pxd
\ No newline at end of file
--- a/libc.pxd Sun Aug 16 03:39:52 2009 +0300
+++ b/libc.pxd Sun Aug 16 04:15:07 2009 +0300
@@ -22,9 +22,14 @@
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)
+ char* strerror (int errno)
+
cdef extern from "alloca.h" :
void* alloca (size_t size)
--- a/libc.pyx Sun Aug 16 03:39:52 2009 +0300
+++ b/libc.pyx Sun Aug 16 04:15:07 2009 +0300
@@ -10,14 +10,14 @@
if c_inet_ntop(af, sockaddr, buf, sizeof(buf)) == NULL :
# XXX: errno?
- raise OSError()
+ raise OSError(errno)
# autoconvert -> str
return buf
cdef object inet_pton (int af, char *addr, void *sockaddr_out) :
- if c_inet_pton(af, addr, sockaddr_out) < 0 :
- raise OSError()
+ if c_inet_pton(af, addr, sockaddr_out) <= 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]
--- a/sctp/sock.pyx Sun Aug 16 03:39:52 2009 +0300
+++ b/sctp/sock.pyx Sun Aug 16 04:15:07 2009 +0300
@@ -1,5 +1,12 @@
"""
This C(ython) extension module provides an interface to the libsctp library and associated socket API.
+
+ >>> import socket
+ >>> from sock.addr import sockaddr_in
+ >>> s = socket.socket(socket.AF_INET, socket.SOCK_SEQPACKET, 132)
+ >>> sctp_bindx(s.fileno(), [sockaddr_in('127.0.0.1', 1337), sockaddr_in('127.0.0.2')], 0x01)
+ >>>
+
"""
from sctp cimport *
@@ -7,6 +14,19 @@
cimport libc
cimport sock.addr
+cdef extern from "Python.h" :
+ struct PyObject :
+ pass
+
+ PyObject* PyErr_SetFromErrno (PyObject *type)
+
+ PyObject* PyExc_OSError
+
+cdef int raise_errno () except -1 :
+ PyErr_SetFromErrno(PyExc_OSError)
+
+ return -1
+
def sctp_bindx (int sd, object addrs, int flags) :
"""
Bind the given SOCK_SEQPACKET to the given set of sock.addr.sockaddr's.
@@ -14,6 +34,7 @@
sd the system socket FD
addresses the list of qmsk.net.sock.addr.sockaddr's
flags one of SCTP_BINDX_ADD/REM_ADDR
+
"""
# ensure that addrs stays the same... ?
@@ -47,5 +68,5 @@
# then call
if c_sctp_bindx(sd, <libc.sockaddr *> addr_buf, addr_count, flags) < 0 :
- raise OSError
+ raise_errno()
--- a/test.py Sun Aug 16 03:39:52 2009 +0300
+++ b/test.py Sun Aug 16 04:15:07 2009 +0300
@@ -1,6 +1,10 @@
import doctest
import sock.addr
+import sctp.sock
-doctest.testmod(sock.addr)
-
+for mod in (
+ sock.addr,
+ sctp.sock,
+) :
+ doctest.testmod(mod)