From bc45a3f8210213986e12dfecd7c12b8a45b4f16b Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 17 Mar 2006 19:17:34 +0000 Subject: RFE #567972: Socket objects' family, type and proto properties are now exposed via new get...() methods. --- Doc/lib/libsocket.tex | 17 ++++++++++++++++- Lib/socket.py | 18 ++++++++++++++++++ Lib/test/test_socket.py | 8 ++++++++ Misc/NEWS | 3 +++ Modules/socketmodule.c | 11 ++++++++++- 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/Doc/lib/libsocket.tex b/Doc/lib/libsocket.tex index cc7bd75..fd43b1d 100644 --- a/Doc/lib/libsocket.tex +++ b/Doc/lib/libsocket.tex @@ -626,7 +626,7 @@ timeouts on socket operations. \end{methoddesc} \begin{methoddesc}[socket]{gettimeout}{} -Returns the timeout in floating seconds associated with socket +Return the timeout in floating seconds associated with socket operations, or \code{None} if no timeout is set. This reflects the last call to \method{setblocking()} or \method{settimeout()}. \versionadded{2.3} @@ -654,6 +654,21 @@ Note that the \method{connect()} operation is subject to the timeout setting, and in general it is recommended to call \method{settimeout()} before calling \method{connect()}. +\begin{methoddesc}[socket]{getfamily}{} +Return the socket family, as given to the \class{socket} constructor. +\versionadded{2.5} +\end{methoddesc} + +\begin{methoddesc}[socket]{gettype}{} +Return the socket type, as given to the \class{socket} constructor. +\versionadded{2.5} +\end{methoddesc} + +\begin{methoddesc}[socket]{getproto}{} +Return the socket protocol, as given to the \class{socket} constructor. +\versionadded{2.5} +\end{methoddesc} + \begin{methoddesc}[socket]{setsockopt}{level, optname, value} Set the value of the given socket option (see the \UNIX{} manual page \manpage{setsockopt}{2}). The needed symbolic constants are defined in diff --git a/Lib/socket.py b/Lib/socket.py index ee2457f..3dc59c4 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -183,6 +183,24 @@ class _socketobject(object): and bufsize arguments are as for the built-in open() function.""" return _fileobject(self._sock, mode, bufsize) + def getfamily(self): + """getfamily() -> socket family + + Return the socket family.""" + return self._sock.family + + def gettype(self): + """gettype() -> socket type + + Return the socket type.""" + return self._sock.type + + def getproto(self): + """getproto() -> socket protocol + + Return the socket protocol.""" + return self._sock.proto + _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" "%s.__doc__ = _realsocket.%s.__doc__\n") for _m in _socketmethods: diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 1899e78..5a851fc 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -469,6 +469,14 @@ class GeneralModuleTests(unittest.TestCase): sock.close() self.assertRaises(socket.error, sock.send, "spam") + def testNewGetMethods(self): + # testing getfamily(), gettype() and getprotocol() + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.assertEqual(sock.getfamily(), socket.AF_INET) + self.assertEqual(sock.gettype(), socket.SOCK_STREAM) + self.assertEqual(sock.getproto(), 0) + sock.close() + class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): diff --git a/Misc/NEWS b/Misc/NEWS index 96a2f5e..98b2162 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -291,6 +291,9 @@ Core and builtins Extension Modules ----------------- +- RFE #567972: Socket objects' family, type and proto properties are + now exposed via new get...() methods. + - Everything under lib-old was removed. This includes the following modules: Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse, diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index c526d75..6ba076a 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -62,6 +62,7 @@ Local naming conventions: */ #include "Python.h" +#include "structmember.h" #undef MAX #define MAX(x, y) ((x) < (y) ? (y) : (x)) @@ -2502,6 +2503,14 @@ static PyMethodDef sock_methods[] = { {NULL, NULL} /* sentinel */ }; +/* SockObject members */ +static PyMemberDef sock_memberlist[] = { + {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"}, + {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"}, + {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"}, + {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"}, + {0}, +}; /* Deallocate a socket object in response to the last Py_DECREF(). First close the file description. */ @@ -2625,7 +2634,7 @@ static PyTypeObject sock_type = { 0, /* tp_iter */ 0, /* tp_iternext */ sock_methods, /* tp_methods */ - 0, /* tp_members */ + sock_memberlist, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ -- cgit v0.12