From: Zbigniew Jędrzejewski-Szmek Date: Thu, 17 Sep 2020 12:32:17 +0000 (+0200) Subject: basic/path-util: enhance find_executable() for the fixed path case X-Git-Tag: v247-rc1~176^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=92673045b55dd58c568a0b31ada4516d55933024;p=thirdparty%2Fsystemd.git basic/path-util: enhance find_executable() for the fixed path case --- diff --git a/src/basic/path-util.c b/src/basic/path-util.c index cecee3a5415..a36cf8332c2 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -585,9 +585,9 @@ char* path_join_internal(const char *first, ...) { return joined; } -int find_executable(const char *name, char **ret) { +int find_executable_full(const char *name, bool use_path_envvar, char **ret) { int last_error, r; - const char *p; + const char *p = NULL; assert(name); @@ -604,8 +604,10 @@ int find_executable(const char *name, char **ret) { return 0; } - /* Plain getenv, not secure_getenv, because we want to actually allow the user to pick the binary. */ - p = getenv("PATH"); + if (use_path_envvar) + /* Plain getenv, not secure_getenv, because we want to actually allow the user to pick the + * binary. */ + p = getenv("PATH"); if (!p) p = DEFAULT_PATH; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 3d524483343..bd8c14903e5 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -88,7 +88,10 @@ int path_strv_make_absolute_cwd(char **l); char** path_strv_resolve(char **l, const char *root); char** path_strv_resolve_uniq(char **l, const char *root); -int find_executable(const char *name, char **filename); +int find_executable_full(const char *name, bool use_path_envvar, char **ret); +static inline int find_executable(const char *name, char **ret) { + return find_executable_full(name, true, ret); +} bool paths_check_timestamp(const char* const* paths, usec_t *paths_ts_usec, bool update); diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c index 83336fc7fed..e98c19dd6cc 100644 --- a/src/test/test-path-util.c +++ b/src/test/test-path-util.c @@ -164,6 +164,42 @@ static void test_path_equal_root(void) { assert_se(!path_equal_or_files_same("/", "/.../", AT_SYMLINK_NOFOLLOW)); } +static void test_find_executable_full(void) { + char *p; + + log_info("/* %s */", __func__); + + assert_se(find_executable_full("sh", true, &p) == 0); + puts(p); + assert_se(streq(basename(p), "sh")); + free(p); + + assert_se(find_executable_full("sh", false, &p) == 0); + puts(p); + assert_se(streq(basename(p), "sh")); + free(p); + + _cleanup_free_ char *oldpath = NULL; + p = getenv("PATH"); + if (p) + assert_se(oldpath = strdup(p)); + + assert_se(unsetenv("PATH") >= 0); + + assert_se(find_executable_full("sh", true, &p) == 0); + puts(p); + assert_se(streq(basename(p), "sh")); + free(p); + + assert_se(find_executable_full("sh", false, &p) == 0); + puts(p); + assert_se(streq(basename(p), "sh")); + free(p); + + if (oldpath) + assert_se(setenv("PATH", oldpath, true) >= 0); +} + static void test_find_executable(const char *self) { char *p; @@ -176,8 +212,7 @@ static void test_find_executable(const char *self) { assert_se(find_executable(self, &p) == 0); puts(p); - /* libtool might prefix the binary name with "lt-" */ - assert_se(endswith(p, "/lt-test-path-util") || endswith(p, "/test-path-util")); + assert_se(endswith(p, "/test-path-util")); assert_se(path_is_absolute(p)); free(p); @@ -187,8 +222,18 @@ static void test_find_executable(const char *self) { assert_se(path_is_absolute(p)); free(p); + assert_se(find_executable("/bin/touch", &p) == 0); + assert_se(streq(p, "/bin/touch")); + free(p); + + assert_se(find_executable("touch", &p) == 0); + assert_se(path_is_absolute(p)); + assert_se(streq(basename(p), "touch")); + free(p); + assert_se(find_executable("xxxx-xxxx", &p) == -ENOENT); assert_se(find_executable("/some/dir/xxxx-xxxx", &p) == -ENOENT); + assert_se(find_executable("/proc/filesystems", &p) == -EACCES); } static void test_prefixes(void) { @@ -670,6 +715,7 @@ int main(int argc, char **argv) { test_print_paths(); test_path(); test_path_equal_root(); + test_find_executable_full(); test_find_executable(argv[0]); test_prefixes(); test_path_join();