summaryrefslogtreecommitdiffstats
path: root/ctdb/common/system_linux.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronniesahlberg@gmail.com>2011-09-06 16:11:00 +1000
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2011-09-06 16:11:00 +1000
commit64378fea58c28ce9cf1ad6171e41bccb88c1bafc (patch)
tree0bfaa476009465ff468bfcf0353b09f996ebe051 /ctdb/common/system_linux.c
parenta3e007956864f5d902f7bec22a2c51d1c391a7ff (diff)
downloadsamba-64378fea58c28ce9cf1ad6171e41bccb88c1bafc.tar.gz
samba-64378fea58c28ce9cf1ad6171e41bccb88c1bafc.tar.xz
samba-64378fea58c28ce9cf1ad6171e41bccb88c1bafc.zip
Check interfaces: when reading the public addresses file to create the vnn list
check that the actual interface exist, print error and fail startup if the interface does not exist. (This used to be ctdb commit cd33bbe6454b7b0316bdfffbd06c67b29779e873)
Diffstat (limited to 'ctdb/common/system_linux.c')
-rw-r--r--ctdb/common/system_linux.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c
index a498ab2d68..2dcdffb3ec 100644
--- a/ctdb/common/system_linux.c
+++ b/ctdb/common/system_linux.c
@@ -537,3 +537,25 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
}
+bool ctdb_sys_check_iface_exists(const char *iface)
+{
+ int s;
+ struct ifreq ifr;
+
+ s = socket(PF_PACKET, SOCK_RAW, 0);
+ if (s == -1){
+ /* We dont know if the interface exists, so assume yes */
+ DEBUG(DEBUG_CRIT,(__location__ " failed to open raw socket\n"));
+ return true;
+ }
+
+ strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
+ if (ioctl(s, SIOCGIFINDEX, &ifr) < 0 && errno == ENODEV) {
+ DEBUG(DEBUG_CRIT,(__location__ " interface '%s' not found\n", iface));
+ close(s);
+ return false;
+ }
+ close(s);
+
+ return true;
+}