case EAI_NODATA: case EAI_ADDRFAMILY:
bool is_allowed(const struct sockaddr *sa, const address *addr,		const connection_attributes *attrs){	struct addrinfo hints, *res = NULL, *ptr;	int err;	bool ret;	assert(sa != NULL);	assert(addr != NULL);		assert(addr->address == NULL || strlen(addr->address) > 0);	assert(addr->service == NULL || strlen(addr->service) > 0);	assert(attrs != NULL);	/* if no address or port is supplied, match everything */	if (addr->address == NULL && addr->service == NULL) return TRUE;			memset(&hints, 0, sizeof(hints));	ca_to_addrinfo(&hints, attrs);	if (ca_is_flag_set(attrs, CA_NUMERIC_MODE))		hints.ai_flags |= AI_NUMERICHOST;		hints.ai_flags |= AI_PASSIVE;		err = getaddrinfo(addr->address, addr->service, &hints, &res);	if (err != 0) {		/* some errors just indicate that the address wasn't suitable */		switch (err) {		case EAI_NODATA:		case EAI_ADDRFAMILY:		case EAI_SERVICE:		case EAI_SOCKTYPE:			return FALSE;		default:			fatal(_("getaddrinfo error: %s"), gai_strerror(err));		}	}	ret = FALSE;		for (ptr = res; ptr != NULL; ptr = ptr->ai_next) {#ifdef ENABLE_IPV6		/* skip IPv4 mapped addresses returned from getaddrinfo */		if (is_address_ipv4_mapped(ptr->ai_addr))			continue;#endif		if (sockaddr_compare(sa, ptr->ai_addr) == TRUE) {			ret = TRUE;			break;		}	}	freeaddrinfo(res);	return ret;}