| 581 | } |
| 582 | |
| 583 | static const char * |
| 584 | routename(struct sockaddr *sa) |
| 585 | { |
| 586 | struct sockaddr_dl *sdl; |
| 587 | const char *cp; |
| 588 | int n; |
| 589 | |
| 590 | if (!domain_initialized) { |
| 591 | domain_initialized = true; |
| 592 | if (gethostname(domain, MAXHOSTNAMELEN) == 0 && |
| 593 | (cp = strchr(domain, '.'))) { |
| 594 | domain[MAXHOSTNAMELEN] = '\0'; |
| 595 | (void)strcpy(domain, cp + 1); |
| 596 | } else |
| 597 | domain[0] = '\0'; |
| 598 | } |
| 599 | |
| 600 | /* If the address is zero-filled, use "default". */ |
| 601 | if (sa->sa_len == 0 && nflag == 0) |
| 602 | return ("default"); |
| 603 | #if defined(INET) || defined(INET6) |
| 604 | switch (sa->sa_family) { |
| 605 | #ifdef INET |
| 606 | case AF_INET: |
| 607 | /* If the address is zero-filled, use "default". */ |
| 608 | if (nflag == 0 && |
| 609 | ((struct sockaddr_in *)(void *)sa)->sin_addr.s_addr == |
| 610 | INADDR_ANY) |
| 611 | return("default"); |
| 612 | break; |
| 613 | #endif |
| 614 | #ifdef INET6 |
| 615 | case AF_INET6: |
| 616 | /* If the address is zero-filled, use "default". */ |
| 617 | if (nflag == 0 && |
| 618 | IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)(void *)sa)->sin6_addr)) |
| 619 | return("default"); |
| 620 | break; |
| 621 | #endif |
| 622 | } |
| 623 | #endif |
| 624 | |
| 625 | switch (sa->sa_family) { |
| 626 | #if defined(INET) || defined(INET6) |
| 627 | #ifdef INET |
| 628 | case AF_INET: |
| 629 | #endif |
| 630 | #ifdef INET6 |
| 631 | case AF_INET6: |
| 632 | #endif |
| 633 | { |
| 634 | struct sockaddr_storage ss; |
| 635 | int error; |
| 636 | char *p; |
| 637 | |
| 638 | memset(&ss, 0, sizeof(ss)); |
| 639 | if (sa->sa_len == 0) |
| 640 | ss.ss_family = sa->sa_family; |