summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h2
-rw-r--r--kbfunc.c3
-rw-r--r--util.c40
3 files changed, 28 insertions, 17 deletions
diff --git a/calmwm.h b/calmwm.h
index f51deb2..d9c0e77 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -401,7 +401,7 @@ int			 xu_getstate(struct client_ctx *, int *);
 void			 xu_key_grab_keycode(Window, int, int);
 
 int			 u_spawn(char *);
-void			 exec_wm(char *);
+void			 u_exec(char *);
 
 void			 grab_sweep(struct client_ctx *);
 void			 grab_drag(struct client_ctx *);
diff --git a/kbfunc.c b/kbfunc.c
index 2b2eeab..a512137 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -359,7 +359,8 @@ kbfunc_exec(struct client_ctx *scratch, void *arg)
 				u_spawn(mi->text);
 				break;
 			case CWM_EXEC_WM:
-				exec_wm(mi->text);
+				u_exec(mi->text);
+				warn("%s", mi->text);
 				break;
 			default:
 				err(1, "kb_func: egad, cmd changed value!");
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]);
 }