diff options
| author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-02-19 17:30:53 -0500 | 
|---|---|---|
| committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2017-02-19 17:42:18 -0500 | 
| commit | b3734d9841b1540c8cc81a4eca998911871a15ad (patch) | |
| tree | 35e30f9d7994387afb6dba113b3df0a87711f189 /src | |
| parent | b74df547a90a794ca75eea99238b9ae14a562720 (diff) | |
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
Diffstat (limited to 'src')
| -rw-r--r-- | src/systemctl/systemctl.c | 50 | 
1 files changed, 27 insertions, 23 deletions
| 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; | 
