aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorMikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-25 00:02:28 +0100
committerMikkel Oscar Lyderik <mikkeloscar@gmail.com>2016-01-25 00:14:13 +0100
commit32ae26e519eeb6a5108f1d82fe36ce5b6ef65af3 (patch)
treeb4f10872f5182c8db7fa9629d1567e34e8373ef1 /common
parented227f5664196d85194d63d01a5382499867a386 (diff)
downloadsway-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.c26
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.
*/