diff options
Diffstat (limited to 'src/nat/gnunet-helper-nat-server-windows.c')
-rw-r--r-- | src/nat/gnunet-helper-nat-server-windows.c | 419 |
1 files changed, 179 insertions, 240 deletions
diff --git a/src/nat/gnunet-helper-nat-server-windows.c b/src/nat/gnunet-helper-nat-server-windows.c index 7a607c62d..727a7be67 100644 --- a/src/nat/gnunet-helper-nat-server-windows.c +++ b/src/nat/gnunet-helper-nat-server-windows.c | |||
@@ -118,12 +118,12 @@ struct ip_header | |||
118 | /** | 118 | /** |
119 | * Time to live | 119 | * Time to live |
120 | */ | 120 | */ |
121 | uint8_t ttl; | 121 | uint8_t ttl; |
122 | 122 | ||
123 | /** | 123 | /** |
124 | * Protocol | 124 | * Protocol |
125 | */ | 125 | */ |
126 | uint8_t proto; | 126 | uint8_t proto; |
127 | 127 | ||
128 | /** | 128 | /** |
129 | * Header checksum | 129 | * Header checksum |
@@ -133,12 +133,12 @@ struct ip_header | |||
133 | /** | 133 | /** |
134 | * Source address | 134 | * Source address |
135 | */ | 135 | */ |
136 | uint32_t src_ip; | 136 | uint32_t src_ip; |
137 | 137 | ||
138 | /** | 138 | /** |
139 | * Destination address | 139 | * Destination address |
140 | */ | 140 | */ |
141 | uint32_t dst_ip; | 141 | uint32_t dst_ip; |
142 | }; | 142 | }; |
143 | 143 | ||
144 | /** | 144 | /** |
@@ -211,17 +211,16 @@ static struct in_addr dummy; | |||
211 | * @return the CRC 16. | 211 | * @return the CRC 16. |
212 | */ | 212 | */ |
213 | static uint16_t | 213 | static uint16_t |
214 | calc_checksum(const uint16_t *data, | 214 | calc_checksum (const uint16_t * data, unsigned int bytes) |
215 | unsigned int bytes) | ||
216 | { | 215 | { |
217 | uint32_t sum; | 216 | uint32_t sum; |
218 | unsigned int i; | 217 | unsigned int i; |
219 | 218 | ||
220 | sum = 0; | 219 | sum = 0; |
221 | for (i=0;i<bytes/2;i++) | 220 | for (i = 0; i < bytes / 2; i++) |
222 | sum += data[i]; | 221 | sum += data[i]; |
223 | sum = (sum & 0xffff) + (sum >> 16); | 222 | sum = (sum & 0xffff) + (sum >> 16); |
224 | sum = htons(0xffff - sum); | 223 | sum = htons (0xffff - sum); |
225 | return sum; | 224 | return sum; |
226 | } | 225 | } |
227 | 226 | ||
@@ -235,19 +234,14 @@ calc_checksum(const uint16_t *data, | |||
235 | * @return 1 on success | 234 | * @return 1 on success |
236 | */ | 235 | */ |
237 | static int | 236 | static int |
238 | inet_pton (int af, | 237 | inet_pton (int af, const char *cp, struct in_addr *buf) |
239 | const char *cp, | ||
240 | struct in_addr *buf) | ||
241 | { | 238 | { |
242 | buf->s_addr = inet_addr(cp); | 239 | buf->s_addr = inet_addr (cp); |
243 | if (buf->s_addr == INADDR_NONE) | 240 | if (buf->s_addr == INADDR_NONE) |
244 | { | 241 | { |
245 | fprintf(stderr, | 242 | fprintf (stderr, "Error %d handling address %s", WSAGetLastError (), cp); |
246 | "Error %d handling address %s", | 243 | return 0; |
247 | WSAGetLastError(), | 244 | } |
248 | cp); | ||
249 | return 0; | ||
250 | } | ||
251 | return 1; | 245 | return 1; |
252 | } | 246 | } |
253 | 247 | ||
@@ -278,43 +272,35 @@ send_icmp_echo (const struct in_addr *my_ip) | |||
278 | ip_pkt.checksum = 0; | 272 | ip_pkt.checksum = 0; |
279 | ip_pkt.src_ip = my_ip->s_addr; | 273 | ip_pkt.src_ip = my_ip->s_addr; |
280 | ip_pkt.dst_ip = dummy.s_addr; | 274 | ip_pkt.dst_ip = dummy.s_addr; |
281 | ip_pkt.checksum = htons(calc_checksum((uint16_t*)&ip_pkt, | 275 | ip_pkt.checksum = htons (calc_checksum ((uint16_t *) & ip_pkt, |
282 | sizeof (struct ip_header))); | 276 | sizeof (struct ip_header))); |
283 | memcpy (&packet[off], | 277 | memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); |
284 | &ip_pkt, | ||
285 | sizeof (struct ip_header)); | ||
286 | off += sizeof (struct ip_header); | 278 | off += sizeof (struct ip_header); |
287 | 279 | ||
288 | icmp_echo.type = ICMP_ECHO; | 280 | icmp_echo.type = ICMP_ECHO; |
289 | icmp_echo.code = 0; | 281 | icmp_echo.code = 0; |
290 | icmp_echo.reserved = 0; | 282 | icmp_echo.reserved = 0; |
291 | icmp_echo.checksum = 0; | 283 | icmp_echo.checksum = 0; |
292 | icmp_echo.checksum = htons(calc_checksum((uint16_t*) &icmp_echo, | 284 | icmp_echo.checksum = htons (calc_checksum ((uint16_t *) & icmp_echo, |
293 | sizeof (struct icmp_echo_header))); | 285 | sizeof (struct icmp_echo_header))); |
294 | memcpy (&packet[off], | 286 | memcpy (&packet[off], &icmp_echo, sizeof (struct icmp_echo_header)); |
295 | &icmp_echo, | ||
296 | sizeof (struct icmp_echo_header)); | ||
297 | off += sizeof (struct icmp_echo_header); | 287 | off += sizeof (struct icmp_echo_header); |
298 | 288 | ||
299 | memset (&dst, 0, sizeof (dst)); | 289 | memset (&dst, 0, sizeof (dst)); |
300 | dst.sin_family = AF_INET; | 290 | dst.sin_family = AF_INET; |
301 | dst.sin_addr = dummy; | 291 | dst.sin_addr = dummy; |
302 | err = sendto(rawsock, | 292 | err = sendto (rawsock, |
303 | packet, off, 0, | 293 | packet, off, 0, (struct sockaddr *) &dst, sizeof (dst)); |
304 | (struct sockaddr*)&dst, | ||
305 | sizeof(dst)); | ||
306 | if (err < 0) | 294 | if (err < 0) |
307 | { | 295 | { |
308 | #if VERBOSE | 296 | #if VERBOSE |
309 | fprintf(stderr, | 297 | fprintf (stderr, "sendto failed: %s\n", strerror (errno)); |
310 | "sendto failed: %s\n", strerror(errno)); | ||
311 | #endif | 298 | #endif |
312 | } | 299 | } |
313 | else if (err != off) | 300 | else if (err != off) |
314 | { | 301 | { |
315 | fprintf(stderr, | 302 | fprintf (stderr, "Error: partial send of ICMP message\n"); |
316 | "Error: partial send of ICMP message\n"); | 303 | } |
317 | } | ||
318 | } | 304 | } |
319 | 305 | ||
320 | 306 | ||
@@ -331,22 +317,17 @@ send_udp () | |||
331 | dst.sin_family = AF_INET; | 317 | dst.sin_family = AF_INET; |
332 | dst.sin_addr = dummy; | 318 | dst.sin_addr = dummy; |
333 | dst.sin_port = htons (NAT_TRAV_PORT); | 319 | dst.sin_port = htons (NAT_TRAV_PORT); |
334 | err = sendto(udpsock, | 320 | err = sendto (udpsock, NULL, 0, 0, (struct sockaddr *) &dst, sizeof (dst)); |
335 | NULL, 0, 0, | ||
336 | (struct sockaddr*)&dst, | ||
337 | sizeof(dst)); | ||
338 | if (err < 0) | 321 | if (err < 0) |
339 | { | 322 | { |
340 | #if VERBOSE | 323 | #if VERBOSE |
341 | fprintf(stderr, | 324 | fprintf (stderr, "sendto failed: %s\n", strerror (errno)); |
342 | "sendto failed: %s\n", strerror(errno)); | ||
343 | #endif | 325 | #endif |
344 | } | 326 | } |
345 | else if (0 != err) | 327 | else if (0 != err) |
346 | { | 328 | { |
347 | fprintf(stderr, | 329 | fprintf (stderr, "Error: partial send of ICMP message\n"); |
348 | "Error: partial send of ICMP message\n"); | 330 | } |
349 | } | ||
350 | } | 331 | } |
351 | 332 | ||
352 | 333 | ||
@@ -369,96 +350,74 @@ process_icmp_response () | |||
369 | 350 | ||
370 | have = read (icmpsock, buf, sizeof (buf)); | 351 | have = read (icmpsock, buf, sizeof (buf)); |
371 | if (have == -1) | 352 | if (have == -1) |
372 | { | 353 | { |
373 | fprintf (stderr, | 354 | fprintf (stderr, "Error reading raw socket: %s\n", strerror (errno)); |
374 | "Error reading raw socket: %s\n", | 355 | return; |
375 | strerror (errno)); | 356 | } |
376 | return; | ||
377 | } | ||
378 | #if VERBOSE | 357 | #if VERBOSE |
379 | fprintf (stderr, | 358 | fprintf (stderr, "Received message of %u bytes\n", (unsigned int) have); |
380 | "Received message of %u bytes\n", | ||
381 | (unsigned int) have); | ||
382 | #endif | 359 | #endif |
383 | if (have < (ssize_t) (sizeof (struct ip_header) + sizeof (struct icmp_ttl_exceeded_header) + sizeof (struct ip_header))) | 360 | if (have < |
384 | { | 361 | (ssize_t) (sizeof (struct ip_header) + |
385 | /* malformed */ | 362 | sizeof (struct icmp_ttl_exceeded_header) + |
386 | return; | 363 | sizeof (struct ip_header))) |
387 | } | 364 | { |
365 | /* malformed */ | ||
366 | return; | ||
367 | } | ||
388 | off = 0; | 368 | off = 0; |
389 | memcpy (&ip_pkt, | 369 | memcpy (&ip_pkt, &buf[off], sizeof (struct ip_header)); |
390 | &buf[off], | ||
391 | sizeof (struct ip_header)); | ||
392 | off += sizeof (struct ip_header); | 370 | off += sizeof (struct ip_header); |
393 | memcpy(&source_ip, | 371 | memcpy (&source_ip, &ip_pkt.src_ip, sizeof (source_ip)); |
394 | &ip_pkt.src_ip, | 372 | memcpy (&icmp_ttl, &buf[off], sizeof (struct icmp_ttl_exceeded_header)); |
395 | sizeof (source_ip)); | ||
396 | memcpy (&icmp_ttl, | ||
397 | &buf[off], | ||
398 | sizeof (struct icmp_ttl_exceeded_header)); | ||
399 | off += sizeof (struct icmp_ttl_exceeded_header); | 373 | off += sizeof (struct icmp_ttl_exceeded_header); |
400 | if ( (ICMP_TIME_EXCEEDED != icmp_ttl.type) || | 374 | if ((ICMP_TIME_EXCEEDED != icmp_ttl.type) || (0 != icmp_ttl.code)) |
401 | (0 != icmp_ttl.code) ) | 375 | { |
402 | { | 376 | /* different type than what we want */ |
403 | /* different type than what we want */ | 377 | return; |
404 | return; | 378 | } |
405 | } | ||
406 | /* skip 2nd IP header */ | 379 | /* skip 2nd IP header */ |
407 | memcpy (&ip_pkt, | 380 | memcpy (&ip_pkt, &buf[off], sizeof (struct ip_header)); |
408 | &buf[off], | ||
409 | sizeof (struct ip_header)); | ||
410 | off += sizeof (struct ip_header); | 381 | off += sizeof (struct ip_header); |
411 | 382 | ||
412 | switch (ip_pkt.proto) | 383 | switch (ip_pkt.proto) |
384 | { | ||
385 | case IPPROTO_ICMP: | ||
386 | if (have != (sizeof (struct ip_header) * 2 + | ||
387 | sizeof (struct icmp_ttl_exceeded_header) + | ||
388 | sizeof (struct icmp_echo_header))) | ||
413 | { | 389 | { |
414 | case IPPROTO_ICMP: | 390 | /* malformed */ |
415 | if (have != (sizeof (struct ip_header) * 2 + | ||
416 | sizeof (struct icmp_ttl_exceeded_header) + | ||
417 | sizeof (struct icmp_echo_header)) ) | ||
418 | { | ||
419 | /* malformed */ | ||
420 | return; | ||
421 | } | ||
422 | /* grab ICMP ECHO content */ | ||
423 | memcpy (&icmp_echo, | ||
424 | &buf[off], | ||
425 | sizeof (struct icmp_echo_header)); | ||
426 | port = (uint16_t) ntohl (icmp_echo.reserved); | ||
427 | break; | ||
428 | case IPPROTO_UDP: | ||
429 | if (have != (sizeof (struct ip_header) * 2 + | ||
430 | sizeof (struct icmp_ttl_exceeded_header) + | ||
431 | sizeof (struct udp_header)) ) | ||
432 | { | ||
433 | /* malformed */ | ||
434 | return; | ||
435 | } | ||
436 | /* grab UDP content */ | ||
437 | memcpy (&udp_pkt, | ||
438 | &buf[off], | ||
439 | sizeof (struct udp_header)); | ||
440 | port = ntohs (udp_pkt.length); | ||
441 | break; | ||
442 | default: | ||
443 | /* different type than what we want */ | ||
444 | return; | 391 | return; |
445 | } | 392 | } |
446 | 393 | /* grab ICMP ECHO content */ | |
447 | ssize = sizeof(buf); | 394 | memcpy (&icmp_echo, &buf[off], sizeof (struct icmp_echo_header)); |
448 | WSAAddressToString((LPSOCKADDR)&source_ip, | 395 | port = (uint16_t) ntohl (icmp_echo.reserved); |
449 | sizeof(source_ip), | 396 | break; |
450 | NULL, | 397 | case IPPROTO_UDP: |
451 | buf, | 398 | if (have != (sizeof (struct ip_header) * 2 + |
452 | &ssize); | 399 | sizeof (struct icmp_ttl_exceeded_header) + |
400 | sizeof (struct udp_header))) | ||
401 | { | ||
402 | /* malformed */ | ||
403 | return; | ||
404 | } | ||
405 | /* grab UDP content */ | ||
406 | memcpy (&udp_pkt, &buf[off], sizeof (struct udp_header)); | ||
407 | port = ntohs (udp_pkt.length); | ||
408 | break; | ||
409 | default: | ||
410 | /* different type than what we want */ | ||
411 | return; | ||
412 | } | ||
413 | |||
414 | ssize = sizeof (buf); | ||
415 | WSAAddressToString ((LPSOCKADDR) & source_ip, | ||
416 | sizeof (source_ip), NULL, buf, &ssize); | ||
453 | if (port == 0) | 417 | if (port == 0) |
454 | fprintf (stdout, | 418 | fprintf (stdout, "%s\n", buf); |
455 | "%s\n", | ||
456 | buf); | ||
457 | else | 419 | else |
458 | fprintf (stdout, | 420 | fprintf (stdout, "%s:%u\n", buf, (unsigned int) port); |
459 | "%s:%u\n", | ||
460 | buf, | ||
461 | (unsigned int) port); | ||
462 | fflush (stdout); | 421 | fflush (stdout); |
463 | } | 422 | } |
464 | 423 | ||
@@ -475,12 +434,10 @@ make_icmp_socket () | |||
475 | 434 | ||
476 | ret = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); | 435 | ret = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); |
477 | if (INVALID_SOCKET == ret) | 436 | if (INVALID_SOCKET == ret) |
478 | { | 437 | { |
479 | fprintf (stderr, | 438 | fprintf (stderr, "Error opening RAW socket: %s\n", strerror (errno)); |
480 | "Error opening RAW socket: %s\n", | 439 | return INVALID_SOCKET; |
481 | strerror (errno)); | 440 | } |
482 | return INVALID_SOCKET; | ||
483 | } | ||
484 | return ret; | 441 | return ret; |
485 | } | 442 | } |
486 | 443 | ||
@@ -494,39 +451,30 @@ static SOCKET | |||
494 | make_raw_socket () | 451 | make_raw_socket () |
495 | { | 452 | { |
496 | DWORD bOptVal = TRUE; | 453 | DWORD bOptVal = TRUE; |
497 | int bOptLen = sizeof(bOptVal); | 454 | int bOptLen = sizeof (bOptVal); |
498 | 455 | ||
499 | rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); | 456 | rawsock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP); |
500 | if (INVALID_SOCKET == rawsock) | 457 | if (INVALID_SOCKET == rawsock) |
501 | { | 458 | { |
502 | fprintf (stderr, | 459 | fprintf (stderr, "Error opening RAW socket: %s\n", strerror (errno)); |
503 | "Error opening RAW socket: %s\n", | 460 | return INVALID_SOCKET; |
504 | strerror (errno)); | 461 | } |
505 | return INVALID_SOCKET; | 462 | |
506 | } | 463 | if (0 != setsockopt (rawsock, |
507 | 464 | SOL_SOCKET, SO_BROADCAST, (char *) &bOptVal, bOptLen)) | |
508 | if (0 != setsockopt(rawsock, | 465 | { |
509 | SOL_SOCKET, | 466 | fprintf (stderr, |
510 | SO_BROADCAST, | 467 | "Error setting SO_BROADCAST to ON: %s\n", strerror (errno)); |
511 | (char*)&bOptVal, bOptLen)) | 468 | closesocket (rawsock); |
512 | { | 469 | return INVALID_SOCKET; |
513 | fprintf(stderr, | 470 | } |
514 | "Error setting SO_BROADCAST to ON: %s\n", | 471 | if (0 != setsockopt (rawsock, |
515 | strerror (errno)); | 472 | IPPROTO_IP, IP_HDRINCL, (char *) &bOptVal, bOptLen)) |
516 | closesocket(rawsock); | 473 | { |
517 | return INVALID_SOCKET; | 474 | fprintf (stderr, "Error setting IP_HDRINCL to ON: %s\n", strerror (errno)); |
518 | } | 475 | closesocket (rawsock); |
519 | if (0 != setsockopt(rawsock, | 476 | return INVALID_SOCKET; |
520 | IPPROTO_IP, | 477 | } |
521 | IP_HDRINCL, | ||
522 | (char*)&bOptVal, bOptLen)) | ||
523 | { | ||
524 | fprintf(stderr, | ||
525 | "Error setting IP_HDRINCL to ON: %s\n", | ||
526 | strerror (errno)); | ||
527 | closesocket(rawsock); | ||
528 | return INVALID_SOCKET; | ||
529 | } | ||
530 | return rawsock; | 478 | return rawsock; |
531 | } | 479 | } |
532 | 480 | ||
@@ -545,33 +493,27 @@ make_udp_socket (const struct in_addr *my_ip) | |||
545 | 493 | ||
546 | ret = socket (AF_INET, SOCK_DGRAM, 0); | 494 | ret = socket (AF_INET, SOCK_DGRAM, 0); |
547 | if (INVALID_SOCKET == ret) | 495 | if (INVALID_SOCKET == ret) |
548 | { | 496 | { |
549 | fprintf (stderr, | 497 | fprintf (stderr, "Error opening UDP socket: %s\n", strerror (errno)); |
550 | "Error opening UDP socket: %s\n", | 498 | return INVALID_SOCKET; |
551 | strerror (errno)); | 499 | } |
552 | return INVALID_SOCKET; | ||
553 | } | ||
554 | memset (&addr, 0, sizeof (addr)); | 500 | memset (&addr, 0, sizeof (addr)); |
555 | addr.sin_family = AF_INET; | 501 | addr.sin_family = AF_INET; |
556 | addr.sin_addr = *my_ip; | 502 | addr.sin_addr = *my_ip; |
557 | addr.sin_port = htons (NAT_TRAV_PORT); | 503 | addr.sin_port = htons (NAT_TRAV_PORT); |
558 | if (0 != bind (ret, | 504 | if (0 != bind (ret, (struct sockaddr *) &addr, sizeof (addr))) |
559 | (struct sockaddr *)&addr, | 505 | { |
560 | sizeof(addr))) | 506 | fprintf (stderr, |
561 | { | 507 | "Error binding UDP socket to port %u: %s\n", |
562 | fprintf (stderr, | 508 | NAT_TRAV_PORT, strerror (errno)); |
563 | "Error binding UDP socket to port %u: %s\n", | 509 | /* likely problematic, but not certain, try to continue */ |
564 | NAT_TRAV_PORT, | 510 | } |
565 | strerror (errno)); | ||
566 | /* likely problematic, but not certain, try to continue */ | ||
567 | } | ||
568 | return ret; | 511 | return ret; |
569 | } | 512 | } |
570 | 513 | ||
571 | 514 | ||
572 | int | 515 | int |
573 | main (int argc, | 516 | main (int argc, char *const *argv) |
574 | char *const *argv) | ||
575 | { | 517 | { |
576 | struct in_addr external; | 518 | struct in_addr external; |
577 | fd_set rs; | 519 | fd_set rs; |
@@ -581,70 +523,67 @@ main (int argc, | |||
581 | 523 | ||
582 | alt = 0; | 524 | alt = 0; |
583 | if (2 != argc) | 525 | if (2 != argc) |
584 | { | 526 | { |
585 | fprintf (stderr, | 527 | fprintf (stderr, |
586 | "This program must be started with our (internal NAT) IP as the only argument.\n"); | 528 | "This program must be started with our (internal NAT) IP as the only argument.\n"); |
587 | return 1; | 529 | return 1; |
588 | } | 530 | } |
589 | if (1 != inet_pton (AF_INET, argv[1], &external)) | 531 | if (1 != inet_pton (AF_INET, argv[1], &external)) |
590 | { | 532 | { |
591 | fprintf (stderr, | 533 | fprintf (stderr, |
592 | "Error parsing IPv4 address: %s, error %s\n", | 534 | "Error parsing IPv4 address: %s, error %s\n", |
593 | argv[1], strerror (errno)); | 535 | argv[1], strerror (errno)); |
594 | return 1; | 536 | return 1; |
595 | } | 537 | } |
596 | if (1 != inet_pton (AF_INET, DUMMY_IP, &dummy)) | 538 | if (1 != inet_pton (AF_INET, DUMMY_IP, &dummy)) |
597 | { | 539 | { |
598 | fprintf (stderr, | 540 | fprintf (stderr, "Internal error converting dummy IP to binary.\n"); |
599 | "Internal error converting dummy IP to binary.\n"); | 541 | return 2; |
600 | return 2; | 542 | } |
601 | } | ||
602 | if (WSAStartup (MAKEWORD (2, 1), &wsaData) != 0) | 543 | if (WSAStartup (MAKEWORD (2, 1), &wsaData) != 0) |
603 | { | 544 | { |
604 | fprintf (stderr, "Failed to find Winsock 2.1 or better.\n"); | 545 | fprintf (stderr, "Failed to find Winsock 2.1 or better.\n"); |
605 | return 2; | 546 | return 2; |
606 | } | 547 | } |
607 | if (INVALID_SOCKET == (icmpsock = make_icmp_socket())) | 548 | if (INVALID_SOCKET == (icmpsock = make_icmp_socket ())) |
608 | { | 549 | { |
609 | return 3; | 550 | return 3; |
610 | } | 551 | } |
611 | if (INVALID_SOCKET == (make_raw_socket())) | 552 | if (INVALID_SOCKET == (make_raw_socket ())) |
612 | { | 553 | { |
613 | closesocket (icmpsock); | 554 | closesocket (icmpsock); |
614 | return 3; | 555 | return 3; |
615 | } | 556 | } |
616 | if (INVALID_SOCKET == (udpsock = make_udp_socket(&external))) | 557 | if (INVALID_SOCKET == (udpsock = make_udp_socket (&external))) |
617 | { | 558 | { |
618 | closesocket (icmpsock); | 559 | closesocket (icmpsock); |
619 | closesocket (rawsock); | 560 | closesocket (rawsock); |
620 | return 3; | 561 | return 3; |
621 | } | 562 | } |
622 | while (1) | 563 | while (1) |
564 | { | ||
565 | FD_ZERO (&rs); | ||
566 | FD_SET (icmpsock, &rs); | ||
567 | tv.tv_sec = 0; | ||
568 | tv.tv_usec = ICMP_SEND_FREQUENCY_MS * 1000; | ||
569 | if (-1 == select (icmpsock + 1, &rs, NULL, NULL, &tv)) | ||
623 | { | 570 | { |
624 | FD_ZERO (&rs); | 571 | if (errno == EINTR) |
625 | FD_SET (icmpsock, &rs); | 572 | continue; |
626 | tv.tv_sec = 0; | 573 | fprintf (stderr, "select failed: %s\n", strerror (errno)); |
627 | tv.tv_usec = ICMP_SEND_FREQUENCY_MS * 1000; | 574 | break; |
628 | if (-1 == select (icmpsock + 1, &rs, NULL, NULL, &tv)) | ||
629 | { | ||
630 | if (errno == EINTR) | ||
631 | continue; | ||
632 | fprintf (stderr, | ||
633 | "select failed: %s\n", | ||
634 | strerror (errno)); | ||
635 | break; | ||
636 | } | ||
637 | if (FD_ISSET (icmpsock, &rs)) | ||
638 | process_icmp_response (); | ||
639 | if (0 == (++alt % 2)) | ||
640 | send_icmp_echo (&external); | ||
641 | else | ||
642 | send_udp (); | ||
643 | } | 575 | } |
576 | if (FD_ISSET (icmpsock, &rs)) | ||
577 | process_icmp_response (); | ||
578 | if (0 == (++alt % 2)) | ||
579 | send_icmp_echo (&external); | ||
580 | else | ||
581 | send_udp (); | ||
582 | } | ||
644 | /* select failed (internal error or OS out of resources) */ | 583 | /* select failed (internal error or OS out of resources) */ |
645 | closesocket(icmpsock); | 584 | closesocket (icmpsock); |
646 | closesocket(rawsock); | 585 | closesocket (rawsock); |
647 | closesocket(udpsock); | 586 | closesocket (udpsock); |
648 | WSACleanup (); | 587 | WSACleanup (); |
649 | return 4; | 588 | return 4; |
650 | } | 589 | } |