2022-06-03 19:15:11 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
2022-11-01 20:26:26 +00:00
|
|
|
* Copyright (C) 2021 Intel Corporation. All rights reserved.
|
2021-07-14 14:56:03 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
static int
|
|
|
|
get_addr_str(struct sockaddr *sa, char *host, size_t hlen)
|
|
|
|
{
|
|
|
|
const char *result = NULL;
|
|
|
|
|
|
|
|
if (sa == NULL || host == NULL) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (sa->sa_family) {
|
|
|
|
case AF_INET:
|
|
|
|
result = inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
|
|
|
|
host, hlen);
|
|
|
|
break;
|
|
|
|
case AF_INET6:
|
|
|
|
result = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
|
|
|
|
host, hlen);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (result != NULL) {
|
|
|
|
return 0;
|
|
|
|
} else {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool
|
|
|
|
sock_is_loopback(int fd)
|
|
|
|
{
|
|
|
|
struct ifaddrs *addrs, *tmp;
|
|
|
|
struct sockaddr_storage sa = {};
|
|
|
|
socklen_t salen;
|
|
|
|
struct ifreq ifr = {};
|
|
|
|
char ip_addr[256], ip_addr_tmp[256];
|
|
|
|
int rc;
|
|
|
|
bool is_loopback = false;
|
|
|
|
|
|
|
|
salen = sizeof(sa);
|
|
|
|
rc = getsockname(fd, (struct sockaddr *)&sa, &salen);
|
|
|
|
if (rc != 0) {
|
|
|
|
return is_loopback;
|
|
|
|
}
|
|
|
|
|
|
|
|
memset(ip_addr, 0, sizeof(ip_addr));
|
|
|
|
rc = get_addr_str((struct sockaddr *)&sa, ip_addr, sizeof(ip_addr));
|
|
|
|
if (rc != 0) {
|
|
|
|
return is_loopback;
|
|
|
|
}
|
|
|
|
|
|
|
|
getifaddrs(&addrs);
|
|
|
|
for (tmp = addrs; tmp != NULL; tmp = tmp->ifa_next) {
|
|
|
|
if (tmp->ifa_addr && (tmp->ifa_flags & IFF_UP) &&
|
|
|
|
(tmp->ifa_addr->sa_family == sa.ss_family)) {
|
|
|
|
memset(ip_addr_tmp, 0, sizeof(ip_addr_tmp));
|
|
|
|
rc = get_addr_str(tmp->ifa_addr, ip_addr_tmp, sizeof(ip_addr_tmp));
|
|
|
|
if (rc != 0) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (strncmp(ip_addr, ip_addr_tmp, sizeof(ip_addr)) == 0) {
|
|
|
|
memcpy(ifr.ifr_name, tmp->ifa_name, sizeof(ifr.ifr_name));
|
|
|
|
ioctl(fd, SIOCGIFFLAGS, &ifr);
|
|
|
|
if (ifr.ifr_flags & IFF_LOOPBACK) {
|
|
|
|
is_loopback = true;
|
|
|
|
}
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
end:
|
|
|
|
freeifaddrs(addrs);
|
|
|
|
return is_loopback;
|
|
|
|
}
|