--- 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) :
"""