diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-06-18 18:30:31 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-06-18 18:30:31 +0200 |
commit | 26d5692e32aeda1d9ab671e0517da63084cdd43c (patch) | |
tree | 0f545ea29aa6651491e35c2aa81e65996d1533c8 | |
parent | 39765e5f92510ae5d5aa1be39e77d2c5cf2e94a6 (diff) | |
parent | 9ef5d8f2cb1ea25eb83d741dfd8a9d393757b6db (diff) |
Merge pull request #286 from jsynacek/fix-edit-v3
systemctl: fix edit when EDITOR contains arguments
-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; |