summaryrefslogtreecommitdiff
path: root/ctdb/common/system.c
diff options
context:
space:
mode:
Diffstat (limited to 'ctdb/common/system.c')
-rw-r--r--ctdb/common/system.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/ctdb/common/system.c b/ctdb/common/system.c
index 650b62bab16..08dc68284fd 100644
--- a/ctdb/common/system.c
+++ b/ctdb/common/system.c
@@ -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;
+ ifnis = if_nameindex();
+ if (ifnis == NULL) {
+ DBG_ERR("Failed to retrieve inteface list\n");
+ return false;
}
- 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;
+ 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;
+ }
}
- close(s);
- return true;
+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