]> granicus.if.org Git - python/commitdiff
RFE #567972: Socket objects' family, type and proto properties are
authorGeorg Brandl <georg@python.org>
Fri, 17 Mar 2006 19:17:34 +0000 (19:17 +0000)
committerGeorg Brandl <georg@python.org>
Fri, 17 Mar 2006 19:17:34 +0000 (19:17 +0000)
now exposed via new get...() methods.

Doc/lib/libsocket.tex
Lib/socket.py
Lib/test/test_socket.py
Misc/NEWS
Modules/socketmodule.c

index cc7bd759ac52210eb893b981479782665770ec78..fd43b1d6085cb4adc1bc6272cdafe6af5585609f 100644 (file)
@@ -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
index ee2457fa0c12f7f8ee25b25b891bec713a0a5533..3dc59c4f6f28d28641eec17a9a3d1a90b8ff6b06 100644 (file)
@@ -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:
index 1899e78d05b8cfb773a314c73095435f7665f9d4..5a851fc15101c64ecd82a0cc92dd78fa7b9cb30f 100644 (file)
@@ -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'):
index 96a2f5e91a4589c09f8265843ee66a8cafb014fd..98b21625df157baa31dc88bb4316924c386ed64c 100644 (file)
--- 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, 
index c526d7595ff6b8733b9eecfc92a23dd626f8537e..6ba076a15cc545762a83f53652117649998f6449 100644 (file)
@@ -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 */