Beispiel #1
0
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;
}