static int parse_addresses(const char *addrstr, struct in6_addr *addrp) { char *buffer, *cp, *next; unsigned int i; buffer = strdup(addrstr); if (!buffer) xtables_error(OTHER_PROBLEM, "strdup failed"); for (cp=buffer, i=0; cp && i<IP6T_RT_HOPS; cp=next,i++) { next=strchr(cp, ','); if (next) *next++='\0'; memcpy(&(addrp[i]), numeric_to_addr(cp), sizeof(struct in6_addr)); #if DEBUG printf("addr str: %s\n", cp); printf("addr ip6: %s\n", addr_to_numeric((numeric_to_addr(cp)))); printf("addr [%d]: %s\n", i, addr_to_numeric(&(addrp[i]))); #endif } if (cp) xtables_error(PARAMETER_PROBLEM, "too many addresses specified"); free(buffer); #if DEBUG printf("addr nr: %d\n", i); #endif return i; }
static struct in6_addr *parse_ip6_mask(char *mask) { static struct in6_addr maskaddr; struct in6_addr *addrp; unsigned int bits; if (mask == NULL) { memset(&maskaddr, 0xff, sizeof maskaddr); return &maskaddr; } if ((addrp = numeric_to_addr(mask)) != NULL) return addrp; if (string_to_number(mask, 0, 128, &bits) == -1) ebt_print_error("Invalid IPv6 Mask '%s' specified", mask); if (bits != 0) { char *p = (char *)&maskaddr; memset(p, 0xff, bits / 8); memset(p + (bits / 8) + 1, 0, (128 - bits) / 8); p[bits / 8] = 0xff << (8 - (bits & 7)); return &maskaddr; } memset(&maskaddr, 0, sizeof maskaddr); return &maskaddr; }