int get_addr_1(inet_prefix *addr, char *name, int family) { char *cp; unsigned char *ap = (unsigned char*)addr->data; int i; memset(addr, 0, sizeof(*addr)); if (strcmp(name, "default") == 0 || strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { if (family == AF_DECnet) return -1; addr->family = family; addr->bytelen = (family == AF_INET6 ? 16 : 4); addr->bitlen = -1; return 0; } #ifdef IPV6 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; } #endif 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; } addr->family = AF_INET; if (family != AF_UNSPEC && family != AF_INET) return -1; addr->bytelen = 4; addr->bitlen = -1; for (cp=name, i=0; *cp; cp++) { if (*cp <= '9' && *cp >= '0') { ap[i] = 10*ap[i] + (*cp-'0'); continue; } if (*cp == '.' && ++i <= 3) continue; return -1; } return 0; }
int get_addr_1(inet_prefix *addr, const char *name, int family) { memset(addr, 0, sizeof(*addr)); if (strcmp(name, "default") == 0 || strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { if (family == AF_DECnet) return -1; addr->family = family; addr->bytelen = (family == AF_INET6 ? 16 : 4); addr->bitlen = -1; 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; } #ifndef ANDROID 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; } #endif 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; }
int get_addr_1(inet_prefix *addr, const char *name, int family) { memset(addr, 0, sizeof(*addr)); if (strcmp(name, "default") == 0 || strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { if ((family == AF_DECnet) || (family == AF_MPLS)) return -1; addr->family = family; addr->bytelen = (family == AF_INET6 ? 16 : 4); addr->bitlen = -1; 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) { int i; addr->family = AF_MPLS; if (mpls_pton(AF_MPLS, name, addr->data) <= 0) return -1; addr->bytelen = 4; addr->bitlen = 20; /* How many bytes do I need? */ for (i = 0; i < 8; 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; }