diff options
Diffstat (limited to 'src/gns/w32nsp.c')
-rw-r--r-- | src/gns/w32nsp.c | 728 |
1 files changed, 367 insertions, 361 deletions
diff --git a/src/gns/w32nsp.c b/src/gns/w32nsp.c index 56d07a50c..5178cb822 100644 --- a/src/gns/w32nsp.c +++ b/src/gns/w32nsp.c | |||
@@ -11,12 +11,12 @@ | |||
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Affero General Public License for more details. | 13 | Affero General Public License for more details. |
14 | 14 | ||
15 | You should have received a copy of the GNU Affero General Public License | 15 | You should have received a copy of the GNU Affero General Public License |
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 16 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 | 17 | ||
18 | SPDX-License-Identifier: AGPL3.0-or-later | 18 | SPDX-License-Identifier: AGPL3.0-or-later |
19 | */ | 19 | */ |
20 | /** | 20 | /** |
21 | * @file gns/w32nsp.c | 21 | * @file gns/w32nsp.c |
22 | * @brief W32 integration for GNS | 22 | * @brief W32 integration for GNS |
@@ -32,7 +32,7 @@ | |||
32 | #endif | 32 | #endif |
33 | #if VERBOSE | 33 | #if VERBOSE |
34 | # define __printf__ printf | 34 | # define __printf__ printf |
35 | # define DEBUGLOG(s, ...) printf (s, ##__VA_ARGS__) | 35 | # define DEBUGLOG(s, ...) printf(s, ## __VA_ARGS__) |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | #include <stdint.h> | 38 | #include <stdint.h> |
@@ -80,8 +80,7 @@ | |||
80 | 80 | ||
81 | static CRITICAL_SECTION records_cs; | 81 | static CRITICAL_SECTION records_cs; |
82 | 82 | ||
83 | struct record | 83 | struct record { |
84 | { | ||
85 | SOCKET s; | 84 | SOCKET s; |
86 | DWORD flags; | 85 | DWORD flags; |
87 | uint8_t state; | 86 | uint8_t state; |
@@ -94,58 +93,60 @@ static size_t records_len = 0; | |||
94 | static size_t records_size = 0; | 93 | static size_t records_size = 0; |
95 | 94 | ||
96 | static int | 95 | static int |
97 | resize_records () | 96 | resize_records() |
98 | { | 97 | { |
99 | size_t new_size = records_len > 0 ? records_len * 2 : 5; | 98 | size_t new_size = records_len > 0 ? records_len * 2 : 5; |
100 | struct record *new_records = malloc (new_size * sizeof (struct record)); | 99 | struct record *new_records = malloc(new_size * sizeof(struct record)); |
100 | |||
101 | if (new_records == NULL) | 101 | if (new_records == NULL) |
102 | { | 102 | { |
103 | SetLastError (WSA_NOT_ENOUGH_MEMORY); | 103 | SetLastError(WSA_NOT_ENOUGH_MEMORY); |
104 | return 0; | 104 | return 0; |
105 | } | 105 | } |
106 | GNUNET_memcpy (new_records, records, records_len * sizeof (struct record)); | 106 | GNUNET_memcpy(new_records, records, records_len * sizeof(struct record)); |
107 | memset (&new_records[records_len], 0, sizeof (struct record) * (new_size - records_len)); | 107 | memset(&new_records[records_len], 0, sizeof(struct record) * (new_size - records_len)); |
108 | records_size = new_size; | 108 | records_size = new_size; |
109 | free (records); | 109 | free(records); |
110 | records = new_records; | 110 | records = new_records; |
111 | return 1; | 111 | return 1; |
112 | } | 112 | } |
113 | 113 | ||
114 | static int | 114 | static int |
115 | add_record (SOCKET s, const wchar_t *name, DWORD flags) | 115 | add_record(SOCKET s, const wchar_t *name, DWORD flags) |
116 | { | 116 | { |
117 | int res = 1; | 117 | int res = 1; |
118 | int i; | 118 | int i; |
119 | int empty = -1; | 119 | int empty = -1; |
120 | |||
120 | //EnterCriticalSection (&records_cs); | 121 | //EnterCriticalSection (&records_cs); |
121 | for (i = 0; i < records_len; i++) | 122 | for (i = 0; i < records_len; i++) |
122 | if (records[i].state == 0) | 123 | if (records[i].state == 0) |
123 | break; | 124 | break; |
124 | empty = i; | 125 | empty = i; |
125 | if (i == records_len) | 126 | if (i == records_len) |
126 | { | 127 | { |
127 | res = resize_records (); | 128 | res = resize_records(); |
128 | if (res) | 129 | if (res) |
129 | empty = records_len++; | 130 | empty = records_len++; |
130 | } | 131 | } |
131 | if (res) | 132 | if (res) |
132 | { | 133 | { |
133 | struct record r; | 134 | struct record r; |
134 | r.s = s; | 135 | r.s = s; |
135 | r.flags = flags; | 136 | r.flags = flags; |
136 | r.name = (wchar_t *) name; | 137 | r.name = (wchar_t *)name; |
137 | r.state = 1; | 138 | r.state = 1; |
138 | r.buf = NULL; | 139 | r.buf = NULL; |
139 | if (name) | 140 | if (name) |
140 | r.name = wcsdup (name); | 141 | r.name = wcsdup(name); |
141 | records[empty] = r; | 142 | records[empty] = r; |
142 | } | 143 | } |
143 | //LeaveCriticalSection (&records_cs); | 144 | //LeaveCriticalSection (&records_cs); |
144 | return res; | 145 | return res; |
145 | } | 146 | } |
146 | 147 | ||
147 | /* These are not defined by mingw.org headers at the moment*/ | 148 | /* These are not defined by mingw.org headers at the moment*/ |
148 | typedef INT (WSPAPI *LPNSPIOCTL) (HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION,LPWSATHREADID); | 149 | typedef INT (WSPAPI *LPNSPIOCTL)(HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSACOMPLETION, LPWSATHREADID); |
149 | typedef struct _NSP_ROUTINE_XP { | 150 | typedef struct _NSP_ROUTINE_XP { |
150 | DWORD cbSize; | 151 | DWORD cbSize; |
151 | DWORD dwMajorVersion; | 152 | DWORD dwMajorVersion; |
@@ -162,39 +163,39 @@ typedef struct _NSP_ROUTINE_XP { | |||
162 | } NSP_ROUTINE_XP; | 163 | } NSP_ROUTINE_XP; |
163 | 164 | ||
164 | static SOCKET | 165 | static SOCKET |
165 | connect_to_dns_resolver () | 166 | connect_to_dns_resolver() |
166 | { | 167 | { |
167 | struct sockaddr_in addr; | 168 | struct sockaddr_in addr; |
168 | SOCKET r; | 169 | SOCKET r; |
169 | int ret; | 170 | int ret; |
170 | 171 | ||
171 | r = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); | 172 | r = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
172 | if (INVALID_SOCKET == r) | 173 | if (INVALID_SOCKET == r) |
173 | { | 174 | { |
174 | SetLastError (16004); | 175 | SetLastError(16004); |
175 | return r; | 176 | return r; |
176 | } | 177 | } |
177 | 178 | ||
178 | addr.sin_family = AF_INET; | 179 | addr.sin_family = AF_INET; |
179 | addr.sin_port = htons (5353); /* TCP 5353 is not registered; UDP 5353 is */ | 180 | addr.sin_port = htons(5353); /* TCP 5353 is not registered; UDP 5353 is */ |
180 | addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); | 181 | addr.sin_addr.s_addr = inet_addr("127.0.0.1"); |
181 | 182 | ||
182 | ret = connect (r, (struct sockaddr *) &addr, sizeof (addr)); | 183 | ret = connect(r, (struct sockaddr *)&addr, sizeof(addr)); |
183 | if (SOCKET_ERROR == ret) | 184 | if (SOCKET_ERROR == ret) |
184 | { | 185 | { |
185 | DWORD err = GetLastError (); | 186 | DWORD err = GetLastError(); |
186 | closesocket (r); | 187 | closesocket(r); |
187 | SetLastError (err); | 188 | SetLastError(err); |
188 | SetLastError (16005); | 189 | SetLastError(16005); |
189 | r = INVALID_SOCKET; | 190 | r = INVALID_SOCKET; |
190 | } | 191 | } |
191 | return r; | 192 | return r; |
192 | } | 193 | } |
193 | 194 | ||
194 | static int | 195 | static int |
195 | send_name_to_ip_request (LPWSAQUERYSETW lpqsRestrictions, | 196 | send_name_to_ip_request(LPWSAQUERYSETW lpqsRestrictions, |
196 | LPWSASERVICECLASSINFOW lpServiceClassInfo, DWORD dwControlFlags, | 197 | LPWSASERVICECLASSINFOW lpServiceClassInfo, DWORD dwControlFlags, |
197 | SOCKET *resolver) | 198 | SOCKET *resolver) |
198 | { | 199 | { |
199 | struct GNUNET_W32RESOLVER_GetMessage *msg; | 200 | struct GNUNET_W32RESOLVER_GetMessage *msg; |
200 | int af4 = 0; | 201 | int af4 = 0; |
@@ -202,91 +203,95 @@ send_name_to_ip_request (LPWSAQUERYSETW lpqsRestrictions, | |||
202 | char *buf; | 203 | char *buf; |
203 | int ret = 1; | 204 | int ret = 1; |
204 | int i; | 205 | int i; |
205 | size_t size = sizeof (struct GNUNET_W32RESOLVER_GetMessage); | 206 | size_t size = sizeof(struct GNUNET_W32RESOLVER_GetMessage); |
206 | size_t namelen = 0; | 207 | size_t namelen = 0; |
208 | |||
207 | if (lpqsRestrictions->lpszServiceInstanceName) | 209 | if (lpqsRestrictions->lpszServiceInstanceName) |
208 | namelen = sizeof (wchar_t) * (wcslen (lpqsRestrictions->lpszServiceInstanceName) + 1); | 210 | namelen = sizeof(wchar_t) * (wcslen(lpqsRestrictions->lpszServiceInstanceName) + 1); |
209 | size += namelen; | 211 | size += namelen; |
210 | buf = malloc (size); | 212 | buf = malloc(size); |
211 | msg = (struct GNUNET_W32RESOLVER_GetMessage *) buf; | 213 | msg = (struct GNUNET_W32RESOLVER_GetMessage *)buf; |
212 | msg->header.size = htons (size); | 214 | msg->header.size = htons(size); |
213 | msg->header.type = htons (GNUNET_MESSAGE_TYPE_W32RESOLVER_REQUEST); | 215 | msg->header.type = htons(GNUNET_MESSAGE_TYPE_W32RESOLVER_REQUEST); |
214 | if (lpqsRestrictions->dwNumberOfProtocols > 0) | 216 | if (lpqsRestrictions->dwNumberOfProtocols > 0) |
215 | { | ||
216 | int i; | ||
217 | for (i = 0; i < lpqsRestrictions->dwNumberOfProtocols; i++) | ||
218 | { | 217 | { |
219 | if (lpqsRestrictions->lpafpProtocols[0].iAddressFamily == AF_INET) | 218 | int i; |
220 | af4 = 1; | 219 | for (i = 0; i < lpqsRestrictions->dwNumberOfProtocols; i++) |
221 | if (lpqsRestrictions->lpafpProtocols[0].iAddressFamily == AF_INET6) | 220 | { |
222 | af6 = 1; | 221 | if (lpqsRestrictions->lpafpProtocols[0].iAddressFamily == AF_INET) |
222 | af4 = 1; | ||
223 | if (lpqsRestrictions->lpafpProtocols[0].iAddressFamily == AF_INET6) | ||
224 | af6 = 1; | ||
225 | } | ||
223 | } | 226 | } |
224 | } | ||
225 | if (af4 && !af6) | 227 | if (af4 && !af6) |
226 | msg->af = htonl (AF_INET); | 228 | msg->af = htonl(AF_INET); |
227 | else if (af6 && !af4) | 229 | else if (af6 && !af4) |
228 | msg->af = htonl (AF_INET6); | 230 | msg->af = htonl(AF_INET6); |
229 | else | 231 | else |
230 | msg->af = htonl (AF_UNSPEC); | 232 | msg->af = htonl(AF_UNSPEC); |
231 | if (lpqsRestrictions->lpszServiceInstanceName) | 233 | if (lpqsRestrictions->lpszServiceInstanceName) |
232 | GNUNET_memcpy (&msg[1], lpqsRestrictions->lpszServiceInstanceName, namelen); | 234 | GNUNET_memcpy(&msg[1], lpqsRestrictions->lpszServiceInstanceName, namelen); |
233 | msg->sc_data1 = htonl (lpqsRestrictions->lpServiceClassId->Data1); | 235 | msg->sc_data1 = htonl(lpqsRestrictions->lpServiceClassId->Data1); |
234 | msg->sc_data2 = htons (lpqsRestrictions->lpServiceClassId->Data2); | 236 | msg->sc_data2 = htons(lpqsRestrictions->lpServiceClassId->Data2); |
235 | msg->sc_data3 = htons (lpqsRestrictions->lpServiceClassId->Data3); | 237 | msg->sc_data3 = htons(lpqsRestrictions->lpServiceClassId->Data3); |
236 | for (i = 0; i < 8; i++) | 238 | for (i = 0; i < 8; i++) |
237 | msg->sc_data4[i] = lpqsRestrictions->lpServiceClassId->Data4[i]; | 239 | msg->sc_data4[i] = lpqsRestrictions->lpServiceClassId->Data4[i]; |
238 | *resolver = connect_to_dns_resolver (); | 240 | *resolver = connect_to_dns_resolver(); |
239 | if (*resolver != INVALID_SOCKET) | 241 | if (*resolver != INVALID_SOCKET) |
240 | { | ||
241 | if (size != send (*resolver, buf, size, 0)) | ||
242 | { | 242 | { |
243 | if (size != send(*resolver, buf, size, 0)) | ||
244 | { | ||
243 | #if VERBOSE | 245 | #if VERBOSE |
244 | DWORD err = GetLastError (); | 246 | DWORD err = GetLastError(); |
245 | #endif | 247 | #endif |
246 | closesocket (*resolver); | 248 | closesocket(*resolver); |
247 | *resolver = INVALID_SOCKET; | 249 | *resolver = INVALID_SOCKET; |
248 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: failed to send request: %lu\n", err); | 250 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin: failed to send request: %lu\n", err); |
249 | SetLastError (WSATRY_AGAIN); | 251 | SetLastError(WSATRY_AGAIN); |
250 | ret = 0; | 252 | ret = 0; |
253 | } | ||
251 | } | 254 | } |
252 | } | ||
253 | else | 255 | else |
254 | ret = 0; | 256 | ret = 0; |
255 | free (buf); | 257 | free(buf); |
256 | return ret; | 258 | return ret; |
257 | } | 259 | } |
258 | 260 | ||
259 | static int WSPAPI | 261 | static int WSPAPI |
260 | NSPCleanup (LPGUID lpProviderId) | 262 | NSPCleanup(LPGUID lpProviderId) |
261 | { | 263 | { |
262 | DEBUGLOG ("NSPCleanup\n"); | 264 | DEBUGLOG("NSPCleanup\n"); |
263 | if (IsEqualGUID (lpProviderId, &GNUNET_NAMESPACE_PROVIDER_DNS)) | 265 | if (IsEqualGUID(lpProviderId, &GNUNET_NAMESPACE_PROVIDER_DNS)) |
264 | { | 266 | { |
265 | return NO_ERROR; | 267 | return NO_ERROR; |
266 | } | 268 | } |
267 | SetLastError (WSAEINVALIDPROVIDER); | 269 | SetLastError(WSAEINVALIDPROVIDER); |
268 | return SOCKET_ERROR; | 270 | return SOCKET_ERROR; |
269 | } | 271 | } |
270 | 272 | ||
271 | BOOL WINAPI | 273 | BOOL WINAPI |
272 | DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) | 274 | DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) |
273 | { | 275 | { |
274 | switch (fdwReason) | 276 | switch (fdwReason) |
275 | { | 277 | { |
276 | case DLL_PROCESS_ATTACH: | 278 | case DLL_PROCESS_ATTACH: |
277 | if (!InitializeCriticalSectionAndSpinCount (&records_cs, 0x00000400)) | 279 | if (!InitializeCriticalSectionAndSpinCount(&records_cs, 0x00000400)) |
278 | { | 280 | { |
279 | return FALSE; | 281 | return FALSE; |
280 | } | 282 | } |
281 | break; | 283 | break; |
284 | |||
282 | case DLL_THREAD_ATTACH: | 285 | case DLL_THREAD_ATTACH: |
283 | break; | 286 | break; |
287 | |||
284 | case DLL_THREAD_DETACH: | 288 | case DLL_THREAD_DETACH: |
285 | break; | 289 | break; |
290 | |||
286 | case DLL_PROCESS_DETACH: | 291 | case DLL_PROCESS_DETACH: |
287 | DeleteCriticalSection (&records_cs); | 292 | DeleteCriticalSection(&records_cs); |
288 | break; | 293 | break; |
289 | } | 294 | } |
290 | return TRUE; | 295 | return TRUE; |
291 | } | 296 | } |
292 | 297 | ||
@@ -294,374 +299,375 @@ DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) | |||
294 | 299 | ||
295 | 300 | ||
296 | static int WSPAPI | 301 | static int WSPAPI |
297 | GNUNET_W32NSP_LookupServiceBegin (LPGUID lpProviderId, LPWSAQUERYSETW lpqsRestrictions, | 302 | GNUNET_W32NSP_LookupServiceBegin(LPGUID lpProviderId, LPWSAQUERYSETW lpqsRestrictions, |
298 | LPWSASERVICECLASSINFOW lpServiceClassInfo, DWORD dwControlFlags, | 303 | LPWSASERVICECLASSINFOW lpServiceClassInfo, DWORD dwControlFlags, |
299 | LPHANDLE lphLookup) | 304 | LPHANDLE lphLookup) |
300 | { | 305 | { |
301 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin\n"); | 306 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin\n"); |
302 | if (IsEqualGUID (lpProviderId, &GNUNET_NAMESPACE_PROVIDER_DNS)) | 307 | if (IsEqualGUID(lpProviderId, &GNUNET_NAMESPACE_PROVIDER_DNS)) |
303 | { | ||
304 | SOCKET s; | ||
305 | if (lpqsRestrictions->dwNameSpace != NS_DNS && lpqsRestrictions->dwNameSpace != NS_ALL) | ||
306 | { | 308 | { |
307 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: wrong namespace\n"); | 309 | SOCKET s; |
308 | SetLastError (WSAEINVAL); | 310 | if (lpqsRestrictions->dwNameSpace != NS_DNS && lpqsRestrictions->dwNameSpace != NS_ALL) |
311 | { | ||
312 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin: wrong namespace\n"); | ||
313 | SetLastError(WSAEINVAL); | ||
314 | return SOCKET_ERROR; | ||
315 | } | ||
316 | if (lpqsRestrictions->lpszServiceInstanceName != NULL) | ||
317 | { | ||
318 | wchar_t *s = lpqsRestrictions->lpszServiceInstanceName; | ||
319 | size_t len = wcslen(s); | ||
320 | if (len >= 5 && wcscmp(&s[len - 5], L".zkey") == 0) | ||
321 | { | ||
322 | } | ||
323 | else if (len >= 4 && wcscmp(&s[len - 4], L".gnu") == 0) | ||
324 | { | ||
325 | } | ||
326 | else | ||
327 | { | ||
328 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin: unsupported TLD\n"); | ||
329 | SetLastError(WSAEINVAL); | ||
330 | return SOCKET_ERROR; | ||
331 | } | ||
332 | } | ||
333 | |||
334 | if (send_name_to_ip_request(lpqsRestrictions, | ||
335 | lpServiceClassInfo, dwControlFlags, &s)) | ||
336 | { | ||
337 | if (!(add_record(s, lpqsRestrictions->lpszServiceInstanceName, dwControlFlags))) | ||
338 | { | ||
339 | DWORD err = GetLastError(); | ||
340 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin: failed to add a record\n"); | ||
341 | closesocket(s); | ||
342 | SetLastError(err); | ||
343 | return SOCKET_ERROR; | ||
344 | } | ||
345 | *lphLookup = (HANDLE)s; | ||
346 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin: OK (%lu)\n", GetLastError()); | ||
347 | return NO_ERROR; | ||
348 | } | ||
309 | return SOCKET_ERROR; | 349 | return SOCKET_ERROR; |
310 | } | 350 | } |
311 | if (lpqsRestrictions->lpszServiceInstanceName != NULL) | 351 | DEBUGLOG("GNUNET_W32NSP_LookupServiceBegin: wrong provider\n"); |
312 | { | 352 | SetLastError(WSAEINVALIDPROVIDER); |
313 | wchar_t *s = lpqsRestrictions->lpszServiceInstanceName; | ||
314 | size_t len = wcslen (s); | ||
315 | if (len >= 5 && wcscmp (&s[len - 5], L".zkey") == 0) | ||
316 | { | ||
317 | } | ||
318 | else if (len >= 4 && wcscmp (&s[len - 4], L".gnu") == 0) | ||
319 | { | ||
320 | } | ||
321 | else | ||
322 | { | ||
323 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: unsupported TLD\n"); | ||
324 | SetLastError (WSAEINVAL); | ||
325 | return SOCKET_ERROR; | ||
326 | } | ||
327 | } | ||
328 | |||
329 | if (send_name_to_ip_request (lpqsRestrictions, | ||
330 | lpServiceClassInfo, dwControlFlags, &s)) | ||
331 | { | ||
332 | if (!(add_record (s, lpqsRestrictions->lpszServiceInstanceName, dwControlFlags))) | ||
333 | { | ||
334 | DWORD err = GetLastError (); | ||
335 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: failed to add a record\n"); | ||
336 | closesocket (s); | ||
337 | SetLastError (err); | ||
338 | return SOCKET_ERROR; | ||
339 | } | ||
340 | *lphLookup = (HANDLE) s; | ||
341 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: OK (%lu)\n", GetLastError ()); | ||
342 | return NO_ERROR; | ||
343 | } | ||
344 | return SOCKET_ERROR; | ||
345 | } | ||
346 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceBegin: wrong provider\n"); | ||
347 | SetLastError (WSAEINVALIDPROVIDER); | ||
348 | return SOCKET_ERROR; | 353 | return SOCKET_ERROR; |
349 | } | 354 | } |
350 | 355 | ||
351 | #define UnmarshallPtr(ptr, ptrtype, base) \ | 356 | #define UnmarshallPtr(ptr, ptrtype, base) \ |
352 | if (ptr) \ | 357 | if (ptr) \ |
353 | ptr = (ptrtype *) (base + (uintptr_t) ptr) | 358 | ptr = (ptrtype *) (base + (uintptr_t)ptr) |
354 | 359 | ||
355 | static void | 360 | static void |
356 | UnmarshallWSAQUERYSETW (LPWSAQUERYSETW req) | 361 | UnmarshallWSAQUERYSETW(LPWSAQUERYSETW req) |
357 | { | 362 | { |
358 | int i; | 363 | int i; |
359 | char *base = (char *) req; | 364 | char *base = (char *)req; |
360 | UnmarshallPtr (req->lpszServiceInstanceName, wchar_t, base); | 365 | |
361 | UnmarshallPtr (req->lpServiceClassId, GUID, base); | 366 | UnmarshallPtr(req->lpszServiceInstanceName, wchar_t, base); |
362 | UnmarshallPtr (req->lpVersion, WSAVERSION, base); | 367 | UnmarshallPtr(req->lpServiceClassId, GUID, base); |
363 | UnmarshallPtr (req->lpszComment, wchar_t, base); | 368 | UnmarshallPtr(req->lpVersion, WSAVERSION, base); |
364 | UnmarshallPtr (req->lpNSProviderId, GUID, base); | 369 | UnmarshallPtr(req->lpszComment, wchar_t, base); |
365 | UnmarshallPtr (req->lpszContext, wchar_t, base); | 370 | UnmarshallPtr(req->lpNSProviderId, GUID, base); |
366 | UnmarshallPtr (req->lpafpProtocols, AFPROTOCOLS, base); | 371 | UnmarshallPtr(req->lpszContext, wchar_t, base); |
367 | UnmarshallPtr (req->lpszQueryString, wchar_t, base); | 372 | UnmarshallPtr(req->lpafpProtocols, AFPROTOCOLS, base); |
368 | UnmarshallPtr (req->lpcsaBuffer, CSADDR_INFO, base); | 373 | UnmarshallPtr(req->lpszQueryString, wchar_t, base); |
374 | UnmarshallPtr(req->lpcsaBuffer, CSADDR_INFO, base); | ||
369 | for (i = 0; i < req->dwNumberOfCsAddrs; i++) | 375 | for (i = 0; i < req->dwNumberOfCsAddrs; i++) |
370 | { | 376 | { |
371 | UnmarshallPtr (req->lpcsaBuffer[i].LocalAddr.lpSockaddr, SOCKADDR, base); | 377 | UnmarshallPtr(req->lpcsaBuffer[i].LocalAddr.lpSockaddr, SOCKADDR, base); |
372 | UnmarshallPtr (req->lpcsaBuffer[i].RemoteAddr.lpSockaddr, SOCKADDR, base); | 378 | UnmarshallPtr(req->lpcsaBuffer[i].RemoteAddr.lpSockaddr, SOCKADDR, base); |
373 | } | 379 | } |
374 | UnmarshallPtr (req->lpBlob, BLOB, base); | 380 | UnmarshallPtr(req->lpBlob, BLOB, base); |
375 | if (req->lpBlob) | 381 | if (req->lpBlob) |
376 | UnmarshallPtr (req->lpBlob->pBlobData, BYTE, base); | 382 | UnmarshallPtr(req->lpBlob->pBlobData, BYTE, base); |
377 | } | 383 | } |
378 | 384 | ||
379 | static int WSAAPI | 385 | static int WSAAPI |
380 | GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, | 386 | GNUNET_W32NSP_LookupServiceNext(HANDLE hLookup, DWORD dwControlFlags, |
381 | LPDWORD lpdwBufferLength, LPWSAQUERYSETW lpqsResults) | 387 | LPDWORD lpdwBufferLength, LPWSAQUERYSETW lpqsResults) |
382 | { | 388 | { |
383 | /*DWORD effective_flags;*/ | 389 | /*DWORD effective_flags;*/ |
384 | int i; | 390 | int i; |
385 | struct GNUNET_MessageHeader header = {0, 0}; | 391 | struct GNUNET_MessageHeader header = { 0, 0 }; |
386 | int rec = -1; | 392 | int rec = -1; |
387 | int rc; | 393 | int rc; |
388 | int to_receive; | 394 | int to_receive; |
389 | int t; | 395 | int t; |
390 | char *buf; | 396 | char *buf; |
391 | 397 | ||
392 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext\n"); | 398 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext\n"); |
393 | //EnterCriticalSection (&records_cs); | 399 | //EnterCriticalSection (&records_cs); |
394 | for (i = 0; i < records_len; i++) | 400 | for (i = 0; i < records_len; i++) |
395 | { | ||
396 | if (records[i].s == (SOCKET) hLookup) | ||
397 | { | 401 | { |
398 | rec = i; | 402 | if (records[i].s == (SOCKET)hLookup) |
399 | break; | 403 | { |
404 | rec = i; | ||
405 | break; | ||
406 | } | ||
400 | } | 407 | } |
401 | } | ||
402 | if (rec == -1) | 408 | if (rec == -1) |
403 | { | 409 | { |
404 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: invalid handle\n"); | 410 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: invalid handle\n"); |
405 | SetLastError (WSA_INVALID_HANDLE); | 411 | SetLastError(WSA_INVALID_HANDLE); |
406 | //LeaveCriticalSection (&records_cs); | 412 | //LeaveCriticalSection (&records_cs); |
407 | return SOCKET_ERROR; | 413 | return SOCKET_ERROR; |
408 | } | 414 | } |
409 | if (records[rec].state & 4) | 415 | if (records[rec].state & 4) |
410 | { | 416 | { |
411 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: session is closed\n"); | 417 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: session is closed\n"); |
412 | SetLastError (WSA_E_NO_MORE); | 418 | SetLastError(WSA_E_NO_MORE); |
413 | //LeaveCriticalSection (&records_cs); | 419 | //LeaveCriticalSection (&records_cs); |
414 | return SOCKET_ERROR; | 420 | return SOCKET_ERROR; |
415 | } | 421 | } |
416 | /*effective_flags = dwControlFlags & records[rec].flags;*/ | 422 | /*effective_flags = dwControlFlags & records[rec].flags;*/ |
417 | if (records[rec].buf) | 423 | if (records[rec].buf) |
418 | { | ||
419 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: checking buffer\n"); | ||
420 | header = *((struct GNUNET_MessageHeader *) records[rec].buf); | ||
421 | if (*lpdwBufferLength < header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)) | ||
422 | { | 424 | { |
423 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: client buffer is too small\n"); | 425 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: checking buffer\n"); |
424 | SetLastError (WSAEFAULT); | 426 | header = *((struct GNUNET_MessageHeader *)records[rec].buf); |
427 | if (*lpdwBufferLength < header.size - sizeof(struct GNUNET_W32RESOLVER_GetMessage)) | ||
428 | { | ||
429 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: client buffer is too small\n"); | ||
430 | SetLastError(WSAEFAULT); | ||
431 | //LeaveCriticalSection (&records_cs); | ||
432 | return SOCKET_ERROR; | ||
433 | } | ||
434 | GNUNET_memcpy(lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)records[rec].buf)[1], header.size - sizeof(struct GNUNET_W32RESOLVER_GetMessage)); | ||
435 | free(records[rec].buf); | ||
436 | records[rec].buf = NULL; | ||
425 | //LeaveCriticalSection (&records_cs); | 437 | //LeaveCriticalSection (&records_cs); |
426 | return SOCKET_ERROR; | 438 | UnmarshallWSAQUERYSETW((LPWSAQUERYSETW)lpqsResults); |
439 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: OK (from buffer)\n"); | ||
440 | return NO_ERROR; | ||
427 | } | 441 | } |
428 | GNUNET_memcpy (lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)records[rec].buf)[1], header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); | ||
429 | free (records[rec].buf); | ||
430 | records[rec].buf = NULL; | ||
431 | //LeaveCriticalSection (&records_cs); | ||
432 | UnmarshallWSAQUERYSETW ((LPWSAQUERYSETW) lpqsResults); | ||
433 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: OK (from buffer)\n"); | ||
434 | return NO_ERROR; | ||
435 | } | ||
436 | records[rec].state |= 8; | 442 | records[rec].state |= 8; |
437 | //LeaveCriticalSection (&records_cs); | 443 | //LeaveCriticalSection (&records_cs); |
438 | to_receive = sizeof (header); | 444 | to_receive = sizeof(header); |
439 | rc = 0; | 445 | rc = 0; |
440 | #if VERBOSE | 446 | #if VERBOSE |
441 | { | 447 | { |
442 | unsigned long have; | 448 | unsigned long have; |
443 | int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); | 449 | int ior = ioctlsocket((SOCKET)hLookup, FIONREAD, &have); |
444 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: reading %d bytes as a header from %p, %lu bytes available\n", to_receive, hLookup, have); | 450 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: reading %d bytes as a header from %p, %lu bytes available\n", to_receive, hLookup, have); |
445 | } | 451 | } |
446 | #endif | 452 | #endif |
447 | while (to_receive > 0) | 453 | while (to_receive > 0) |
448 | { | ||
449 | t = recv ((SOCKET) hLookup, &((char *) &header)[rc], to_receive, 0); | ||
450 | if (t > 0) | ||
451 | { | 454 | { |
452 | rc += t; | 455 | t = recv((SOCKET)hLookup, &((char *)&header)[rc], to_receive, 0); |
453 | to_receive -= t; | 456 | if (t > 0) |
457 | { | ||
458 | rc += t; | ||
459 | to_receive -= t; | ||
460 | } | ||
461 | else | ||
462 | break; | ||
454 | } | 463 | } |
455 | else | ||
456 | break; | ||
457 | } | ||
458 | #if VERBOSE | 464 | #if VERBOSE |
459 | { | 465 | { |
460 | unsigned long have; | 466 | unsigned long have; |
461 | int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); | 467 | int ior = ioctlsocket((SOCKET)hLookup, FIONREAD, &have); |
462 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: read %d bytes as a header from %p, %lu bytes available\n", rc, hLookup, have); | 468 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: read %d bytes as a header from %p, %lu bytes available\n", rc, hLookup, have); |
463 | } | 469 | } |
464 | #endif | 470 | #endif |
465 | //EnterCriticalSection (&records_cs); | 471 | //EnterCriticalSection (&records_cs); |
466 | records[rec].state &= ~8; | 472 | records[rec].state &= ~8; |
467 | if (rc != sizeof (header)) | 473 | if (rc != sizeof(header)) |
468 | { | ||
469 | if (records[rec].state & 2) | ||
470 | { | ||
471 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: call cancelled\n"); | ||
472 | SetLastError (WSA_E_CANCELLED); | ||
473 | } | ||
474 | else | ||
475 | { | 474 | { |
476 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data for a header (rc %d != %u, state is 0x%0X)\n", rc, sizeof (header), records[rec].state); | 475 | if (records[rec].state & 2) |
477 | SetLastError (WSA_E_NO_MORE); | 476 | { |
477 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: call cancelled\n"); | ||
478 | SetLastError(WSA_E_CANCELLED); | ||
479 | } | ||
480 | else | ||
481 | { | ||
482 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data for a header (rc %d != %u, state is 0x%0X)\n", rc, sizeof(header), records[rec].state); | ||
483 | SetLastError(WSA_E_NO_MORE); | ||
484 | } | ||
485 | records[rec].state |= 4; | ||
486 | //LeaveCriticalSection (&records_cs); | ||
487 | return SOCKET_ERROR; | ||
478 | } | 488 | } |
479 | records[rec].state |= 4; | ||
480 | //LeaveCriticalSection (&records_cs); | ||
481 | return SOCKET_ERROR; | ||
482 | } | ||
483 | records[rec].state &= ~8; | 489 | records[rec].state &= ~8; |
484 | header.type = ntohs (header.type); | 490 | header.type = ntohs(header.type); |
485 | header.size = ntohs (header.size); | 491 | header.size = ntohs(header.size); |
486 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: header type %d, header size %u\n", header.type, header.size); | 492 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: header type %d, header size %u\n", header.type, header.size); |
487 | if (header.type != GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE || | 493 | if (header.type != GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE || |
488 | (header.type == GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE && | 494 | (header.type == GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE && |
489 | header.size == sizeof (header))) | 495 | header.size == sizeof(header))) |
490 | { | 496 | { |
491 | records[rec].state |= 4; | 497 | records[rec].state |= 4; |
492 | if (header.type != GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE) | 498 | if (header.type != GNUNET_MESSAGE_TYPE_W32RESOLVER_RESPONSE) |
493 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: header type is wrong\n"); | 499 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: header type is wrong\n"); |
494 | else | 500 | else |
495 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: empty header - no data\n"); | 501 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: empty header - no data\n"); |
496 | //LeaveCriticalSection (&records_cs); | 502 | //LeaveCriticalSection (&records_cs); |
497 | SetLastError (WSA_E_NO_MORE); | 503 | SetLastError(WSA_E_NO_MORE); |
498 | return SOCKET_ERROR; | 504 | return SOCKET_ERROR; |
499 | } | 505 | } |
500 | buf = malloc (header.size); | 506 | buf = malloc(header.size); |
501 | if (buf == NULL) | 507 | if (buf == NULL) |
502 | { | 508 | { |
503 | records[rec].state |= 4; | 509 | records[rec].state |= 4; |
504 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: malloc() failed\n"); | 510 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: malloc() failed\n"); |
505 | //LeaveCriticalSection (&records_cs); | 511 | //LeaveCriticalSection (&records_cs); |
506 | SetLastError (WSA_E_NO_MORE); | 512 | SetLastError(WSA_E_NO_MORE); |
507 | return SOCKET_ERROR; | 513 | return SOCKET_ERROR; |
508 | } | 514 | } |
509 | records[rec].state |= 8; | 515 | records[rec].state |= 8; |
510 | //LeaveCriticalSection (&records_cs); | 516 | //LeaveCriticalSection (&records_cs); |
511 | GNUNET_memcpy (buf, &header, sizeof (header)); | 517 | GNUNET_memcpy(buf, &header, sizeof(header)); |
512 | to_receive = header.size - sizeof (header); | 518 | to_receive = header.size - sizeof(header); |
513 | rc = 0; | 519 | rc = 0; |
514 | #if VERBOSE | 520 | #if VERBOSE |
515 | { | 521 | { |
516 | unsigned long have; | 522 | unsigned long have; |
517 | int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); | 523 | int ior = ioctlsocket((SOCKET)hLookup, FIONREAD, &have); |
518 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: reading %d bytes as a body from %p, %lu bytes available\n", to_receive, hLookup, have); | 524 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: reading %d bytes as a body from %p, %lu bytes available\n", to_receive, hLookup, have); |
519 | } | 525 | } |
520 | #endif | 526 | #endif |
521 | while (to_receive > 0) | 527 | while (to_receive > 0) |
522 | { | ||
523 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: recv (%d)\n", to_receive); | ||
524 | t = recv ((SOCKET) hLookup, &((char *) &((struct GNUNET_MessageHeader *) buf)[1])[rc], to_receive, 0); | ||
525 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: recv returned %d\n", t); | ||
526 | if (t > 0) | ||
527 | { | 528 | { |
528 | rc += t; | 529 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: recv (%d)\n", to_receive); |
529 | to_receive -= t; | 530 | t = recv((SOCKET)hLookup, &((char *)&((struct GNUNET_MessageHeader *)buf)[1])[rc], to_receive, 0); |
531 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: recv returned %d\n", t); | ||
532 | if (t > 0) | ||
533 | { | ||
534 | rc += t; | ||
535 | to_receive -= t; | ||
536 | } | ||
537 | else | ||
538 | break; | ||
530 | } | 539 | } |
531 | else | ||
532 | break; | ||
533 | } | ||
534 | #if VERBOSE | 540 | #if VERBOSE |
535 | { | 541 | { |
536 | unsigned long have; | 542 | unsigned long have; |
537 | int ior = ioctlsocket ((SOCKET) hLookup, FIONREAD, &have); | 543 | int ior = ioctlsocket((SOCKET)hLookup, FIONREAD, &have); |
538 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: read %d bytes as a body from %p, %lu bytes available\n", rc, hLookup, have); | 544 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: read %d bytes as a body from %p, %lu bytes available\n", rc, hLookup, have); |
539 | } | 545 | } |
540 | #endif | 546 | #endif |
541 | //EnterCriticalSection (&records_cs); | 547 | //EnterCriticalSection (&records_cs); |
542 | records[rec].state &= ~8; | 548 | records[rec].state &= ~8; |
543 | if (rc != header.size - sizeof (header)) | 549 | if (rc != header.size - sizeof(header)) |
544 | { | ||
545 | free (buf); | ||
546 | if (records[rec].state & 2) | ||
547 | { | 550 | { |
548 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: call cancelled\n"); | 551 | free(buf); |
549 | SetLastError (WSA_E_CANCELLED); | 552 | if (records[rec].state & 2) |
553 | { | ||
554 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: call cancelled\n"); | ||
555 | SetLastError(WSA_E_CANCELLED); | ||
556 | } | ||
557 | else | ||
558 | { | ||
559 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data for the rest (rc %d != %d, state is 0x%0X)\n", rc, header.size - sizeof(header), records[rec].state); | ||
560 | SetLastError(WSA_E_NO_MORE); | ||
561 | } | ||
562 | records[rec].state |= 4; | ||
563 | //LeaveCriticalSection (&records_cs); | ||
564 | return SOCKET_ERROR; | ||
550 | } | 565 | } |
551 | else | 566 | if (*lpdwBufferLength < header.size - sizeof(struct GNUNET_W32RESOLVER_GetMessage)) |
552 | { | 567 | { |
553 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: failed to receive enough data for the rest (rc %d != %d, state is 0x%0X)\n", rc, header.size - sizeof (header), records[rec].state); | 568 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: client buffer is too small\n"); |
554 | SetLastError (WSA_E_NO_MORE); | 569 | SetLastError(WSAEFAULT); |
570 | records[rec].buf = buf; | ||
571 | //LeaveCriticalSection (&records_cs); | ||
572 | return SOCKET_ERROR; | ||
555 | } | 573 | } |
556 | records[rec].state |= 4; | ||
557 | //LeaveCriticalSection (&records_cs); | ||
558 | return SOCKET_ERROR; | ||
559 | } | ||
560 | if (*lpdwBufferLength < header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)) | ||
561 | { | ||
562 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: client buffer is too small\n"); | ||
563 | SetLastError (WSAEFAULT); | ||
564 | records[rec].buf = buf; | ||
565 | //LeaveCriticalSection (&records_cs); | ||
566 | return SOCKET_ERROR; | ||
567 | } | ||
568 | //LeaveCriticalSection (&records_cs); | 574 | //LeaveCriticalSection (&records_cs); |
569 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: writing %d bytes into result buffer\n", header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); | 575 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: writing %d bytes into result buffer\n", header.size - sizeof(struct GNUNET_W32RESOLVER_GetMessage)); |
570 | GNUNET_memcpy (lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)buf)[1], header.size - sizeof (struct GNUNET_W32RESOLVER_GetMessage)); | 576 | GNUNET_memcpy(lpqsResults, &((struct GNUNET_W32RESOLVER_GetMessage *)buf)[1], header.size - sizeof(struct GNUNET_W32RESOLVER_GetMessage)); |
571 | free (buf); | 577 | free(buf); |
572 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: OK\n"); | 578 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: OK\n"); |
573 | UnmarshallWSAQUERYSETW ((LPWSAQUERYSETW) lpqsResults); | 579 | UnmarshallWSAQUERYSETW((LPWSAQUERYSETW)lpqsResults); |
574 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceNext: returning (%lu)\n", GetLastError ()); | 580 | DEBUGLOG("GNUNET_W32NSP_LookupServiceNext: returning (%lu)\n", GetLastError()); |
575 | return NO_ERROR; | 581 | return NO_ERROR; |
576 | } | 582 | } |
577 | 583 | ||
578 | static int WSPAPI | 584 | static int WSPAPI |
579 | GNUNET_W32NSP_LookupServiceEnd (HANDLE hLookup) | 585 | GNUNET_W32NSP_LookupServiceEnd(HANDLE hLookup) |
580 | { | 586 | { |
581 | int i; | 587 | int i; |
582 | int rec = -1; | 588 | int rec = -1; |
583 | 589 | ||
584 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceEnd\n"); | 590 | DEBUGLOG("GNUNET_W32NSP_LookupServiceEnd\n"); |
585 | //EnterCriticalSection (&records_cs); | 591 | //EnterCriticalSection (&records_cs); |
586 | for (i = 0; i < records_len; i++) | 592 | for (i = 0; i < records_len; i++) |
587 | { | ||
588 | if (records[i].s == (SOCKET) hLookup) | ||
589 | { | 593 | { |
590 | rec = i; | 594 | if (records[i].s == (SOCKET)hLookup) |
591 | break; | 595 | { |
596 | rec = i; | ||
597 | break; | ||
598 | } | ||
592 | } | 599 | } |
593 | } | ||
594 | if (rec == -1) | 600 | if (rec == -1) |
595 | { | 601 | { |
596 | SetLastError (WSA_INVALID_HANDLE); | 602 | SetLastError(WSA_INVALID_HANDLE); |
597 | //LeaveCriticalSection (&records_cs); | 603 | //LeaveCriticalSection (&records_cs); |
598 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceEnd: invalid handle\n"); | 604 | DEBUGLOG("GNUNET_W32NSP_LookupServiceEnd: invalid handle\n"); |
599 | return SOCKET_ERROR; | 605 | return SOCKET_ERROR; |
600 | } | 606 | } |
601 | records[rec].state |= 2; | 607 | records[rec].state |= 2; |
602 | closesocket (records[rec].s); | 608 | closesocket(records[rec].s); |
603 | while (records[rec].state & 8) | 609 | while (records[rec].state & 8) |
604 | { | 610 | { |
605 | //LeaveCriticalSection (&records_cs); | 611 | //LeaveCriticalSection (&records_cs); |
606 | Sleep (10); | 612 | Sleep(10); |
607 | //EnterCriticalSection (&records_cs); | 613 | //EnterCriticalSection (&records_cs); |
608 | } | 614 | } |
609 | if (records[rec].buf) | 615 | if (records[rec].buf) |
610 | free (records[rec].buf); | 616 | free(records[rec].buf); |
611 | records[rec].buf = NULL; | 617 | records[rec].buf = NULL; |
612 | records[rec].state = 0; | 618 | records[rec].state = 0; |
613 | if (records[rec].name) | 619 | if (records[rec].name) |
614 | free (records[rec].name); | 620 | free(records[rec].name); |
615 | //LeaveCriticalSection (&records_cs); | 621 | //LeaveCriticalSection (&records_cs); |
616 | DEBUGLOG ("GNUNET_W32NSP_LookupServiceEnd: OK\n"); | 622 | DEBUGLOG("GNUNET_W32NSP_LookupServiceEnd: OK\n"); |
617 | return NO_ERROR; | 623 | return NO_ERROR; |
618 | } | 624 | } |
619 | 625 | ||
620 | static int WSAAPI | 626 | static int WSAAPI |
621 | GNUNET_W32NSP_SetService (LPGUID lpProviderId, | 627 | GNUNET_W32NSP_SetService(LPGUID lpProviderId, |
622 | LPWSASERVICECLASSINFOW lpServiceClassInfo, LPWSAQUERYSETW lpqsRegInfo, | 628 | LPWSASERVICECLASSINFOW lpServiceClassInfo, LPWSAQUERYSETW lpqsRegInfo, |
623 | WSAESETSERVICEOP essOperation, DWORD dwControlFlags) | 629 | WSAESETSERVICEOP essOperation, DWORD dwControlFlags) |
624 | { | 630 | { |
625 | DEBUGLOG ("GNUNET_W32NSP_SetService\n"); | 631 | DEBUGLOG("GNUNET_W32NSP_SetService\n"); |
626 | SetLastError (WSAEOPNOTSUPP); | 632 | SetLastError(WSAEOPNOTSUPP); |
627 | return SOCKET_ERROR; | 633 | return SOCKET_ERROR; |
628 | } | 634 | } |
629 | 635 | ||
630 | static int WSAAPI | 636 | static int WSAAPI |
631 | GNUNET_W32NSP_InstallServiceClass (LPGUID lpProviderId, | 637 | GNUNET_W32NSP_InstallServiceClass(LPGUID lpProviderId, |
632 | LPWSASERVICECLASSINFOW lpServiceClassInfo) | 638 | LPWSASERVICECLASSINFOW lpServiceClassInfo) |
633 | { | 639 | { |
634 | DEBUGLOG ("GNUNET_W32NSP_InstallServiceClass\n"); | 640 | DEBUGLOG("GNUNET_W32NSP_InstallServiceClass\n"); |
635 | SetLastError (WSAEOPNOTSUPP); | 641 | SetLastError(WSAEOPNOTSUPP); |
636 | return SOCKET_ERROR; | 642 | return SOCKET_ERROR; |
637 | } | 643 | } |
638 | 644 | ||
639 | 645 | ||
640 | static int WSAAPI | 646 | static int WSAAPI |
641 | GNUNET_W32NSP_RemoveServiceClass (LPGUID lpProviderId, LPGUID lpServiceClassId) | 647 | GNUNET_W32NSP_RemoveServiceClass(LPGUID lpProviderId, LPGUID lpServiceClassId) |
642 | { | 648 | { |
643 | DEBUGLOG ("GNUNET_W32NSP_RemoveServiceClass\n"); | 649 | DEBUGLOG("GNUNET_W32NSP_RemoveServiceClass\n"); |
644 | SetLastError (WSAEOPNOTSUPP); | 650 | SetLastError(WSAEOPNOTSUPP); |
645 | return SOCKET_ERROR; | 651 | return SOCKET_ERROR; |
646 | } | 652 | } |
647 | 653 | ||
648 | static int WSAAPI | 654 | static int WSAAPI |
649 | GNUNET_W32NSP_GetServiceClassInfo (LPGUID lpProviderId, LPDWORD lpdwBufSize, | 655 | GNUNET_W32NSP_GetServiceClassInfo(LPGUID lpProviderId, LPDWORD lpdwBufSize, |
650 | LPWSASERVICECLASSINFOW lpServiceClassInfo) | 656 | LPWSASERVICECLASSINFOW lpServiceClassInfo) |
651 | { | 657 | { |
652 | DEBUGLOG ("GNUNET_W32NSP_GetServiceClassInfo\n"); | 658 | DEBUGLOG("GNUNET_W32NSP_GetServiceClassInfo\n"); |
653 | SetLastError (WSAEOPNOTSUPP); | 659 | SetLastError(WSAEOPNOTSUPP); |
654 | return SOCKET_ERROR; | 660 | return SOCKET_ERROR; |
655 | } | 661 | } |
656 | 662 | ||
657 | static int WSAAPI | 663 | static int WSAAPI |
658 | GNUNET_W32NSP_Ioctl (HANDLE hLookup, DWORD dwControlCode, LPVOID lpvInBuffer, | 664 | GNUNET_W32NSP_Ioctl(HANDLE hLookup, DWORD dwControlCode, LPVOID lpvInBuffer, |
659 | DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, | 665 | DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, |
660 | LPDWORD lpcbBytesReturned, LPWSACOMPLETION lpCompletion, | 666 | LPDWORD lpcbBytesReturned, LPWSACOMPLETION lpCompletion, |
661 | LPWSATHREADID lpThreadId) | 667 | LPWSATHREADID lpThreadId) |
662 | { | 668 | { |
663 | DEBUGLOG ("GNUNET_W32NSP_Ioctl\n"); | 669 | DEBUGLOG("GNUNET_W32NSP_Ioctl\n"); |
664 | SetLastError (WSAEOPNOTSUPP); | 670 | SetLastError(WSAEOPNOTSUPP); |
665 | return SOCKET_ERROR; | 671 | return SOCKET_ERROR; |
666 | } | 672 | } |
667 | 673 | ||
@@ -671,35 +677,35 @@ GNUNET_W32NSP_Ioctl (HANDLE hLookup, DWORD dwControlCode, LPVOID lpvInBuffer, | |||
671 | * provider. All other routines are passed as pointers in lpnspRoutines. | 677 | * provider. All other routines are passed as pointers in lpnspRoutines. |
672 | */ | 678 | */ |
673 | int WSAAPI | 679 | int WSAAPI |
674 | GNUNET_W32NSP_NSPStartup (LPGUID lpProviderId, LPNSP_ROUTINE lpnspRoutines) | 680 | GNUNET_W32NSP_NSPStartup(LPGUID lpProviderId, LPNSP_ROUTINE lpnspRoutines) |
675 | { | 681 | { |
676 | if (IsEqualGUID (lpProviderId, &GNUNET_NAMESPACE_PROVIDER_DNS)) | 682 | if (IsEqualGUID(lpProviderId, &GNUNET_NAMESPACE_PROVIDER_DNS)) |
677 | { | ||
678 | if (!connect_to_dns_resolver ()) | ||
679 | { | 683 | { |
680 | return SOCKET_ERROR; | 684 | if (!connect_to_dns_resolver()) |
685 | { | ||
686 | return SOCKET_ERROR; | ||
687 | } | ||
688 | /* This assumes that NSP_ROUTINE struct doesn't have a NSPIoctl member. | ||
689 | * If it does, you need to use FIELD_OFFSET() macro to get offset of NSPIoctl | ||
690 | * and use that offset as cbSize. | ||
691 | */ | ||
692 | lpnspRoutines->cbSize = sizeof(NSP_ROUTINE); | ||
693 | |||
694 | lpnspRoutines->dwMajorVersion = NSPAPI_VERSION_MAJOR; | ||
695 | lpnspRoutines->dwMinorVersion = NSPAPI_VERSION_MINOR; | ||
696 | lpnspRoutines->NSPCleanup = NSPCleanup; | ||
697 | lpnspRoutines->NSPLookupServiceBegin = GNUNET_W32NSP_LookupServiceBegin; | ||
698 | lpnspRoutines->NSPLookupServiceNext = GNUNET_W32NSP_LookupServiceNext; | ||
699 | lpnspRoutines->NSPLookupServiceEnd = GNUNET_W32NSP_LookupServiceEnd; | ||
700 | lpnspRoutines->NSPSetService = GNUNET_W32NSP_SetService; | ||
701 | lpnspRoutines->NSPInstallServiceClass = GNUNET_W32NSP_InstallServiceClass; | ||
702 | lpnspRoutines->NSPRemoveServiceClass = GNUNET_W32NSP_RemoveServiceClass; | ||
703 | lpnspRoutines->NSPGetServiceClassInfo = GNUNET_W32NSP_GetServiceClassInfo; | ||
704 | /*((NSP_ROUTINE_XP *) lpnspRoutines)->NSPIoctl = GNUNET_W32NSP_Ioctl;*/ | ||
705 | lpnspRoutines->NSPIoctl = GNUNET_W32NSP_Ioctl; | ||
706 | return NO_ERROR; | ||
681 | } | 707 | } |
682 | /* This assumes that NSP_ROUTINE struct doesn't have a NSPIoctl member. | 708 | SetLastError(WSAEINVALIDPROVIDER); |
683 | * If it does, you need to use FIELD_OFFSET() macro to get offset of NSPIoctl | ||
684 | * and use that offset as cbSize. | ||
685 | */ | ||
686 | lpnspRoutines->cbSize = sizeof(NSP_ROUTINE); | ||
687 | |||
688 | lpnspRoutines->dwMajorVersion = NSPAPI_VERSION_MAJOR; | ||
689 | lpnspRoutines->dwMinorVersion = NSPAPI_VERSION_MINOR; | ||
690 | lpnspRoutines->NSPCleanup = NSPCleanup; | ||
691 | lpnspRoutines->NSPLookupServiceBegin = GNUNET_W32NSP_LookupServiceBegin; | ||
692 | lpnspRoutines->NSPLookupServiceNext = GNUNET_W32NSP_LookupServiceNext; | ||
693 | lpnspRoutines->NSPLookupServiceEnd = GNUNET_W32NSP_LookupServiceEnd; | ||
694 | lpnspRoutines->NSPSetService = GNUNET_W32NSP_SetService; | ||
695 | lpnspRoutines->NSPInstallServiceClass = GNUNET_W32NSP_InstallServiceClass; | ||
696 | lpnspRoutines->NSPRemoveServiceClass = GNUNET_W32NSP_RemoveServiceClass; | ||
697 | lpnspRoutines->NSPGetServiceClassInfo = GNUNET_W32NSP_GetServiceClassInfo; | ||
698 | /*((NSP_ROUTINE_XP *) lpnspRoutines)->NSPIoctl = GNUNET_W32NSP_Ioctl;*/ | ||
699 | lpnspRoutines->NSPIoctl = GNUNET_W32NSP_Ioctl; | ||
700 | return NO_ERROR; | ||
701 | } | ||
702 | SetLastError (WSAEINVALIDPROVIDER); | ||
703 | return SOCKET_ERROR; | 709 | return SOCKET_ERROR; |
704 | } | 710 | } |
705 | 711 | ||