diff --git a/src/wifi/wifid-supplicant.c b/src/wifi/wifid-supplicant.c index e05a0cc..305b4bd 100644 --- a/src/wifi/wifid-supplicant.c +++ b/src/wifi/wifid-supplicant.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -2401,6 +2402,49 @@ static void supplicant_run(struct supplicant *s, const char *binary) execve(argv[0], argv, environ); } +static int supplicant_find(char **binary) +{ + _shl_free_ char *path = getenv("PATH"); + if(!path) { + return -EINVAL; + } + + path = strdup(path); + if(!path) { + return log_ENOMEM(); + } + + struct stat bin_stat; + char *curr = path, *next; + while(1) { + curr = strtok_r(curr, ":", &next); + if(!curr) { + break; + } + + _shl_free_ char *bin = shl_strcat(curr, "/wpa_supplicant"); + if (!bin) + return log_ENOMEM(); + + if(stat(bin, &bin_stat) < 0) { + if(ENOENT == errno) { + goto end; + } + return log_ERRNO(); + } + + if (!access(bin, X_OK)) { + *binary = strdup(bin); + return 0; + } + +end: + curr = NULL; + } + + return -EINVAL; +} + static int supplicant_spawn(struct supplicant *s) { _shl_free_ char *binary = NULL; @@ -2414,14 +2458,12 @@ static int supplicant_spawn(struct supplicant *s) log_debug("spawn supplicant of %s", s->l->ifname); - binary = shl_strcat(arg_wpa_bindir, "/wpa_supplicant"); - if (!binary) - return log_ENOMEM(); + if (supplicant_find(&binary) < 0) { + log_error("execution of wpas (%s) not possible: %m", binary); + return -EINVAL; + } - if (access(binary, X_OK) < 0) { - log_error("execution of wpas (%s) not possible: %m", binary); - return -EINVAL; - } + log_info("wpa_supplicant found: %s", binary); pid = fork(); if (pid < 0) { diff --git a/src/wifi/wifid.c b/src/wifi/wifid.c index 9bfd2a8..9533206 100644 --- a/src/wifi/wifid.c +++ b/src/wifi/wifid.c @@ -40,7 +40,6 @@ #include "wifid.h" #include "config.h" -const char *arg_wpa_bindir = "/usr/bin"; const char *interface_name = NULL; unsigned int arg_wpa_loglevel = LOG_NOTICE; @@ -457,7 +456,6 @@ static int help(void) "\n" " -i --interface Choose the interface to use\n" "\n" - " --wpa-bindir wpa_supplicant binary dir [/usr/bin]\n" " --wpa-loglevel