summary refs log tree commit diff
path: root/util.c
diff options
context:
space:
mode:
authorokan <okan>2015-09-16 17:58:25 +0000
committerokan <okan>2015-09-16 17:58:25 +0000
commit0fdcf3f3dfd336e7593482286dff49cd8be6ce44 (patch)
tree93ef81d5c129af3aeae6650297f0276300882818 /util.c
parent47a10cc05549b0a94e3606ca7be9fe626754d12d (diff)
downloadcwm-0fdcf3f3dfd336e7593482286dff49cd8be6ce44.tar.gz
cwm-0fdcf3f3dfd336e7593482286dff49cd8be6ce44.tar.xz
cwm-0fdcf3f3dfd336e7593482286dff49cd8be6ce44.zip
On execwm, we should properly release resources before exec'ing into a
new window manager; so allow CWM_EXEC_WM to assign new wm to wm_argv and
pass through cwm_status (now EXECWM) so that x_teardown() gets called
before exec'ing the new window manager.  Removes the need for a separate
x_restart() now, using new wm_argv; and consolidates errno for execvp.
Diffstat (limited to 'util.c')
-rw-r--r--util.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/util.c b/util.c
index 0b10795..95e5ba8 100644
--- a/util.c
+++ b/util.c
@@ -31,15 +31,12 @@
 
 #include "calmwm.h"
 
-#define MAXARGLEN 20
-
 void
 u_spawn(char *argstr)
 {
 	switch (fork()) {
 	case 0:
 		u_exec(argstr);
-		err(1, "%s", argstr);
 		break;
 	case -1:
 		warn("fork");
@@ -51,8 +48,10 @@ u_spawn(char *argstr)
 void
 u_exec(char *argstr)
 {
+#define MAXARGLEN 20
 	char	*args[MAXARGLEN], **ap = args;
 	char	**end = &args[MAXARGLEN - 1], *tmp;
+	char	*s = argstr;
 
 	while (ap < end && (*ap = strsep(&argstr, " \t")) != NULL) {
 		if (**ap == '\0')
@@ -75,8 +74,33 @@ u_exec(char *argstr)
 			}
 		}
 	}
-
 	*ap = NULL;
+
 	(void)setsid();
 	(void)execvp(args[0], args);
+	err(1, "%s", s);
+}
+
+char *
+u_argv(char * const *argv)
+{
+	size_t	 siz = 0;
+	int	 i;
+	char	*p;
+
+	if (argv == 0)
+		return(NULL);
+
+	for (i = 0; argv[i]; i++)
+		siz += strlen(argv[i]) + 1;
+	if (siz == 0)
+		return(NULL);
+
+	p = xmalloc(siz);
+	strlcpy(p, argv[0], siz);
+	for (i = 1; argv[i]; i++) {
+		strlcat(p, " ", siz);
+		strlcat(p, argv[i], siz);
+	}
+	return(p);
 }