int inet_net_ptosa(sa_family_t af, const char *buf, struct sockaddr *sa, struct sockaddr *ma) { struct sockaddr_in *sin = (struct sockaddr_in *)sa; struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; int i, plen; switch (af) { case AF_INET: memset(sin, 0, sizeof(*sin)); sin->sin_family = af; sin->sin_len = sizeof(*sin); plen = inet_net_pton(af, buf, &sin->sin_addr, sizeof(sin->sin_addr)); if (plen == -1 || ma == NULL) break; sin = (struct sockaddr_in *)ma; memset(sin, 0, sizeof(*sin)); sin->sin_len = sizeof(*sin); sin->sin_family = 0; in_prefixlen2mask(&sin->sin_addr, plen); break; case AF_INET6: memset(sin6, 0, sizeof(*sin6)); sin6->sin6_family = af; sin6->sin6_len = sizeof(*sin6); plen = inet_net_pton(af, buf, &sin6->sin6_addr, sizeof(sin6->sin6_addr)); if (plen == -1 || ma == NULL) break; sin6 = (struct sockaddr_in6 *)ma; memset(sin6, 0, sizeof(*sin6)); sin6->sin6_len = sizeof(*sin6); sin6->sin6_family = 0; for (i = 0; i < plen / 8; i++) sin6->sin6_addr.s6_addr[i] = 0xff; i = plen % 8; if (i) sin6->sin6_addr.s6_addr[plen / 8] = 0xff00 >> i; break; default: plen = -1; } return (plen); }
int parse_addr(const char *word, int *family, union eigrpd_addr *addr) { struct in_addr ina; struct addrinfo hints, *r; struct sockaddr_in6 *sa_in6; if (word == NULL) return (0); memset(addr, 0, sizeof(union eigrpd_addr)); memset(&ina, 0, sizeof(ina)); if (inet_net_pton(AF_INET, word, &ina, sizeof(ina)) != -1) { *family = AF_INET; addr->v4.s_addr = ina.s_addr; return (1); } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; /*dummy*/ hints.ai_flags = AI_NUMERICHOST; if (getaddrinfo(word, "0", &hints, &r) == 0) { sa_in6 = (struct sockaddr_in6 *)r->ai_addr; *family = AF_INET6; addr->v6 = sa_in6->sin6_addr; freeaddrinfo(r); return (1); } return (0); }
int parse_addr(const char *word, struct bgpd_addr *addr) { struct in_addr ina; struct addrinfo hints, *r; if (word == NULL) return (0); bzero(addr, sizeof(struct bgpd_addr)); bzero(&ina, sizeof(ina)); if (inet_net_pton(AF_INET, word, &ina, sizeof(ina)) != -1) { addr->aid = AID_INET; addr->v4 = ina; return (1); } bzero(&hints, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; /*dummy*/ hints.ai_flags = AI_NUMERICHOST; if (getaddrinfo(word, "0", &hints, &r) == 0) { sa2addr(r->ai_addr, addr); freeaddrinfo(r); return (1); } return (0); }
void testValues() { f = 2; char cp[] = "a"; char buf[] = "b"; inet_net_pton(AF_INET, cp, buf, 1); //@ assert f == 2; //@ assert vacuous: \false; }
int host_v4(const char *s, struct bgpd_addr *h, u_int8_t *len) { struct in_addr ina; int bits = 32; bzero(&ina, sizeof(struct in_addr)); if (strrchr(s, '/') != NULL) { if ((bits = inet_net_pton(AF_INET, s, &ina, sizeof(ina))) == -1) return (0); } else { if (inet_pton(AF_INET, s, &ina) != 1) return (0); } h->aid = AID_INET; h->v4.s_addr = ina.s_addr; *len = bits; return (1); }
int parse_netblock(char *buf, struct bl *start, struct bl *end, int white) { char astring[16], astring2[16]; unsigned maskbits; struct cidr c; /* skip leading spaces */ while (*buf == ' ') buf++; /* bail if it's a comment */ if (*buf == '#') return (0); /* otherwise, look for a netblock of some sort */ if (sscanf(buf, "%15[^/]/%u", astring, &maskbits) == 2) { /* looks like a cidr */ memset(&c.addr, 0, sizeof(c.addr)); if (inet_net_pton(AF_INET, astring, &c.addr, sizeof(c.addr)) == -1) return (0); c.addr = ntohl(c.addr); if (maskbits > 32) return (0); c.bits = maskbits; cidr2range(c, &start->addr, &end->addr); end->addr += 1; } else if (sscanf(buf, "%15[0123456789.]%*[ -]%15[0123456789.]", astring, astring2) == 2) { /* looks like start - end */ memset(&start->addr, 0, sizeof(start->addr)); memset(&end->addr, 0, sizeof(end->addr)); if (inet_net_pton(AF_INET, astring, &start->addr, sizeof(start->addr)) == -1) return (0); start->addr = ntohl(start->addr); if (inet_net_pton(AF_INET, astring2, &end->addr, sizeof(end->addr)) == -1) return (0); end->addr = ntohl(end->addr) + 1; if (start > end) return (0); } else if (sscanf(buf, "%15[0123456789.]", astring) == 1) { /* just a single address */ memset(&start->addr, 0, sizeof(start->addr)); if (inet_net_pton(AF_INET, astring, &start->addr, sizeof(start->addr)) == -1) return (0); start->addr = ntohl(start->addr); end->addr = start->addr + 1; } else return (0); if (white) { start->b = 0; start->w = 1; end->b = 0; end->w = -1; } else { start->b = 1; start->w = 0; end->b = -1; end->w = 0; } return (1); }
void runFailure() { char buf[] = "b"; inet_net_pton(AF_INET, NULL, buf, 1); }
void runSuccess() { char cp[] = "a"; char buf[] = "b"; inet_net_pton(AF_INET, cp, buf, 1); }
void runFailure2() { char cp[] = "a"; char buf[] = "b"; inet_net_pton(AF_INET, cp, buf, 120); }
void runFailure1() { char cp[] = "a"; inet_net_pton(AF_INET, cp, NULL, anyint()); }
int parse_prefix_list(prefls_t **pfixlist,char *str,setup_params_t *setup) { int nelem = 0; int i = 0,len =0,rv=0; char *token = NULL,*bck = NULL; prefls_t *p = NULL; if(!str || !setup) { errno = EINVAL; return -1; } len = strlen(str); bck = malloc(len); if(!bck) { pbgp_error("parse_prefix_list :: %s\n",strerror(errno)); return -1; } strncpy(bck,str,len); //count tokens token = strtok(str,","); while(token != NULL) { nelem++; token = strtok(NULL,","); } strncpy(str,bck,len); rv = pfix_init(pfixlist,nelem,setup); if(rv < 0) goto out; p = *pfixlist; token = strtok(str,","); while((token != NULL) && (i < MAX_PFIX_NUM)) { /*rv = inet_pton(AF_INET,token,&(*pfixlist)->ina[i].sin_addr);*/ //rv=host(token, &p->ina[i], &p->bitmask[i]); if (strrchr(token, '/') != NULL) { if ((p->netmask[i] = inet_net_pton(AF_INET, token, &p->ina[i], sizeof(struct in_addr))) == -1) rv =-1; } else { if (inet_pton(AF_INET, token, &p->ina[i]) != 1) rv=-1; } if(rv < 0) { pbgp_error("parse_prefix_list :: %s\n",strerror(errno)); rv = -1; goto out; } //char as[40]; //inet_net_ntop (AF_INET, &p->ina[i], p->bitmask[i],as, 40); //printf("addr:%s bitmask: %d\n",as,p->bitmask[i]); token = strtok(NULL,","); i++; } out: free(bck); return rv; }