Commit bc45a3f8 authored by Georg Brandl's avatar Georg Brandl

RFE #567972: Socket objects' family, type and proto properties are

now exposed via new get...() methods.
parent 5c170fd4
...@@ -626,7 +626,7 @@ timeouts on socket operations. ...@@ -626,7 +626,7 @@ timeouts on socket operations.
\end{methoddesc} \end{methoddesc}
\begin{methoddesc}[socket]{gettimeout}{} \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 operations, or \code{None} if no timeout is set. This reflects
the last call to \method{setblocking()} or \method{settimeout()}. the last call to \method{setblocking()} or \method{settimeout()}.
\versionadded{2.3} \versionadded{2.3}
...@@ -654,6 +654,21 @@ Note that the \method{connect()} operation is subject to the timeout ...@@ -654,6 +654,21 @@ Note that the \method{connect()} operation is subject to the timeout
setting, and in general it is recommended to call setting, and in general it is recommended to call
\method{settimeout()} before calling \method{connect()}. \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} \begin{methoddesc}[socket]{setsockopt}{level, optname, value}
Set the value of the given socket option (see the \UNIX{} manual page Set the value of the given socket option (see the \UNIX{} manual page
\manpage{setsockopt}{2}). The needed symbolic constants are defined in \manpage{setsockopt}{2}). The needed symbolic constants are defined in
......
...@@ -183,6 +183,24 @@ class _socketobject(object): ...@@ -183,6 +183,24 @@ class _socketobject(object):
and bufsize arguments are as for the built-in open() function.""" and bufsize arguments are as for the built-in open() function."""
return _fileobject(self._sock, mode, bufsize) 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 = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
"%s.__doc__ = _realsocket.%s.__doc__\n") "%s.__doc__ = _realsocket.%s.__doc__\n")
for _m in _socketmethods: for _m in _socketmethods:
......
...@@ -469,6 +469,14 @@ class GeneralModuleTests(unittest.TestCase): ...@@ -469,6 +469,14 @@ class GeneralModuleTests(unittest.TestCase):
sock.close() sock.close()
self.assertRaises(socket.error, sock.send, "spam") 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): class BasicTCPTest(SocketConnectedTest):
def __init__(self, methodName='runTest'): def __init__(self, methodName='runTest'):
......
...@@ -291,6 +291,9 @@ Core and builtins ...@@ -291,6 +291,9 @@ Core and builtins
Extension Modules 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: - Everything under lib-old was removed. This includes the following modules:
Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep, Para, addpack, cmp, cmpcache, codehack, dircmp, dump, find, fmt, grep,
lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse, lockfile, newdir, ni, packmail, poly, rand, statcache, tb, tzparse,
......
...@@ -62,6 +62,7 @@ Local naming conventions: ...@@ -62,6 +62,7 @@ Local naming conventions:
*/ */
#include "Python.h" #include "Python.h"
#include "structmember.h"
#undef MAX #undef MAX
#define MAX(x, y) ((x) < (y) ? (y) : (x)) #define MAX(x, y) ((x) < (y) ? (y) : (x))
...@@ -2502,6 +2503,14 @@ static PyMethodDef sock_methods[] = { ...@@ -2502,6 +2503,14 @@ static PyMethodDef sock_methods[] = {
{NULL, NULL} /* sentinel */ {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(). /* Deallocate a socket object in response to the last Py_DECREF().
First close the file description. */ First close the file description. */
...@@ -2625,7 +2634,7 @@ static PyTypeObject sock_type = { ...@@ -2625,7 +2634,7 @@ static PyTypeObject sock_type = {
0, /* tp_iter */ 0, /* tp_iter */
0, /* tp_iternext */ 0, /* tp_iternext */
sock_methods, /* tp_methods */ sock_methods, /* tp_methods */
0, /* tp_members */ sock_memberlist, /* tp_members */
0, /* tp_getset */ 0, /* tp_getset */
0, /* tp_base */ 0, /* tp_base */
0, /* tp_dict */ 0, /* tp_dict */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment