diff options
author | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-25 00:02:28 +0100 |
---|---|---|
committer | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-25 00:14:13 +0100 |
commit | 32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3 (patch) | |
tree | b4f10872f5182c8db7fa9629d1567e34e8373ef1 /common | |
parent | ed227f5664196d85194d63d01a5382499867a386 (diff) | |
download | sway-32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3.tar.xz |
Add quotes to multiword arguments.
This adds quotes around multiword arguments before they are passed to
`/bin/sh -c` in an exec command.
Example:
I connect to irc like this:
exec termite -e "mosh server tmux a"
Without this patch the arguments are passed to sh as:
termite -e mosh server tmux a
When it should be:
termite -e "mosh server tmux a"
For the command to work.
Diffstat (limited to 'common')
-rw-r--r-- | common/stringop.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/common/stringop.c b/common/stringop.c index 81d9b963..186fe121 100644 --- a/common/stringop.c +++ b/common/stringop.c @@ -273,6 +273,32 @@ char *join_args(char **argv, int argc) { return res; } +static bool has_whitespace(const char *str) { + while (*str) { + if (isspace(*str)) { + return true; + } + ++str; + } + return false; +} + +/** + * Add quotes around any argv with whitespaces. + */ +void add_quotes(char **argv, int argc) { + int i; + for (i = 0; i < argc; ++i) { + if (has_whitespace(argv[i])) { + int len = strlen(argv[i]) + 3; + char *tmp = argv[i]; + argv[i] = malloc(len * sizeof(char)); + snprintf(argv[i], len, "\"%s\"", tmp); + free(tmp); + } + } +} + /* * Join a list of strings, adding separator in between. Separator can be NULL. */ |