diff Modules/socketmodule.c @ 33063:90da70986407 legacy-trunk

Patch #1003700: Add socketpair function to socket module.
author Dave Cole <djc@object-craft.com.au>
date Mon, 09 Aug 2004 04:51:41 +0000
parents 89159a1268cc
children cda0455bd0a0
line wrap: on
line diff
--- a/Modules/socketmodule.c	Mon Aug 09 04:34:45 2004 +0000
+++ b/Modules/socketmodule.c	Mon Aug 09 04:51:41 2004 +0000
@@ -28,6 +28,7 @@
 - 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 @@
 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 @@
 	{"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,