rem: return ((a&mask) == (t&mask));
add: switch(resa->ai_family) { case PF_INET: a = (char *)&((struct sockaddr_in *)resa->ai_addr)->sin_addr; t = (char *)&((struct sockaddr_in *)rest->ai_addr)->sin_addr; addrlen = 4;  break;  #ifdef INET6 case PF_INET6: { struct sockaddr_in6 *sin6a, *sin6t;  sin6a = (struct sockaddr_in6 *)resa->ai_addr; sin6t = (struct sockaddr_in6 *)rest->ai_addr;  a = (char *)&sin6a->sin6_addr; t = (char *)&sin6t->sin6_addr;  #ifdef HAVE_SOCKADDR_IN6_SCOPE_ID if (sin6t->sin6_scope_id && sin6a->sin6_scope_id != sin6t->sin6_scope_id) { ret = 0; goto out; } #endif  a = (char *)&sin6a->sin6_addr; t = (char *)&sin6t->sin6_addr; addrlen = 16;  break; } #endif default: rprintf(FERROR,"unknown family %u\n", rest->ai_family); ret = 0; goto out; }  bits = -1; if (p) { if (inet_pton(resa->ai_addr->sa_family, p, mask) <= 0) { #ifdef HAVE_STRTOL char *ep = NULL; #else unsigned char *pp; #endif  #ifdef HAVE_STRTOL bits = strtol(p, &ep, 10); if (!*p || *ep) { rprintf(FERROR,"malformed mask in %s\n", tok); ret = 0; goto out; } #else for (pp = (unsigned char *)p; *pp; pp++) { if (!isascii(*pp) || !isdigit(*pp)) { rprintf(FERROR,"malformed mask in %s\n", tok); ret = 0; goto out; } } bits = atoi(p); #endif if (bits == 0) { ret = 1; goto out; } if (bits < 0 || bits > (addrlen << 3)) { rprintf(FERROR,"malformed mask in %s\n", tok); ret = 0; goto out; } } } else { bits = 128; }  if (bits >= 0) make_mask(mask, bits, addrlen);  ret = match_binary(a, t, mask, addrlen);  out: freeaddrinfo(resa); freeaddrinfo(rest); return ret;
context: static int match_address(char *addr, char *tok){	char *p;	unsigned long a, t, mask = (unsigned long)~0;	if (!addr || !*addr) return 0;	if (!isdigit(* (unsigned char *) tok)) return 0;	p = strchr(tok,'/');	if (p) *p = 0;	a = inet_addr(addr);	t = inet_addr(tok);	if (p) {		*p = '/';	}	if (t == INADDR_NONE) {		rprintf(FERROR,"malformed address %s\n", tok);		return 0;	}	a = ntohl(a);	t = ntohl(t);	if (p) {		if (strchr(p+1,'.')) {			mask = inet_addr(p+1);			if (mask == INADDR_NONE) {				rprintf(FERROR,"malformed mask in %s\n", tok);				return 0;			}			mask = ntohl(mask);		} else {			int bits = atoi(p+1);			if (bits == 0) return 1;			if (bits <= 0 || bits > 32) {				rprintf(FERROR,"malformed mask in %s\n", tok);				return 0;			}			mask &= (mask << (32-bits));		}	}	return ((a&mask) == (t&mask));}