summaryrefslogtreecommitdiffstats
path: root/Modules/socketmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r--Modules/socketmodule.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 5fe2431..8744ea0 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -136,6 +136,7 @@ sendall(data[, flags]) -- send all data\n\
send(data[, flags]) -- send data, may not send all of it\n\
sendto(data[, flags], addr) -- send data to a given address\n\
setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
+getblocking() -- return True if socket is blocking, False if non-blocking\n\
setsockopt(level, optname, value[, optlen]) -- set socket options\n\
settimeout(None | float) -- set or clear the timeout\n\
shutdown(how) -- shut down traffic in one or both directions\n\
@@ -2525,6 +2526,27 @@ Set the socket to blocking (flag is true) or non-blocking (false).\n\
setblocking(True) is equivalent to settimeout(None);\n\
setblocking(False) is equivalent to settimeout(0.0).");
+/* s.getblocking() method.
+ Returns True if socket is in blocking mode,
+ False if it is in non-blocking mode.
+*/
+static PyObject *
+sock_getblocking(PySocketSockObject *s)
+{
+ if (s->sock_timeout) {
+ Py_RETURN_TRUE;
+ }
+ else {
+ Py_RETURN_FALSE;
+ }
+}
+
+PyDoc_STRVAR(getblocking_doc,
+"getblocking()\n\
+\n\
+Returns True if socket is in blocking mode, or False if it\n\
+is in non-blocking mode.");
+
static int
socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
{
@@ -2581,7 +2603,30 @@ sock_settimeout(PySocketSockObject *s, PyObject *arg)
return NULL;
s->sock_timeout = timeout;
- if (internal_setblocking(s, timeout < 0) == -1) {
+
+ int block = timeout < 0;
+ /* Blocking mode for a Python socket object means that operations
+ like :meth:`recv` or :meth:`sendall` will block the execution of
+ the current thread until they are complete or aborted with a
+ `socket.timeout` or `socket.error` errors. When timeout is `None`,
+ the underlying FD is in a blocking mode. When timeout is a positive
+ number, the FD is in a non-blocking mode, and socket ops are
+ implemented with a `select()` call.
+
+ When timeout is 0.0, the FD is in a non-blocking mode.
+
+ This table summarizes all states in which the socket object and
+ its underlying FD can be:
+
+ ==================== ===================== ==============
+ `gettimeout()` `getblocking()` FD
+ ==================== ===================== ==============
+ ``None`` ``True`` blocking
+ ``0.0`` ``False`` non-blocking
+ ``> 0`` ``True`` non-blocking
+ */
+
+ if (internal_setblocking(s, block) == -1) {
return NULL;
}
Py_RETURN_NONE;
@@ -4601,6 +4646,8 @@ static PyMethodDef sock_methods[] = {
sendto_doc},
{"setblocking", (PyCFunction)sock_setblocking, METH_O,
setblocking_doc},
+ {"getblocking", (PyCFunction)sock_getblocking, METH_NOARGS,
+ getblocking_doc},
{"settimeout", (PyCFunction)sock_settimeout, METH_O,
settimeout_doc},
{"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,