const char *format_host(int af, int len, const void *addr, char *buf, int buflen) { #ifdef RESOLVE_HOSTNAMES if (resolve_hosts) { const char *n; len = len <= 0 ? af_byte_len(af) : len; if (len > 0 && (n = resolve_address(addr, len, af)) != NULL) return n; } #endif return rt_addr_n2a(af, len, addr, buf, buflen); }
static int __get_addr_1(inet_prefix *addr, const char *name, int family) { memset(addr, 0, sizeof(*addr)); if (strcmp(name, "default") == 0) { if ((family == AF_DECnet) || (family == AF_MPLS)) return -1; addr->family = family; addr->bytelen = af_byte_len(addr->family); addr->bitlen = -2; addr->flags |= PREFIXLEN_SPECIFIED; return 0; } if (strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { if ((family == AF_DECnet) || (family == AF_MPLS)) return -1; addr->family = family; addr->bytelen = 0; addr->bitlen = -2; return 0; } if (family == AF_PACKET) { int len; len = ll_addr_a2n((char *) &addr->data, sizeof(addr->data), name); if (len < 0) return -1; addr->family = AF_PACKET; addr->bytelen = len; addr->bitlen = len * 8; return 0; } if (strchr(name, ':')) { addr->family = AF_INET6; if (family != AF_UNSPEC && family != AF_INET6) return -1; if (inet_pton(AF_INET6, name, addr->data) <= 0) return -1; addr->bytelen = 16; addr->bitlen = -1; return 0; } if (family == AF_DECnet) { struct dn_naddr dna; addr->family = AF_DECnet; if (dnet_pton(AF_DECnet, name, &dna) <= 0) return -1; memcpy(addr->data, dna.a_addr, 2); addr->bytelen = 2; addr->bitlen = -1; return 0; } if (family == AF_MPLS) { unsigned int maxlabels; int i; addr->family = AF_MPLS; if (mpls_pton(AF_MPLS, name, addr->data, sizeof(addr->data)) <= 0) return -1; addr->bytelen = 4; addr->bitlen = 20; /* How many bytes do I need? */ maxlabels = sizeof(addr->data) / sizeof(struct mpls_label); for (i = 0; i < maxlabels; i++) { if (ntohl(addr->data[i]) & MPLS_LS_S_MASK) { addr->bytelen = (i + 1)*4; break; } } return 0; } addr->family = AF_INET; if (family != AF_UNSPEC && family != AF_INET) return -1; if (get_addr_ipv4((__u8 *)addr->data, name) <= 0) return -1; addr->bytelen = 4; addr->bitlen = -1; return 0; }