diff options
author | Dave Cole <djc@object-craft.com.au> | 2004-08-09 04:51:41 (GMT) |
---|---|---|
committer | Dave Cole <djc@object-craft.com.au> | 2004-08-09 04:51:41 (GMT) |
commit | 331708b226db74e745ef9972f9d4177348e4399d (patch) | |
tree | d0fece579509cedd357e981e2213cebf1e241967 /Modules/socketmodule.c | |
parent | 80e53141b9227c39b7edb4677b8b1c14551866ec (diff) | |
download | cpython-331708b226db74e745ef9972f9d4177348e4399d.zip cpython-331708b226db74e745ef9972f9d4177348e4399d.tar.gz cpython-331708b226db74e745ef9972f9d4177348e4399d.tar.bz2 |
Patch #1003700: Add socketpair function to socket module.
Diffstat (limited to 'Modules/socketmodule.c')
-rw-r--r-- | Modules/socketmodule.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 30159d2..f06e253 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -28,6 +28,7 @@ Module interface: - socket.getservbyname(servicename[, protocolname]) --> port number - socket.getservbyport(portnumber[, protocolname]) --> service name - socket.socket([family[, type [, proto]]]) --> new socket object +- socket.socketpair([family[, type [, proto]]]) --> (socket, socket) - socket.ntohs(16 bit value) --> new int object - socket.ntohl(32 bit value) --> new int object - socket.htons(16 bit value) --> new int object @@ -3009,6 +3010,63 @@ PyDoc_STRVAR(getprotobyname_doc, Return the protocol number for the named protocol. (Rarely used.)"); +#ifdef HAVE_SOCKETPAIR +/* Create a pair of sockets using the socketpair() function. + Arguments as for socket(). */ + +/*ARGSUSED*/ +static PyObject * +socket_socketpair(PyObject *self, PyObject *args) +{ + PySocketSockObject *s0 = NULL, *s1 = NULL; + SOCKET_T sv[2]; + int family, type = SOCK_STREAM, proto = 0; + PyObject *res = NULL; + +#if defined(AF_UNIX) + family = AF_UNIX; +#else + family = AF_INET; +#endif + if (!PyArg_ParseTuple(args, "|iii:socketpair", + &family, &type, &proto)) + return NULL; + /* Create a pair of socket fds */ + if (socketpair(family, type, proto, sv) < 0) + return set_error(); +#ifdef SIGPIPE + (void) signal(SIGPIPE, SIG_IGN); +#endif + s0 = new_sockobject(sv[0], family, type, proto); + if (s0 == NULL) + goto finally; + s1 = new_sockobject(sv[1], family, type, proto); + if (s1 == NULL) + goto finally; + res = PyTuple_Pack(2, s0, s1); + +finally: + if (res == NULL) { + if (s0 == NULL) + SOCKETCLOSE(sv[0]); + if (s1 == NULL) + SOCKETCLOSE(sv[1]); + } + Py_XDECREF(s0); + Py_XDECREF(s1); + return res; +} + +PyDoc_STRVAR(socketpair_doc, +"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\ +\n\ +Create a pair of socket objects from the sockets returned by the platform\n\ +socketpair() function.\n\ +The arguments are the same as for socket()."); + +#endif /* HAVE_SOCKETPAIR */ + + #ifndef NO_DUP /* Create a socket object from a numeric file description. Useful e.g. if stdin is a socket. @@ -3608,6 +3666,10 @@ static PyMethodDef socket_methods[] = { {"fromfd", socket_fromfd, METH_VARARGS, fromfd_doc}, #endif +#ifdef HAVE_SOCKETPAIR + {"socketpair", socket_socketpair, + METH_VARARGS, socketpair_doc}, +#endif {"ntohs", socket_ntohs, METH_VARARGS, ntohs_doc}, {"ntohl", socket_ntohl, |