diff options
-rw-r--r-- | common/stringop.c | 26 | ||||
-rw-r--r-- | include/stringop.h | 5 | ||||
-rw-r--r-- | sway/commands.c | 2 |
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 | ||
276 | static 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 | */ | ||
289 | void 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); | |||
31 | char *join_args(char **argv, int argc); | 31 | char *join_args(char **argv, int argc); |
32 | char *join_list(list_t *list, char *separator); | 32 | char *join_list(list_t *list, char *separator); |
33 | 33 | ||
34 | /** | ||
35 | * Add quotes around any argv with whitespaces. | ||
36 | */ | ||
37 | void add_quotes(char **argv, int argc); | ||
38 | |||
34 | // split string into 2 by delim. | 39 | // split string into 2 by delim. |
35 | char *cmdsep(char **stringp, const char *delim); | 40 | char *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 | ||