diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-12-11 01:38:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-11 01:38:17 +0100 |
commit | 0fe89fc9d777d4b07684c33eb07b304e1e8285e3 (patch) | |
tree | 44f619016c4ba86a87799688c9d94b04c10e1dbd /src/nvim/eval.c | |
parent | 19848dce50c92b8f40dfd98b9a9d7366a829f4b8 (diff) | |
parent | cc7c42ed5dda06b84b9a93f375419b2fcbe7d9ac (diff) | |
download | rneovim-0fe89fc9d777d4b07684c33eb07b304e1e8285e3.tar.gz rneovim-0fe89fc9d777d4b07684c33eb07b304e1e8285e3.tar.bz2 rneovim-0fe89fc9d777d4b07684c33eb07b304e1e8285e3.zip |
Merge #5750 from justinmk/jobstart
jobstart(): Return -1 if cmd is non-executable
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index ba5864fe3b..a02ca40173 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -11581,7 +11581,7 @@ static void f_jobresize(typval_T *argvars, typval_T *rettv, FunPtr fptr) rettv->vval.v_number = 1; } -static char **tv_to_argv(typval_T *cmd_tv, char **cmd) +static char **tv_to_argv(typval_T *cmd_tv, char **cmd, bool *executable) { if (cmd_tv->v_type == VAR_STRING) { char *cmd_str = (char *)get_tv_string(cmd_tv); @@ -11599,7 +11599,7 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd) list_T *argl = cmd_tv->vval.v_list; int argc = argl->lv_len; if (!argc) { - EMSG(_("Argument vector must have at least one item")); + EMSG(_(e_invarg)); // List must have at least one item. return NULL; } @@ -11607,9 +11607,8 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd) const char_u *exe = get_tv_string_chk(&argl->lv_first->li_tv); if (!exe || !os_can_exe(exe, NULL, true)) { - // String is not executable - if (exe) { - EMSG2(e_jobexe, exe); + if (exe && executable) { + *executable = false; } return NULL; } @@ -11617,7 +11616,7 @@ static char **tv_to_argv(typval_T *cmd_tv, char **cmd) if (cmd) { *cmd = (char *)exe; } - + // Build the argument vector int i = 0; char **argv = xcalloc(argc + 1, sizeof(char *)); @@ -11644,8 +11643,10 @@ static void f_jobstart(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } - char **argv = tv_to_argv(&argvars[0], NULL); + bool executable = true; + char **argv = tv_to_argv(&argvars[0], NULL, &executable); if (!argv) { + rettv->vval.v_number = executable ? 0 : -1; return; // Did error message in tv_to_argv. } @@ -16235,7 +16236,7 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv, } // get shell command to execute - char **argv = tv_to_argv(&argvars[0], NULL); + char **argv = tv_to_argv(&argvars[0], NULL, NULL); if (!argv) { xfree(input); return; // Already did emsg. @@ -16468,8 +16469,10 @@ static void f_termopen(typval_T *argvars, typval_T *rettv, FunPtr fptr) } char *cmd; - char **argv = tv_to_argv(&argvars[0], &cmd); + bool executable = true; + char **argv = tv_to_argv(&argvars[0], &cmd, &executable); if (!argv) { + rettv->vval.v_number = executable ? 0 : -1; return; // Did error message in tv_to_argv. } |