1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-08 04:58:40 +03:00

ctdb-common: Use POSIX if_nameindex() to check interface existence

This works as an unprivileged user, so avoids unnecessary errors when
running in test mode (and not as root):

  2022-02-18T12:21:12.436491+11:00 node.0 ctdbd[6958]: ctdb_sys_check_iface_exists: Failed to open raw socket
  2022-02-18T12:21:12.436534+11:00 node.0 ctdbd[6958]: ctdb_sys_check_iface_exists: Failed to open raw socket
  2022-02-18T12:21:12.436557+11:00 node.0 ctdbd[6958]: ctdb_sys_check_iface_exists: Failed to open raw socket
  2022-02-18T12:21:12.436577+11:00 node.0 ctdbd[6958]: ctdb_sys_check_iface_exists: Failed to open raw socket

The corresponding porting test would now become pointless because it
would just confirm that "fake" does not exist.  Attempt to make it
useful by using a less likely name than "fake" and attempting to
detect the loopback interface.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
This commit is contained in:
Martin Schwenke 2022-07-05 12:31:57 +10:00 committed by Amitay Isaacs
parent b686bbb4ac
commit 00f1d6d947
3 changed files with 34 additions and 39 deletions

View File

@ -148,32 +148,36 @@ void ctdb_wait_for_process_to_exit(pid_t pid)
}
}
#ifdef HAVE_AF_PACKET
#ifdef HAVE_IF_NAMEINDEX
bool ctdb_sys_check_iface_exists(const char *iface)
{
int s;
struct ifreq ifr;
struct if_nameindex *ifnis, *ifni;
bool found = false;
s = socket(AF_PACKET, SOCK_RAW, 0);
if (s == -1){
/* We don't know if the interface exists, so assume yes */
DBG_ERR("Failed to open raw socket\n");
return true;
}
strlcpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
if (ioctl(s, SIOCGIFINDEX, &ifr) < 0 && errno == ENODEV) {
DBG_ERR("Interface '%s' not found\n", iface);
close(s);
ifnis = if_nameindex();
if (ifnis == NULL) {
DBG_ERR("Failed to retrieve inteface list\n");
return false;
}
close(s);
return true;
for (ifni = ifnis;
ifni->if_index != 0 || ifni->if_name != NULL;
ifni++) {
int cmp = strcmp(iface, ifni->if_name);
if (cmp == 0) {
found = true;
goto done;
}
}
done:
if_freenameindex(ifnis);
return found;
}
#else /* HAVE_AF_PACKET */
#else /* HAVE_IF_NAMEINDEX */
bool ctdb_sys_check_iface_exists(const char *iface)
{
@ -181,7 +185,7 @@ bool ctdb_sys_check_iface_exists(const char *iface)
return true;
}
#endif /* HAVE_AF_PACKET */
#endif /* HAVE_IF_NAMEINDEX */
#ifdef HAVE_PEERCRED

View File

@ -11,16 +11,5 @@ remove_socket ()
test_cleanup remove_socket
os=$(uname)
if [ "$os" = "Linux" ] ; then
uid=$(id -u)
if [ "$uid" -eq 0 ] ; then
ok "ctdb_sys_check_iface_exists: Interface 'fake' not found"
else
ok "ctdb_sys_check_iface_exists: Failed to open raw socket"
fi
else
ok_null
fi
unit_test porting_tests --socket=${socket}
ok_null
unit_test porting_tests --socket="$socket"

View File

@ -171,15 +171,17 @@ static int fork_helper(void)
*/
static int test_ctdb_sys_check_iface_exists(void)
{
const char *fakename = "fake";
bool test;
bool test1, test2;
test1 = ctdb_sys_check_iface_exists("unlikely123xyz");
assert(!test1);
/* Linux and others */
test1 = ctdb_sys_check_iface_exists("lo");
/* FreeBSD */
test2 = ctdb_sys_check_iface_exists("lo0");
assert(test1 || test2);
test = ctdb_sys_check_iface_exists(fakename);
if (geteuid() == 0) {
assert(test == false);
} else {
assert(test == true);
}
return 0;
}