mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +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:
parent
b686bbb4ac
commit
00f1d6d947
@ -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)
|
bool ctdb_sys_check_iface_exists(const char *iface)
|
||||||
{
|
{
|
||||||
int s;
|
struct if_nameindex *ifnis, *ifni;
|
||||||
struct ifreq ifr;
|
bool found = false;
|
||||||
|
|
||||||
s = socket(AF_PACKET, SOCK_RAW, 0);
|
ifnis = if_nameindex();
|
||||||
if (s == -1){
|
if (ifnis == NULL) {
|
||||||
/* We don't know if the interface exists, so assume yes */
|
DBG_ERR("Failed to retrieve inteface list\n");
|
||||||
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);
|
|
||||||
return false;
|
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)
|
bool ctdb_sys_check_iface_exists(const char *iface)
|
||||||
{
|
{
|
||||||
@ -181,7 +185,7 @@ bool ctdb_sys_check_iface_exists(const char *iface)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* HAVE_AF_PACKET */
|
#endif /* HAVE_IF_NAMEINDEX */
|
||||||
|
|
||||||
#ifdef HAVE_PEERCRED
|
#ifdef HAVE_PEERCRED
|
||||||
|
|
||||||
|
@ -11,16 +11,5 @@ remove_socket ()
|
|||||||
|
|
||||||
test_cleanup remove_socket
|
test_cleanup remove_socket
|
||||||
|
|
||||||
os=$(uname)
|
ok_null
|
||||||
if [ "$os" = "Linux" ] ; then
|
unit_test porting_tests --socket="$socket"
|
||||||
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}
|
|
||||||
|
@ -171,15 +171,17 @@ static int fork_helper(void)
|
|||||||
*/
|
*/
|
||||||
static int test_ctdb_sys_check_iface_exists(void)
|
static int test_ctdb_sys_check_iface_exists(void)
|
||||||
{
|
{
|
||||||
const char *fakename = "fake";
|
bool test1, test2;
|
||||||
bool test;
|
|
||||||
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user