diff options
author | Bram Moolenaar <Bram@vim.org> | 2011-08-04 22:59:28 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2011-08-04 22:59:28 +0200 |
commit | ea35ef68889b03c7d026ee5cc5e9aadbbd1d54bb (patch) | |
tree | d673f070fd22930e026d8baae9e91624c34778c0 | |
parent | e70172e1fc04343a1f46c625772a871a9f9c6f3e (diff) | |
download | vim-git-ea35ef68889b03c7d026ee5cc5e9aadbbd1d54bb.tar.gz |
updated for version 7.3.269v7.3.269
Problem: 'shellcmdflag' only works with one flag.
Solution: Split into multiple arguments. (Gary Johnson)
-rw-r--r-- | src/os_unix.c | 34 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 35 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) diff --git a/src/version.c b/src/version.c index 8adefc080..0d97adec5 100644 --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 269, +/**/ 268, /**/ 267, |