moar fixes
authorTero Marttila <terom@fixme.fi>
Sun, 16 Aug 2009 04:15:07 +0300
changeset 4 664a1dfe08ac
parent 3 bbad9790b786
child 5 59bed837c265
moar fixes
inc/libc.pxd
libc.pxd
libc.pyx
sctp/sock.pyx
test.py
--- /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)