summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoucman <jeremy.rosen@enst-bretagne.fr>2017-07-10 01:52:25 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-07-09 19:52:25 -0400
commitdecd79829a02cc5b633e0e6ffcbd08f5c3492cfd (patch)
tree5b231c6738a2eabe693bfe9cbbdcaa9a231407e6
parente1bc3004ab8ef0266c71516a28e92e3ead08fe5a (diff)
downloadsystemd-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.]
-rw-r--r--src/systemctl/systemctl.c34
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;