# HG changeset patch # User Tero Marttila # Date 1250385307 -10800 # Node ID 664a1dfe08acb2feeb73962c38a279361f22d74d # Parent bbad9790b786358a34cd14707708e86516befe01 moar fixes diff -r bbad9790b786 -r 664a1dfe08ac inc/libc.pxd --- /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 diff -r bbad9790b786 -r 664a1dfe08ac libc.pxd --- 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) diff -r bbad9790b786 -r 664a1dfe08ac libc.pyx --- 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] diff -r bbad9790b786 -r 664a1dfe08ac sctp/sock.pyx --- 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, addr_buf, addr_count, flags) < 0 : - raise OSError + raise_errno() diff -r bbad9790b786 -r 664a1dfe08ac test.py --- 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)