summary refs log tree commit diff
path: root/util.c
diff options
context:
space:
mode:
authoroga <oga>2008-04-15 21:20:56 +0000
committeroga <oga>2008-04-15 21:20:56 +0000
commitd5794a6b0278433d4a5d288543f74770399e3a91 (patch)
treed0b7590d71fd49176cdde9622c30685bfcf69630 /util.c
parent887a5aa65f255ac0ae4fdc2e7a3ad1c94a435da8 (diff)
downloadcwm-d5794a6b0278433d4a5d288543f74770399e3a91.tar.gz
cwm-d5794a6b0278433d4a5d288543f74770399e3a91.tar.xz
cwm-d5794a6b0278433d4a5d288543f74770399e3a91.zip
make the argument parser for commands accept quoted strings, while i'm
there make u_spawn use exec_wm (renamed to u_exec) for it's execution to
remove duplicated code.

This means constructs like this work in .cwmrc:

bind CM-t "ssh -Y 192.168.1.2 \"xterm -e top\""

or alternatively:

bind CM-t "ssh -Y 192.168.1.2 'xterm -e top'"

"in it goes" okan@.
Diffstat (limited to 'util.c')
-rw-r--r--util.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/util.c b/util.c
index 4379aa3..7e941c6 100644
--- a/util.c
+++ b/util.c
@@ -26,19 +26,10 @@
 int
 u_spawn(char *argstr)
 {
-	char *args[MAXARGLEN], **ap;
-	char **end = &args[MAXARGLEN - 1];
-
 	switch (fork()) {
 	case 0:
-		ap = args;
-		while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL)
-			ap++;
-
-		*ap = NULL;
-		setsid();
-		execvp(args[0], args);
-		err(1, args[0]);
+		u_exec(argstr);
+		err(1, "%s", argstr);
 		break;
 	case -1:
 		warn("fork");
@@ -51,16 +42,35 @@ u_spawn(char *argstr)
 }
 
 void
-exec_wm(char *argstr)
+u_exec(char *argstr)
 {
 	char *args[MAXARGLEN], **ap = args;
 	char **end = &args[MAXARGLEN - 1];
+	char *tmp;
 
-	while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL)
-		ap++;
+	while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) {
+		if(**ap == '\0')
+			continue;
+ 		ap++;
+		if (argstr != NULL) {
+			/* deal with quoted strings */
+			switch(argstr[0]) {
+			case '"':
+			case '\'':
+				if ((tmp = strchr(argstr + 1, argstr[0]))
+				    != NULL) {
+					*(tmp++) = '\0';
+					*(ap++) = ++argstr;
+					argstr = tmp;
+				}
+				break;
+			default:
+				break;
+			}
+		}
+	}
 
 	*ap = NULL;
 	setsid();
 	execvp(args[0], args);
-	warn(args[0]);
 }