static int config_sortlist(struct apattern **sortlist, int *nsort, const char *str) { struct apattern pat, *newsort; const char *q; /* Add sortlist entries. */ while (*str && *str != ';') { q = str; while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) q++; if (ip_addr(str, q - str, &pat.addr) == 0) { /* We have a pattern address; now determine the mask. */ if (*q == '/') { str = q + 1; while (*q && *q != ';' && !isspace((unsigned char)*q)) q++; if (ip_addr(str, q - str, &pat.mask) != 0) natural_mask(&pat); } else natural_mask(&pat); /* Add this pattern to our list. */ newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); if (!newsort) return ARES_ENOMEM; newsort[*nsort] = pat; *sortlist = newsort; (*nsort)++; } else { while (*q && *q != ';' && !isspace((unsigned char)*q)) q++; } str = q; while (isspace((unsigned char)*str)) str++; } return ARES_SUCCESS; }
static int config_sortlist(struct apattern **sortlist, int *nsort, const char *str) { struct apattern pat; const char *q; /* Add sortlist entries. */ while (*str && *str != ';') { int bits; char ipbuf[16], ipbufpfx[32]; /* Find just the IP */ q = str; while (*q && *q != '/' && *q != ';' && !ISSPACE(*q)) q++; memcpy(ipbuf, str, q-str); ipbuf[q-str] = '\0'; /* Find the prefix */ if (*q == '/') { const char *str2 = q+1; while (*q && *q != ';' && !ISSPACE(*q)) q++; memcpy(ipbufpfx, str, q-str); ipbufpfx[q-str] = '\0'; str = str2; } else ipbufpfx[0] = '\0'; /* Lets see if it is CIDR */ /* First we'll try IPv6 */ if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx[0] ? ipbufpfx : ipbuf, &pat.addrV6, sizeof(pat.addrV6))) > 0) { pat.type = PATTERN_CIDR; pat.mask.bits = (unsigned short)bits; pat.family = AF_INET6; if (!sortlist_alloc(sortlist, nsort, &pat)) return ARES_ENOMEM; } else if (ipbufpfx[0] && (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4, sizeof(pat.addrV4))) > 0) { pat.type = PATTERN_CIDR; pat.mask.bits = (unsigned short)bits; pat.family = AF_INET; if (!sortlist_alloc(sortlist, nsort, &pat)) return ARES_ENOMEM; } /* See if it is just a regular IP */ else if (ip_addr(ipbuf, q-str, &pat.addrV4) == 0) { if (ipbufpfx[0]) { memcpy(ipbuf, str, q-str); ipbuf[q-str] = '\0'; if (ip_addr(ipbuf, q-str, &pat.mask.addr4) != 0) natural_mask(&pat); } else natural_mask(&pat); pat.family = AF_INET; pat.type = PATTERN_MASK; if (!sortlist_alloc(sortlist, nsort, &pat)) return ARES_ENOMEM; } else { while (*q && *q != ';' && !ISSPACE(*q)) q++; } str = q; while (ISSPACE(*str)) str++; } return ARES_SUCCESS; }