From b3734d9841b1540c8cc81a4eca998911871a15ad Mon Sep 17 00:00:00 2001 From: Zbigniew Jędrzejewski-Szmek Date: Sun, 19 Feb 2017 17:30:53 -0500 Subject: systemctl: fix editing of units with no fragment "systemctl --user edit --force --full tmp.mount" would crash, when we'd do basename(NULL). Fix this by creating a new unit or a new override even if not path is found. Tested with: systemctl --user edit --force --full tmp.mount systemctl --user edit --force tmp.mount systemctl --user edit foo@.service systemctl --user edit foo@bar.service systemctl --user edit --full foo@.service systemctl --user edit --full foo@bar.service --- src/systemctl/systemctl.c | 50 +++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 23 deletions(-) (limited to 'src/systemctl') diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 4fe2f126d8..90ff08538e 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -6812,41 +6812,45 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) { r = unit_find_paths(bus, *name, &lp, &path, NULL); if (r < 0) return r; - else if (!arg_force) { - if (r == 0) { + + if (r == 0) { + assert(!path); + + if (!arg_force) { log_error("Run 'systemctl edit --force %s' to create a new unit.", *name); return -ENOENT; - } else if (!path) { - // FIXME: support units with path==NULL (no FragmentPath) - log_error("No fragment exists for %s.", *name); - return -ENOENT; } - } - unit_name = basename(path); - /* We follow unit aliases, but we need to propagate the instance */ - if (unit_name_is_valid(*name, UNIT_NAME_INSTANCE) && - unit_name_is_valid(unit_name, UNIT_NAME_TEMPLATE)) { - _cleanup_free_ char *instance = NULL; + /* Create a new unit from scratch */ + unit_name = *name; + r = unit_file_create_new(&lp, unit_name, + arg_full ? NULL : ".d/override.conf", + &new_path, &tmp_path); + } else { + assert(path); - r = unit_name_to_instance(*name, &instance); - if (r < 0) - return r; + unit_name = basename(path); + /* We follow unit aliases, but we need to propagate the instance */ + if (unit_name_is_valid(*name, UNIT_NAME_INSTANCE) && + unit_name_is_valid(unit_name, UNIT_NAME_TEMPLATE)) { + _cleanup_free_ char *instance = NULL; - r = unit_name_replace_instance(unit_name, instance, &tmp_name); - if (r < 0) - return r; + r = unit_name_to_instance(*name, &instance); + if (r < 0) + return r; - unit_name = tmp_name; - } + r = unit_name_replace_instance(unit_name, instance, &tmp_name); + if (r < 0) + return r; + + unit_name = tmp_name; + } - if (path) { if (arg_full) r = unit_file_create_copy(&lp, unit_name, path, &new_path, &tmp_path); else r = unit_file_create_new(&lp, unit_name, ".d/override.conf", &new_path, &tmp_path); - } else - r = unit_file_create_new(&lp, *name, NULL, &new_path, &tmp_path); + } if (r < 0) return r; -- cgit v1.2.3-54-g00ecf