# HG changeset patch # User Tero Marttila # Date 1253991106 -10800 # Node ID b2d40796897388a8ce0e95a0cd6156328bb52f34 # Parent 722fc70a197abe0ff6d28686880dd7a8a51fe470 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR diff -r 722fc70a197a -r b2d407968973 qmsk/net/socket/constants.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 diff -r 722fc70a197a -r b2d407968973 qmsk/net/socket/platform.pxd --- 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 diff -r 722fc70a197a -r b2d407968973 qmsk/net/socket/socket.pyx --- 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( &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, &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) : """