summaryrefslogtreecommitdiff
path: root/src/systemctl
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-02-19 17:30:53 -0500
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-02-19 17:42:18 -0500
commitb3734d9841b1540c8cc81a4eca998911871a15ad (patch)
tree35e30f9d7994387afb6dba113b3df0a87711f189 /src/systemctl
parentb74df547a90a794ca75eea99238b9ae14a562720 (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/systemctl')
-rw-r--r--src/systemctl/systemctl.c50
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;