experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
authorTero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 21:51:46 +0300
changeset 53 b2d407968973
parent 52 722fc70a197a
child 54 e7c136812b0d
experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
qmsk/net/socket/constants.pyx
qmsk/net/socket/platform.pxd
qmsk/net/socket/socket.pyx
--- a/qmsk/net/socket/constants.pyx	Sat Sep 26 21:50:42 2009 +0300
+++ b/qmsk/net/socket/constants.pyx	Sat Sep 26 21:51:46 2009 +0300
@@ -25,6 +25,10 @@
 AF_NETLINK = platform.AF_NETLINK
 AF_ROUTE = platform.AF_ROUTE
 
+SOL_SOCKET = platform.SOL_SOCKET
+
+SO_ERROR = platform.SO_ERROR
+
 MSG_OOB = platform.MSG_OOB
 MSG_PEEK = platform.MSG_PEEK
 MSG_DONTROUTE = platform.MSG_DONTROUTE
--- a/qmsk/net/socket/platform.pxd	Sat Sep 26 21:50:42 2009 +0300
+++ b/qmsk/net/socket/platform.pxd	Sat Sep 26 21:51:46 2009 +0300
@@ -45,6 +45,14 @@
         AF_NETLINK
         AF_ROUTE
     
+    # option levels for get/setsockopt
+    enum :
+        SOL_SOCKET
+
+    # options for get/setsockopt
+    enum :
+        SO_ERROR
+
     # base sockaddr stuff
     ctypedef uint16_t sa_family_t
 
@@ -124,8 +132,8 @@
     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)
+    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
--- a/qmsk/net/socket/socket.pyx	Sat Sep 26 21:50:42 2009 +0300
+++ b/qmsk/net/socket/socket.pyx	Sat Sep 26 21:51:46 2009 +0300
@@ -251,6 +251,24 @@
         
         # build the new sockaddr
         return build_sockaddr(<platform.sockaddr *> &ss, ss_len)
+    
+    def getsockopt_int (self, int level, int opt) :
+        """
+            Get and return the integer value of the given socket option.
+        """
+
+        cdef int val
+        cdef platform.socklen_t val_len = sizeof(val)
+        
+        # run
+        if platform.getsockopt(self.fd, level, opt, <void *> &val, &val_len) :
+            raise_errno('getsockopt')
+
+        # check value length
+        if val_len != sizeof(val) :
+            raise ValueError("value length: %d, should be: %d" % (val_len, sizeof(val)))
+
+        return val
 
     def send (self, object buf, int flags = 0) :
         """