ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-FDPass/FDPass.xs
(Generate patch)

Comparing IO-FDPass/FDPass.xs (file contents):
Revision 1.1 by root, Fri Apr 5 04:10:51 2013 UTC vs.
Revision 1.4 by root, Fri Apr 5 05:04:59 2013 UTC

1/* GetCurrentProcessId is XP and up, which means in all supported versions */
2/* but older SDK's might need this */
3#define _WIN32_WINNT NTDDI_WINXP
4
5#ifdef __sun 1#ifdef __sun
6 #define _XOPEN_SOURCE 1 2 #define _XOPEN_SOURCE 1
7 #define _XOPEN_SOURCE_EXTENDED 1 3 #define _XOPEN_SOURCE_EXTENDED 1
8 #define __EXTENSIONS__ 1 4 #define __EXTENSIONS__ 1
9#endif 5#endif
22 #include <windows.h> 18 #include <windows.h>
23 #include <io.h> 19 #include <io.h>
24 #include <sys/cygwin.h> 20 #include <sys/cygwin.h>
25 21
26 #define ioctlsocket(a,b,c) ioctl (a, b, c) 22 #define ioctlsocket(a,b,c) ioctl (a, b, c)
27 #define _open_osfhandle(h,m) cygwin_attach_handle_to_fd ("/dev/pipe", -1, (HANDLE)h, 1, GENERIC_READ | GENERIC_WRITE) 23 #define _open_osfhandle(h,m) cygwin_attach_handle_to_fd ("/dev/tcp", -1, (HANDLE)h, 1, GENERIC_READ | GENERIC_WRITE)
28 typedef int SOCKET; 24 typedef int SOCKET;
29 25
30#else 26#else
31 27
32 #include <stddef.h> // needed by broken bsds for NULL used in sys/uio.h 28 #include <stddef.h> // needed by broken bsds for NULL used in sys/uio.h
59 int got = 0; 55 int got = 0;
60 56
61 while (got != len) 57 while (got != len)
62 { 58 {
63 int sze = wr 59 int sze = wr
64 ? send ((SOCKET)fd, buf, len) /* we assume send and recv are macros with arguments */ 60 ? send ((SOCKET)fd, buf, len, 0) /* we assume send and recv are macros with arguments */
65 : recv ((SOCKET)fd, buf, len); /* to be on the safe side */ 61 : recv ((SOCKET)fd, buf, len, 0); /* to be on the safe side */
66 62
67 if (sze <= 0) 63 if (sze <= 0)
68 { 64 {
69 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == WSAWOULDBLOCK) 65 if (errno == EAGAIN || errno == WSAEWOULDBLOCK)
70 { 66 {
71 ioctlsocket (s, FIONBIO, &nbio); 67 ioctlsocket (fd, FIONBIO, &nbio);
72 nbio = 1; 68 nbio = 1;
73 } 69 }
74 else 70 else
75 break; 71 break;
76 } 72 }
77 else 73 else
78 got += sze; 74 got += sze;
79 } 75 }
80 76
81 if (nbio) 77 if (nbio)
82 ioctlsocket (s, FIONBIO, &nbio); 78 ioctlsocket (fd, FIONBIO, &nbio);
83 79
84 return got == len; 80 return got == len;
85} 81}
86#endif 82#endif
87 83
91#if defined(WIN32) 87#if defined(WIN32)
92 DWORD pid; 88 DWORD pid;
93 HANDLE target, h; 89 HANDLE target, h;
94 90
95 /* seriously, there is no way to query whether a socket is non-blocking?? */ 91 /* seriously, there is no way to query whether a socket is non-blocking?? */
96 if (rw (0, socket, (char *)&pid, sizeof (pid), 0) != sizeof (pid)) 92 if (!rw (0, socket, (char *)&pid, sizeof (pid)))
97 return 0; 93 return 0;
98 94
99 target = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pid); 95 target = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pid);
100 if (!target) 96 if (!target)
101 croak ("AnyEvent::ProcessPool::fd_recv: OpenProcess failed"); 97 croak ("AnyEvent::ProcessPool::fd_recv: OpenProcess failed");
103 if (!DuplicateHandle ((HANDLE)-1, (HANDLE)_get_osfhandle (fd), target, &h, 0, FALSE, DUPLICATE_SAME_ACCESS)) 99 if (!DuplicateHandle ((HANDLE)-1, (HANDLE)_get_osfhandle (fd), target, &h, 0, FALSE, DUPLICATE_SAME_ACCESS))
104 croak ("AnyEvent::ProcessPool::fd_recv: DuplicateHandle failed"); 100 croak ("AnyEvent::ProcessPool::fd_recv: DuplicateHandle failed");
105 101
106 CloseHandle (target); 102 CloseHandle (target);
107 103
108 if (rw (1, socket, (char *)&h, sizeof (h), 0) != sizeof (h)) 104 if (!rw (1, socket, (char *)&h , sizeof (h )))
109 return 0; 105 return 0;
110 106
111 return 1; 107 return 1;
112 108
113#else 109#else
151{ 147{
152#if defined(WIN32) 148#if defined(WIN32)
153 DWORD pid = GetCurrentProcessId (); 149 DWORD pid = GetCurrentProcessId ();
154 HANDLE h; 150 HANDLE h;
155 151
156 if (rw (1, socket, (char *)&pid, sizeof (pid), 0) != sizeof (pid)) 152 if (!rw (1, socket, (char *)&pid, sizeof (pid)))
157 return -1; 153 return -1;
158 154
159 if (rw (0, socket, (char *)&h, sizeof (h), 0) != sizeof (h)) 155 if (!rw (0, socket, (char *)&h , sizeof (h )))
160 return -1; 156 return -1;
161 157
162 return _open_osfhandle ((intptr_t)h, 0); 158 return _open_osfhandle ((intptr_t)h, 0);
163#else 159#else
164 void *buf = malloc (CMSG_SPACE (sizeof (int))); 160 void *buf = malloc (CMSG_SPACE (sizeof (int)));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines