qmsk/net/socket/platform.pyx
changeset 10 94b0d5a208c1
child 11 7ae92c2b433f
--- /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
+