commit 75e6681fe774a2b59f81dbccf36ae1e471939540
parent 5ec38ca782e494baf549a4da603fbf9162b1bdb3
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Wed, 8 Feb 2006 11:07:30 +0100
nah, zombies still occure because of setsid, now sticking to old cool and reliable double-fork again
Diffstat:
8 files changed, 10 insertions(+), 41 deletions(-)
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -826,7 +826,7 @@ xwrite(IXPConn *c, Fcall *fcall)
switch(m->qid.dtype) {
case Droot:
if(!strncmp(buf, "quit", 5))
- quit();
+ srv.running = 0;
else if(!strncmp(buf, "pager", 6))
pager();
else if(!strncmp(buf, "detached", 9))
diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c
@@ -30,12 +30,6 @@ usage()
exit(1);
}
-void
-quit()
-{
- srv.running = 0;
-}
-
static void
scale_rect(XRectangle * from_dim, XRectangle * to_dim,
XRectangle * src, XRectangle * tgt)
@@ -647,8 +641,6 @@ main(int argc, char *argv[])
exit(1);
}
- wmii_signal(quit);
-
/* IXP server */
ixp_server_open_conn(&srv, i, new_ixp_conn, ixp_server_close_conn);
root_qid.type = IXP_QTDIR;
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -230,5 +230,4 @@ void pager();
void detached_clients();
void attach_detached_client();
void select_page(char *arg);
-void quit();
diff --git a/cmd/wmiibar.c b/cmd/wmiibar.c
@@ -89,12 +89,6 @@ dummy_error_handler(Display * dpy, XErrorEvent * err)
return 0;
}
-static void
-quit()
-{
- srv.running = 0;
-}
-
static Item *
new_item()
{
@@ -665,7 +659,7 @@ xwrite(IXPConn *c, Fcall *fcall)
memcpy(buf, fcall->data, 4);
buf[4] = 0;
if(!strncmp(buf, "quit", 5)) {
- quit();
+ srv.running = 0;
break;
}
}
@@ -848,8 +842,6 @@ main(int argc, char *argv[])
exit(1);
}
- wmii_signal(quit);
-
/* IXP server */
ixp_server_open_conn(&srv, i, new_ixp_conn, ixp_server_close_conn);
root_qid.type = IXP_QTDIR;
diff --git a/cmd/wmiikeys.c b/cmd/wmiikeys.c
@@ -78,12 +78,6 @@ usage()
exit(1);
}
-static void
-quit()
-{
- srv.running = 0;
-}
-
/* X stuff */
static void
@@ -870,8 +864,6 @@ main(int argc, char *argv[])
exit(1);
}
- wmii_signal(quit);
-
/* IXP server */
ixp_server_open_conn(&srv, i, new_ixp_conn, ixp_server_close_conn);
root_qid.type = IXP_QTDIR;
diff --git a/libwmii/Makefile b/libwmii/Makefile
@@ -6,7 +6,7 @@ include ../config.mk
CFLAGS += -I../liblitz -I../libixp -I../libcext
LDFLAGS += -L../liblitz -llitz -L../libixp -lixp -L../libcext -lcext
-SRC = ixp.c signal.c spawn.c wm.c
+SRC = ixp.c spawn.c wm.c
OBJ = ${SRC:.c=.o}
diff --git a/libwmii/spawn.c b/libwmii/spawn.c
@@ -5,28 +5,25 @@
#include <stdlib.h>
#include <stdio.h>
-#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "wmii.h"
-void
+void
wmii_spawn(void *dpy, char *cmd)
{
- pid_t pid = fork();
-
- switch (pid)
- {
- case 0:
+ /* double-fork catches all zombies */
+ if (fork() == 0) {
+ if (fork() == 0) {
setsid();
close(ConnectionNumber(dpy));
execlp("rc", "rc", "-c", cmd, (char *) 0);
- exit(1);
perror("failed");
exit(1);
- case -1:
- perror("can't fork");
+ }
+ exit(0);
}
+ wait(0);
}
diff --git a/libwmii/wmii.h b/libwmii/wmii.h
@@ -19,9 +19,6 @@ char *wmii_ixp_version(IXPConn *c, Fcall *fcall);
char *wmii_ixp_attach(IXPConn *c, Fcall *fcall);
char *wmii_ixp_clunk(IXPConn *c, Fcall *fcall);
-/* signal.c */
-void wmii_signal(void (*sigchld_handler)());
-
/* spawn.c */
void wmii_spawn(void *dpy, char *cmd);