… | |
… | |
59 | int got = 0; |
59 | int got = 0; |
60 | |
60 | |
61 | while (got != len) |
61 | while (got != len) |
62 | { |
62 | { |
63 | int sze = wr |
63 | int sze = wr |
64 | ? send ((SOCKET)fd, buf, len) /* we assume send and recv are macros with arguments */ |
64 | ? 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 */ |
65 | : recv ((SOCKET)fd, buf, len, 0); /* to be on the safe side */ |
66 | |
66 | |
67 | if (sze <= 0) |
67 | if (sze <= 0) |
68 | { |
68 | { |
69 | if (errno == EAGAIN || errno == EWOULDBLOCK || errno == WSAWOULDBLOCK) |
69 | if (errno == EAGAIN || errno == WSAEWOULDBLOCK) |
70 | { |
70 | { |
71 | ioctlsocket (s, FIONBIO, &nbio); |
71 | ioctlsocket (fd, FIONBIO, &nbio); |
72 | nbio = 1; |
72 | nbio = 1; |
73 | } |
73 | } |
74 | else |
74 | else |
75 | break; |
75 | break; |
76 | } |
76 | } |
77 | else |
77 | else |
78 | got += sze; |
78 | got += sze; |
79 | } |
79 | } |
80 | |
80 | |
81 | if (nbio) |
81 | if (nbio) |
82 | ioctlsocket (s, FIONBIO, &nbio); |
82 | ioctlsocket (fd, FIONBIO, &nbio); |
83 | |
83 | |
84 | return got == len; |
84 | return got == len; |
85 | } |
85 | } |
86 | #endif |
86 | #endif |
87 | |
87 | |
… | |
… | |
91 | #if defined(WIN32) |
91 | #if defined(WIN32) |
92 | DWORD pid; |
92 | DWORD pid; |
93 | HANDLE target, h; |
93 | HANDLE target, h; |
94 | |
94 | |
95 | /* seriously, there is no way to query whether a socket is non-blocking?? */ |
95 | /* 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)) |
96 | if (!rw (0, socket, (char *)&pid, sizeof (pid))) |
97 | return 0; |
97 | return 0; |
98 | |
98 | |
99 | target = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pid); |
99 | target = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pid); |
100 | if (!target) |
100 | if (!target) |
101 | croak ("AnyEvent::ProcessPool::fd_recv: OpenProcess failed"); |
101 | croak ("AnyEvent::ProcessPool::fd_recv: OpenProcess failed"); |
… | |
… | |
103 | if (!DuplicateHandle ((HANDLE)-1, (HANDLE)_get_osfhandle (fd), target, &h, 0, FALSE, DUPLICATE_SAME_ACCESS)) |
103 | if (!DuplicateHandle ((HANDLE)-1, (HANDLE)_get_osfhandle (fd), target, &h, 0, FALSE, DUPLICATE_SAME_ACCESS)) |
104 | croak ("AnyEvent::ProcessPool::fd_recv: DuplicateHandle failed"); |
104 | croak ("AnyEvent::ProcessPool::fd_recv: DuplicateHandle failed"); |
105 | |
105 | |
106 | CloseHandle (target); |
106 | CloseHandle (target); |
107 | |
107 | |
108 | if (rw (1, socket, (char *)&h, sizeof (h), 0) != sizeof (h)) |
108 | if (!rw (1, socket, (char *)&h , sizeof (h ))) |
109 | return 0; |
109 | return 0; |
110 | |
110 | |
111 | return 1; |
111 | return 1; |
112 | |
112 | |
113 | #else |
113 | #else |
… | |
… | |
151 | { |
151 | { |
152 | #if defined(WIN32) |
152 | #if defined(WIN32) |
153 | DWORD pid = GetCurrentProcessId (); |
153 | DWORD pid = GetCurrentProcessId (); |
154 | HANDLE h; |
154 | HANDLE h; |
155 | |
155 | |
156 | if (rw (1, socket, (char *)&pid, sizeof (pid), 0) != sizeof (pid)) |
156 | if (!rw (1, socket, (char *)&pid, sizeof (pid))) |
157 | return -1; |
157 | return -1; |
158 | |
158 | |
159 | if (rw (0, socket, (char *)&h, sizeof (h), 0) != sizeof (h)) |
159 | if (!rw (0, socket, (char *)&h , sizeof (h ))) |
160 | return -1; |
160 | return -1; |
161 | |
161 | |
162 | return _open_osfhandle ((intptr_t)h, 0); |
162 | return _open_osfhandle ((intptr_t)h, 0); |
163 | #else |
163 | #else |
164 | void *buf = malloc (CMSG_SPACE (sizeof (int))); |
164 | void *buf = malloc (CMSG_SPACE (sizeof (int))); |