about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHiltjo Posthuma <hiltjo@codemadness.org>2023-04-09 12:37:14 +0200
committerHiltjo Posthuma <hiltjo@codemadness.org>2023-04-09 12:37:14 +0200
commite81f17d4c196aaed6893fd4beed49991caa3e2a4 (patch)
treec15dd5f8179cd0f8f2ad1dba526a17c799e94ce0
parent348f6559ab0d4793db196ffa56ba96ab95a594a6 (diff)
restore SIGCHLD sighandler to default before spawning a program
From sigaction(2):
A child created via fork(2) inherits a copy of its parent's signal dispositions.
During an execve(2), the dispositions of handled signals are reset to the default;
the dispositions of ignored signals are left unchanged.

This refused to start directly some programs from configuring in config.h:

static Key keys[] = {
	MODKEY,                       XK_o,      spawn,          {.v = cmd } },
};

Some reported programs that didn't start were: mpv, anki, dmenu_extended.

Reported by pfx.
Initial patch suggestion by Storkman.
-rw-r--r--dwm.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/dwm.c b/dwm.c
index c2bd871..f1d86b2 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1647,12 +1647,20 @@ showhide(Client *c)
 void
 spawn(const Arg *arg)
 {
+	struct sigaction sa;
+
 	if (arg->v == dmenucmd)
 		dmenumon[0] = '0' + selmon->num;
 	if (fork() == 0) {
 		if (dpy)
 			close(ConnectionNumber(dpy));
 		setsid();
+
+		sigemptyset(&sa.sa_mask);
+		sa.sa_flags = 0;
+		sa.sa_handler = SIG_DFL;
+		sigaction(SIGCHLD, &sa, NULL);
+
 		execvp(((char **)arg->v)[0], (char **)arg->v);
 		die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
 	}