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);
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;
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);
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) {
test_print_paths();
test_path();
test_path_equal_root();
+ test_find_executable_full();
test_find_executable(argv[0]);
test_prefixes();
test_path_join();