diff options
author | Jan Synacek <jsynacek@redhat.com> | 2015-06-17 13:53:04 +0200 |
---|---|---|
committer | Jan Synacek <jsynacek@redhat.com> | 2015-06-18 13:46:08 +0200 |
commit | 9ef5d8f2cb1ea25eb83d741dfd8a9d393757b6db (patch) | |
tree | 4d43bb0ba35c8148125aaeb0676768b5ba94a0f3 /src/systemctl/systemctl.c | |
parent | a028d19ba5d866c36d1c647a24cfba889cd28a9d (diff) |
systemctl: fix edit when EDITOR contains arguments
Correctly support cases when the EDITOR environment variable and friends
also contain arguments. For example, to run emacs in terminal only, one
can say:
EDITOR="emacs -nw" systemctl edit myservice
Diffstat (limited to 'src/systemctl/systemctl.c')
-rw-r--r-- | src/systemctl/systemctl.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 23fc946fbf..538838b7fc 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -5855,23 +5855,15 @@ static int run_editor(char **paths) { if (pid == 0) { const char **args; - char *editor; + char *editor, **editor_args = NULL; char **tmp_path, **original_path, *p; - unsigned i = 1; + unsigned n_editor_args = 0, i = 1; size_t argc; (void) reset_all_signal_handlers(); (void) reset_signal_mask(); argc = strv_length(paths)/2 + 1; - args = newa(const char*, argc + 1); - - args[0] = NULL; - STRV_FOREACH_PAIR(original_path, tmp_path, paths) { - args[i] = *tmp_path; - i++; - } - args[argc] = NULL; /* SYSTEMD_EDITOR takes precedence over EDITOR which takes precedence over VISUAL * If neither SYSTEMD_EDITOR nor EDITOR nor VISUAL are present, @@ -5884,9 +5876,30 @@ static int run_editor(char **paths) { editor = getenv("VISUAL"); if (!isempty(editor)) { - args[0] = editor; - execvp(editor, (char* const*) args); + editor_args = strv_split(editor, WHITESPACE); + if (!editor_args) { + (void) log_oom(); + _exit(EXIT_FAILURE); + } + n_editor_args = strv_length(editor_args); + argc += n_editor_args - 1; } + args = newa(const char*, argc + 1); + + if (n_editor_args > 0) { + args[0] = editor_args[0]; + for (; i < n_editor_args; i++) + args[i] = editor_args[i]; + } + + STRV_FOREACH_PAIR(original_path, tmp_path, paths) { + args[i] = *tmp_path; + i++; + } + args[i] = NULL; + + if (n_editor_args > 0) + execvp(args[0], (char* const*) args); FOREACH_STRING(p, "editor", "nano", "vim", "vi") { args[0] = p; |