summaryrefslogtreecommitdiff
path: root/src/os_unix.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2011-08-04 22:59:28 +0200
committerBram Moolenaar <Bram@vim.org>2011-08-04 22:59:28 +0200
commitea35ef68889b03c7d026ee5cc5e9aadbbd1d54bb (patch)
treed673f070fd22930e026d8baae9e91624c34778c0 /src/os_unix.c
parente70172e1fc04343a1f46c625772a871a9f9c6f3e (diff)
downloadvim-ea35ef68889b03c7d026ee5cc5e9aadbbd1d54bb.zip
updated for version 7.3.269
Problem: 'shellcmdflag' only works with one flag. Solution: Split into multiple arguments. (Gary Johnson)
Diffstat (limited to 'src/os_unix.c')
-rw-r--r--src/os_unix.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index 391af9cb1..7b41a90a4 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -3795,8 +3795,10 @@ mch_call_shell(cmd, options)
int retval = -1;
char **argv = NULL;
int argc;
+ char_u *p_shcf_copy = NULL;
int i;
char_u *p;
+ char_u *s;
int inquote;
int pty_master_fd = -1; /* for pty's */
# ifdef FEAT_GUI
@@ -3855,6 +3857,19 @@ mch_call_shell(cmd, options)
}
if (argv == NULL)
{
+ /*
+ * Account for possible multiple args in p_shcf.
+ */
+ p = p_shcf;
+ for (;;)
+ {
+ p = skiptowhite(p);
+ if (*p == NUL)
+ break;
+ ++argc;
+ p = skipwhite(p);
+ }
+
argv = (char **)alloc((unsigned)((argc + 4) * sizeof(char *)));
if (argv == NULL) /* out of memory */
goto error;
@@ -3864,7 +3879,23 @@ mch_call_shell(cmd, options)
{
if (extra_shell_arg != NULL)
argv[argc++] = (char *)extra_shell_arg;
- argv[argc++] = (char *)p_shcf;
+
+ /* Break 'shellcmdflag' into white separated parts. This doesn't
+ * handle quoted strings, they are very unlikely to appear. */
+ p_shcf_copy = alloc((unsigned)STRLEN(p_shcf) + 1);
+ if (p_shcf_copy == NULL) /* out of memory */
+ goto error;
+ s = p_shcf_copy;
+ p = p_shcf;
+ while (*p != NUL)
+ {
+ argv[argc++] = (char *)s;
+ while (*p && *p != ' ' && *p != TAB)
+ *s++ = *p++;
+ *s++ = NUL;
+ p = skipwhite(p);
+ }
+
argv[argc++] = (char *)cmd;
}
argv[argc] = NULL;
@@ -4677,6 +4708,7 @@ finished:
}
}
vim_free(argv);
+ vim_free(p_shcf_copy);
error:
if (!did_settmode)