summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-25 00:02:28 +0100
committerLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-25 00:14:13 +0100
commit32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3 (patch)
treeb4f10872f5182c8db7fa9629d1567e34e8373ef1
parentswaybar: move headers to include/bar (diff)
downloadsway-32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3.tar.gz
sway-32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3.tar.zst
sway-32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3.zip
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.
-rw-r--r--common/stringop.c26
-rw-r--r--include/stringop.h5
-rw-r--r--sway/commands.c2
3 files changed, 33 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) {
273 return res; 273 return res;
274} 274}
275 275
276static bool has_whitespace(const char *str) {
277 while (*str) {
278 if (isspace(*str)) {
279 return true;
280 }
281 ++str;
282 }
283 return false;
284}
285
286/**
287 * Add quotes around any argv with whitespaces.
288 */
289void add_quotes(char **argv, int argc) {
290 int i;
291 for (i = 0; i < argc; ++i) {
292 if (has_whitespace(argv[i])) {
293 int len = strlen(argv[i]) + 3;
294 char *tmp = argv[i];
295 argv[i] = malloc(len * sizeof(char));
296 snprintf(argv[i], len, "\"%s\"", tmp);
297 free(tmp);
298 }
299 }
300}
301
276/* 302/*
277 * Join a list of strings, adding separator in between. Separator can be NULL. 303 * Join a list of strings, adding separator in between. Separator can be NULL.
278 */ 304 */
diff --git a/include/stringop.h b/include/stringop.h
index bb681bcd..7c29a745 100644
--- a/include/stringop.h
+++ b/include/stringop.h
@@ -31,6 +31,11 @@ int unescape_string(char *string);
31char *join_args(char **argv, int argc); 31char *join_args(char **argv, int argc);
32char *join_list(list_t *list, char *separator); 32char *join_list(list_t *list, char *separator);
33 33
34/**
35 * Add quotes around any argv with whitespaces.
36 */
37void add_quotes(char **argv, int argc);
38
34// split string into 2 by delim. 39// split string into 2 by delim.
35char *cmdsep(char **stringp, const char *delim); 40char *cmdsep(char **stringp, const char *delim);
36// Split string into 2 by delim, handle quotes 41// Split string into 2 by delim, handle quotes
diff --git a/sway/commands.c b/sway/commands.c
index 9f6e5032..ae5c48e6 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -361,8 +361,10 @@ static struct cmd_results *cmd_exec_always(int argc, char **argv) {
361 return error; 361 return error;
362 } 362 }
363 363
364 add_quotes(argv + 1, argc - 1);
364 tmp = join_args(argv + 1, argc - 1); 365 tmp = join_args(argv + 1, argc - 1);
365 } else { 366 } else {
367 add_quotes(argv, argc);
366 tmp = join_args(argv, argc); 368 tmp = join_args(argv, argc);
367 } 369 }
368 370