aboutsummaryrefslogtreecommitdiff
path: root/src/gns/w32nsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gns/w32nsp.c')
-rw-r--r--src/gns/w32nsp.c728
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
81static CRITICAL_SECTION records_cs; 81static CRITICAL_SECTION records_cs;
82 82
83struct record 83struct 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;
94static size_t records_size = 0; 93static size_t records_size = 0;
95 94
96static int 95static int
97resize_records () 96resize_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
114static int 114static int
115add_record (SOCKET s, const wchar_t *name, DWORD flags) 115add_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*/
148typedef INT (WSPAPI *LPNSPIOCTL) (HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION,LPWSATHREADID); 149typedef INT (WSPAPI *LPNSPIOCTL)(HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSACOMPLETION, LPWSATHREADID);
149typedef struct _NSP_ROUTINE_XP { 150typedef 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
164static SOCKET 165static SOCKET
165connect_to_dns_resolver () 166connect_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
194static int 195static int
195send_name_to_ip_request (LPWSAQUERYSETW lpqsRestrictions, 196send_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
259static int WSPAPI 261static int WSPAPI
260NSPCleanup (LPGUID lpProviderId) 262NSPCleanup(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
271BOOL WINAPI 273BOOL WINAPI
272DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 274DllMain(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
296static int WSPAPI 301static int WSPAPI
297GNUNET_W32NSP_LookupServiceBegin (LPGUID lpProviderId, LPWSAQUERYSETW lpqsRestrictions, 302GNUNET_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
355static void 360static void
356UnmarshallWSAQUERYSETW (LPWSAQUERYSETW req) 361UnmarshallWSAQUERYSETW(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
379static int WSAAPI 385static int WSAAPI
380GNUNET_W32NSP_LookupServiceNext (HANDLE hLookup, DWORD dwControlFlags, 386GNUNET_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
578static int WSPAPI 584static int WSPAPI
579GNUNET_W32NSP_LookupServiceEnd (HANDLE hLookup) 585GNUNET_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
620static int WSAAPI 626static int WSAAPI
621GNUNET_W32NSP_SetService (LPGUID lpProviderId, 627GNUNET_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
630static int WSAAPI 636static int WSAAPI
631GNUNET_W32NSP_InstallServiceClass (LPGUID lpProviderId, 637GNUNET_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
640static int WSAAPI 646static int WSAAPI
641GNUNET_W32NSP_RemoveServiceClass (LPGUID lpProviderId, LPGUID lpServiceClassId) 647GNUNET_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
648static int WSAAPI 654static int WSAAPI
649GNUNET_W32NSP_GetServiceClassInfo (LPGUID lpProviderId, LPDWORD lpdwBufSize, 655GNUNET_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
657static int WSAAPI 663static int WSAAPI
658GNUNET_W32NSP_Ioctl (HANDLE hLookup, DWORD dwControlCode, LPVOID lpvInBuffer, 664GNUNET_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 */
673int WSAAPI 679int WSAAPI
674GNUNET_W32NSP_NSPStartup (LPGUID lpProviderId, LPNSP_ROUTINE lpnspRoutines) 680GNUNET_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