From 038476c41204e2fb5c82934beefbd50d8d28c4f8 Mon Sep 17 00:00:00 2001 From: Adrian Frühwirth Date: Tue, 24 Nov 2015 22:56:02 +0100 Subject: Fix for GitHub issue #253. Make 'ip' detection more robust (some distros don't ship the binary in /sbin or /usr/sbin). Add error handling for cases where an ip add/remove fails. --- osdep/LinuxEthernetTap.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'osdep') diff --git a/osdep/LinuxEthernetTap.cpp b/osdep/LinuxEthernetTap.cpp index 73eb0cc5..f250abd3 100644 --- a/osdep/LinuxEthernetTap.cpp +++ b/osdep/LinuxEthernetTap.cpp @@ -210,8 +210,8 @@ static bool ___removeIp(const std::string &_dev,const InetAddress &ip) long cpid = (long)vfork(); if (cpid == 0) { OSUtils::redirectUnixOutputs("/dev/null",(const char *)0); - ::execl("/sbin/ip","/sbin/ip","addr","del",ip.toString().c_str(),"dev",_dev.c_str(),(const char *)0); - ::execl("/usr/sbin/ip","/usr/sbin/ip","addr","del",ip.toString().c_str(),"dev",_dev.c_str(),(const char *)0); + setenv("PATH", "/sbin:/bin:/usr/sbin:/usr/bin", 1); + ::execlp("ip","ip","addr","del",ip.toString().c_str(),"dev",_dev.c_str(),(const char *)0); ::_exit(-1); } else { int exitcode = -1; @@ -238,12 +238,11 @@ bool LinuxEthernetTap::addIp(const InetAddress &ip) long cpid = (long)vfork(); if (cpid == 0) { OSUtils::redirectUnixOutputs("/dev/null",(const char *)0); + setenv("PATH", "/sbin:/bin:/usr/sbin:/usr/bin", 1); if (ip.isV4()) { - ::execl("/sbin/ip","/sbin/ip","addr","add",ip.toString().c_str(),"broadcast",ip.broadcast().toIpString().c_str(),"dev",_dev.c_str(),(const char *)0); - ::execl("/usr/sbin/ip","/usr/sbin/ip","addr","add",ip.toString().c_str(),"broadcast",ip.broadcast().toIpString().c_str(),"dev",_dev.c_str(),(const char *)0); + ::execlp("ip","ip","addr","add",ip.toString().c_str(),"broadcast",ip.broadcast().toIpString().c_str(),"dev",_dev.c_str(),(const char *)0); } else { - ::execl("/sbin/ip","/sbin/ip","addr","add",ip.toString().c_str(),"dev",_dev.c_str(),(const char *)0); - ::execl("/usr/sbin/ip","/usr/sbin/ip","addr","add",ip.toString().c_str(),"dev",_dev.c_str(),(const char *)0); + ::execlp("ip","ip","addr","add",ip.toString().c_str(),"dev",_dev.c_str(),(const char *)0); } ::_exit(-1); } else if (cpid > 0) { -- cgit v1.2.3