Changeset 745 for trunk/server/lib/util/util_net.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/lib/util/util_net.c
r414 r745 28 28 #include "system/locale.h" 29 29 #include "system/filesys.h" 30 #include "lib/util/util_net.h" 30 31 #undef strcasecmp 31 32 … … 36 37 void zero_sockaddr(struct sockaddr_storage *pss) 37 38 { 38 memset(pss, '\0', sizeof(*pss));39 ZERO_STRUCTP(pss); 39 40 /* Ensure we're at least a valid sockaddr-storage. */ 40 41 pss->ss_family = AF_INET; … … 50 51 struct addrinfo hints; 51 52 52 memset(&hints, '\0', sizeof(hints)); 53 ZERO_STRUCT(hints); 54 53 55 /* By default make sure it supports TCP. */ 54 56 hints.ai_socktype = SOCK_STREAM; 55 57 hints.ai_flags = flags; 56 58 57 /* Linux man page on getadd info() says port will be58 uninitialized when service string i nNULL */59 /* Linux man page on getaddrinfo() says port will be 60 uninitialized when service string is NULL */ 59 61 60 62 ret = getaddrinfo(str, NULL, … … 383 385 * Check if a struct sockaddr has an unspecified address. 384 386 */ 385 bool is_zero_addr(const struct sockaddr *pss)386 { 387 #if defined(HAVE_IPV6) 388 if (pss->s a_family == AF_INET6) {387 bool is_zero_addr(const struct sockaddr_storage *pss) 388 { 389 #if defined(HAVE_IPV6) 390 if (pss->ss_family == AF_INET6) { 389 391 const struct in6_addr *pin6 = 390 392 &((const struct sockaddr_in6 *)pss)->sin6_addr; … … 392 394 } 393 395 #endif 394 if (pss->s a_family == AF_INET) {396 if (pss->ss_family == AF_INET) { 395 397 const struct in_addr *pin = &((const struct sockaddr_in *)pss)->sin_addr; 396 398 return is_zero_ip_v4(*pin); … … 539 541 540 542 543 /**************************************************************************** 544 Get a port number in host byte order from a sockaddr_storage. 545 ****************************************************************************/ 546 547 uint16_t get_sockaddr_port(const struct sockaddr_storage *pss) 548 { 549 uint16_t port = 0; 550 551 if (pss->ss_family != AF_INET) { 552 #if defined(HAVE_IPV6) 553 /* IPv6 */ 554 const struct sockaddr_in6 *sa6 = 555 (const struct sockaddr_in6 *)pss; 556 port = ntohs(sa6->sin6_port); 557 #endif 558 } else { 559 const struct sockaddr_in *sa = 560 (const struct sockaddr_in *)pss; 561 port = ntohs(sa->sin_port); 562 } 563 return port; 564 } 565 566 /**************************************************************************** 567 Print out an IPv4 or IPv6 address from a struct sockaddr_storage. 568 ****************************************************************************/ 569 570 char *print_sockaddr_len(char *dest, 571 size_t destlen, 572 const struct sockaddr *psa, 573 socklen_t psalen) 574 { 575 if (destlen > 0) { 576 dest[0] = '\0'; 577 } 578 (void)sys_getnameinfo(psa, 579 psalen, 580 dest, destlen, 581 NULL, 0, 582 NI_NUMERICHOST); 583 return dest; 584 } 585 586 /**************************************************************************** 587 Print out an IPv4 or IPv6 address from a struct sockaddr_storage. 588 ****************************************************************************/ 589 590 char *print_sockaddr(char *dest, 591 size_t destlen, 592 const struct sockaddr_storage *psa) 593 { 594 return print_sockaddr_len(dest, destlen, (struct sockaddr *)psa, 595 sizeof(struct sockaddr_storage)); 596 } 597 598 /**************************************************************************** 599 Print out a canonical IPv4 or IPv6 address from a struct sockaddr_storage. 600 ****************************************************************************/ 601 602 char *print_canonical_sockaddr(TALLOC_CTX *ctx, 603 const struct sockaddr_storage *pss) 604 { 605 char addr[INET6_ADDRSTRLEN]; 606 char *dest = NULL; 607 int ret; 608 609 /* Linux getnameinfo() man pages says port is unitialized if 610 service name is NULL. */ 611 612 ret = sys_getnameinfo((const struct sockaddr *)pss, 613 sizeof(struct sockaddr_storage), 614 addr, sizeof(addr), 615 NULL, 0, 616 NI_NUMERICHOST); 617 if (ret != 0) { 618 return NULL; 619 } 620 621 if (pss->ss_family != AF_INET) { 622 #if defined(HAVE_IPV6) 623 dest = talloc_asprintf(ctx, "[%s]", addr); 624 #else 625 return NULL; 626 #endif 627 } else { 628 dest = talloc_asprintf(ctx, "%s", addr); 629 } 630 631 return dest; 632 } 633 634 /**************************************************************************** 635 Return the port number we've bound to on a socket. 636 ****************************************************************************/ 637 638 int get_socket_port(int fd) 639 { 640 struct sockaddr_storage sa; 641 socklen_t length = sizeof(sa); 642 643 if (fd == -1) { 644 return -1; 645 } 646 647 if (getsockname(fd, (struct sockaddr *)&sa, &length) < 0) { 648 int level = (errno == ENOTCONN) ? 2 : 0; 649 DEBUG(level, ("getsockname failed. Error was %s\n", 650 strerror(errno))); 651 return -1; 652 } 653 654 #if defined(HAVE_IPV6) 655 if (sa.ss_family == AF_INET6) { 656 return ntohs(((struct sockaddr_in6 *)&sa)->sin6_port); 657 } 658 #endif 659 if (sa.ss_family == AF_INET) { 660 return ntohs(((struct sockaddr_in *)&sa)->sin_port); 661 } 662 return -1; 663 } 664 665 /**************************************************************************** 666 Return the string of an IP address (IPv4 or IPv6). 667 ****************************************************************************/ 668 669 static const char *get_socket_addr(int fd, char *addr_buf, size_t addr_len) 670 { 671 struct sockaddr_storage sa; 672 socklen_t length = sizeof(sa); 673 674 /* Ok, returning a hard coded IPv4 address 675 * is bogus, but it's just as bogus as a 676 * zero IPv6 address. No good choice here. 677 */ 678 679 strlcpy(addr_buf, "0.0.0.0", addr_len); 680 681 if (fd == -1) { 682 return addr_buf; 683 } 684 685 if (getsockname(fd, (struct sockaddr *)&sa, &length) < 0) { 686 DEBUG(0,("getsockname failed. Error was %s\n", 687 strerror(errno) )); 688 return addr_buf; 689 } 690 691 return print_sockaddr_len(addr_buf, addr_len, (struct sockaddr *)&sa, length); 692 } 693 694 const char *client_socket_addr(int fd, char *addr, size_t addr_len) 695 { 696 return get_socket_addr(fd, addr, addr_len); 697 }
Note:
See TracChangeset
for help on using the changeset viewer.