diff options
author | Boucman <jeremy.rosen@enst-bretagne.fr> | 2017-07-10 01:52:25 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-07-09 19:52:25 -0400 |
commit | decd79829a02cc5b633e0e6ffcbd08f5c3492cfd (patch) | |
tree | 5b231c6738a2eabe693bfe9cbbdcaa9a231407e6 /src/systemctl | |
parent | e1bc3004ab8ef0266c71516a28e92e3ead08fe5a (diff) | |
download | systemd-decd79829a02cc5b633e0e6ffcbd08f5c3492cfd.tar.gz |
expand path of systemctl link argument (#6186)
systemctl link is the only systemctl verb that takes a filename (and not
a unit name) as argument
use path_strv_make_absolute_cwd to expand the provided filename in order
to make it easier to use from the command line
keep the absolute pathname requirement when --root is used
[zj: add explicit error messages for the cases of --root and plain filename
instead of skipping normalization and just relying on systemd to refuse
to link non-absolute arguments. This allows us to make the error message
more informative.]
Diffstat (limited to 'src/systemctl')
-rw-r--r-- | src/systemctl/systemctl.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index f5402f0b70..83ed9ef9f7 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -6033,6 +6033,34 @@ static int mangle_names(char **original_names, char ***mangled_names) { return 0; } +static int normalize_filenames(char **names) { + char **u; + int r; + + STRV_FOREACH(u, names) + if (!path_is_absolute(*u)) { + char* normalized_path; + + if (!isempty(arg_root)) { + log_error("Non-absolute paths are not allowed when --root is used: %s", *u); + return -EINVAL; + } + + if (!strchr(*u,'/')) { + log_error("Link argument does contain at least one directory separator: %s", *u); + return -EINVAL; + } + + r = path_make_absolute_cwd(*u, &normalized_path); + if (r < 0) + return r; + + free_and_replace(*u, normalized_path); + } + + return 0; +} + static int normalize_names(char **names, bool warn_if_path) { char **u; bool was_path = false; @@ -6129,6 +6157,12 @@ static int enable_unit(int argc, char *argv[], void *userdata) { return r; } + if (streq(verb, "link")) { + r = normalize_filenames(names); + if (r < 0) + return r; + } + if (install_client_side()) { UnitFileFlags flags; |