Do not check for existence of remote binaries
systemd-run would fail when run with -M or -H and an absolute path, if this path did not exists locally. Allow it to continue, since we don't have a nice way of checking if the binary exists remotely. The case where -M or -H is used and a local path is unchanged, and we still iterate over $PATH to find the binary. We need to convert to an absolute path, and we don't have a nice mechanism to check remotely, so we assume that the binary will be located in the same place locally and remotely. http://lists.freedesktop.org/archives/systemd-devel/2014-November/025418.html
This commit is contained in:
parent
8ecec322fe
commit
b63bd1090b
|
@ -573,9 +573,12 @@ int main(int argc, char* argv[]) {
|
|||
if (r <= 0)
|
||||
goto finish;
|
||||
|
||||
r = find_binary(argv[optind], &command);
|
||||
r = find_binary(argv[optind], arg_transport == BUS_TRANSPORT_LOCAL, &command);
|
||||
if (r < 0) {
|
||||
log_error("Failed to find executable %s: %s", argv[optind], strerror(-r));
|
||||
log_error("Failed to find executable %s%s: %s",
|
||||
argv[optind],
|
||||
arg_transport == BUS_TRANSPORT_LOCAL ? "" : " on local system",
|
||||
strerror(-r));
|
||||
goto finish;
|
||||
}
|
||||
argv[optind] = command;
|
||||
|
|
|
@ -563,11 +563,11 @@ int path_is_os_tree(const char *path) {
|
|||
return r >= 0;
|
||||
}
|
||||
|
||||
int find_binary(const char *name, char **filename) {
|
||||
int find_binary(const char *name, bool local, char **filename) {
|
||||
assert(name);
|
||||
|
||||
if (is_path(name)) {
|
||||
if (access(name, X_OK) < 0)
|
||||
if (local && access(name, X_OK) < 0)
|
||||
return -errno;
|
||||
|
||||
if (filename) {
|
||||
|
@ -657,7 +657,7 @@ int fsck_exists(const char *fstype) {
|
|||
|
||||
checker = strappenda("fsck.", fstype);
|
||||
|
||||
r = find_binary(checker, &p);
|
||||
r = find_binary(checker, true, &p);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
|
|
@ -55,7 +55,7 @@ int path_is_mount_point(const char *path, bool allow_symlink);
|
|||
int path_is_read_only_fs(const char *path);
|
||||
int path_is_os_tree(const char *path);
|
||||
|
||||
int find_binary(const char *name, char **filename);
|
||||
int find_binary(const char *name, bool local, char **filename);
|
||||
|
||||
bool paths_check_timestamp(const char* const* paths, usec_t *paths_ts_usec, bool update);
|
||||
|
||||
|
|
|
@ -85,29 +85,30 @@ static void test_path(void) {
|
|||
}
|
||||
}
|
||||
|
||||
static void test_find_binary(const char *self) {
|
||||
static void test_find_binary(const char *self, bool local) {
|
||||
char *p;
|
||||
|
||||
assert_se(find_binary("/bin/sh", &p) == 0);
|
||||
assert_se(find_binary("/bin/sh", local, &p) == 0);
|
||||
puts(p);
|
||||
assert_se(streq(p, "/bin/sh"));
|
||||
free(p);
|
||||
|
||||
assert_se(find_binary(self, &p) == 0);
|
||||
assert_se(find_binary(self, local, &p) == 0);
|
||||
puts(p);
|
||||
assert_se(endswith(p, "/test-path-util"));
|
||||
assert_se(path_is_absolute(p));
|
||||
free(p);
|
||||
|
||||
assert_se(find_binary("sh", &p) == 0);
|
||||
assert_se(find_binary("sh", local, &p) == 0);
|
||||
puts(p);
|
||||
assert_se(endswith(p, "/sh"));
|
||||
assert_se(path_is_absolute(p));
|
||||
free(p);
|
||||
|
||||
assert_se(find_binary("xxxx-xxxx", &p) == -ENOENT);
|
||||
assert_se(find_binary("xxxx-xxxx", local, &p) == -ENOENT);
|
||||
|
||||
assert_se(find_binary("/some/dir/xxxx-xxxx", &p) == -ENOENT);
|
||||
assert_se(find_binary("/some/dir/xxxx-xxxx", local, &p) ==
|
||||
(local ? -ENOENT : 0));
|
||||
}
|
||||
|
||||
static void test_prefixes(void) {
|
||||
|
@ -263,7 +264,8 @@ static void test_path_startswith(void) {
|
|||
|
||||
int main(int argc, char **argv) {
|
||||
test_path();
|
||||
test_find_binary(argv[0]);
|
||||
test_find_binary(argv[0], true);
|
||||
test_find_binary(argv[0], false);
|
||||
test_prefixes();
|
||||
test_path_join();
|
||||
test_fsck_exists();
|
||||
|
|
Loading…
Reference in a new issue