bool check_is_ip_addr_valid_local()

in src/util.c [747:789]


bool check_is_ip_addr_valid_local(int ss_family, char *ip_to_check)
{
	struct ifaddrs *ifaddrp, *ifap;
	bool is_valid = false;
	char *ip_addr_str;
	size_t ip_addr_len;
	char *log;

	if ((ss_family == AF_INET) && strcmp(ip_to_check, "0.0.0.0") == 0)
		return true;

	if ((ss_family == AF_INET6) && strcmp(ip_to_check, "::") == 0)
		return true;

	ip_addr_len = (ss_family == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN);
	if ((ip_addr_str = (char *)malloc(ip_addr_len)) == (char *)NULL) {
		PRINT_ERR("cannot allocate memory for ip address string");
		return false;
	}

	getifaddrs(&ifaddrp);

	for (ifap = ifaddrp; ifap; ifap = ifap->ifa_next) {
		if (ifap->ifa_addr && ifap->ifa_addr->sa_family == ss_family) {
			if (ss_family == AF_INET)
				inet_ntop(AF_INET, &(((struct sockaddr_in *)ifap->ifa_addr)->sin_addr), ip_addr_str, ip_addr_len);
			else
				inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)ifap->ifa_addr)->sin6_addr), ip_addr_str, ip_addr_len);

			ASPRINTF(&log, "Interface:[%s]\tAddress: %s", ifap->ifa_name, ip_addr_str);
			PRINT_DBG_FREE(log);

			if (strcmp(ip_to_check, ip_addr_str) == 0) {
				is_valid = true;
				/* do not break here; just want to loop all of the interfaces, for DBG log */
			}
		}
	}

	free(ip_addr_str);
	freeifaddrs(ifaddrp);
	return is_valid;
}