Christian Heimes added the comment:
Port of the socket_fromfd.patch to py3k
Added file: http://bugs.python.org/file8746/py3k_socket_fromfd.patch
__________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1378>
__________________________________
Index: Lib/socket.py
===================================================================
--- Lib/socket.py (Revision 58966)
+++ Lib/socket.py (Arbeitskopie)
@@ -111,10 +111,10 @@
# True if os.dup() can duplicate socket descriptors.
-# (On Windows at least, os.dup only works on files)
_can_dup_socket = hasattr(_socket.socket, "dup")
-if _can_dup_socket:
+# On Windows _socket.socket.dup() doesn't accept a file descriptor
+if _can_dup_socket and os.name != 'nt':
def fromfd(fd, family=AF_INET, type=SOCK_STREAM, proto=0):
nfd = os.dup(fd)
return socket(family, type, proto, fileno=nfd)
Index: Lib/test/test_socket.py
===================================================================
--- Lib/test/test_socket.py (Revision 58966)
+++ Lib/test/test_socket.py (Arbeitskopie)
@@ -566,7 +566,7 @@
def testFromFd(self):
# Testing fromfd()
if not hasattr(socket, "fromfd"):
- return # On Windows, this doesn't exist
+ return # On BeOS, OS/2 and RiscOS this doesn't exist
fd = self.cli_conn.fileno()
sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
msg = sock.recv(1024)
@@ -575,6 +575,15 @@
def _testFromFd(self):
self.serv_conn.send(MSG)
+ def testDup(self):
+ # Testing dup()
+ sock = self.cli_conn.dup()
+ msg = sock.recv(1024)
+ self.assertEqual(msg, MSG)
+
+ def _testDup(self):
+ self.serv_conn.send(MSG)
+
def testShutdown(self):
# Testing shutdown()
msg = self.cli_conn.recv(1024)
Index: Modules/socketmodule.c
===================================================================
--- Modules/socketmodule.c (Revision 58966)
+++ Modules/socketmodule.c (Arbeitskopie)
@@ -324,10 +324,25 @@
#include "getnameinfo.c"
#endif
-#if defined(MS_WINDOWS)
-/* seem to be a few differences in the API */
+#ifdef MS_WINDOWS
+/* On Windows a socket is really a handle not an fd */
+static SOCKET
+duplicate_socket(SOCKET handle)
+{
+ HANDLE newhandle;
+
+ if (!DuplicateHandle(GetCurrentProcess(), (HANDLE)handle,
+ GetCurrentProcess(), &newhandle,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ {
+ WSASetLastError(WSAEBADF);
+ return INVALID_SOCKET;
+ }
+ return (SOCKET)newhandle;
+}
+#define dup(fd) duplicate_socket(fd)
#define SOCKETCLOSE closesocket
-#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */
+#define NO_MAKEFILE /* socket handles can't be treated like file handles */
#endif
#ifdef MS_WIN32
@@ -344,6 +359,10 @@
#define SOCKETCLOSE close
#endif
+#ifdef NO_DUP
+#define NO_MAKEFILE
+#endif
+
#if defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)
#define USE_BLUETOOTH 1
#if defined(__FreeBSD__)
@@ -1978,8 +1997,13 @@
PyObject *sock;
newfd = dup(s->sock_fd);
- if (newfd < 0)
+#ifdef MS_WINDOWS
+ if (newfd == INVALID_SOCKET) {
+#else
+ if (newfd < 0) {
+#endif
return s->errorhandler();
+ }
sock = (PyObject *) new_sockobject(newfd,
s->sock_family,
s->sock_type,
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com