From 46dcc997e200f2d8a2dafcd2e5611c89c0aa746d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Wed, 5 Oct 2022 23:07:13 -0500
Subject: [PATCH] increase RLIMIT_CORE (generate a coredump)

---
 dwl.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/dwl.c b/dwl.c
index 355450f..f3bc6b6 100644
--- a/dwl.c
+++ b/dwl.c
@@ -8,6 +8,7 @@
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/resource.h>
 #include <sys/wait.h>
 #include <time.h>
 #include <unistd.h>
@@ -363,6 +364,8 @@ static void zoom(const Arg *arg);
 
 /* variables */
 static const char broken[] = "broken";
+static struct rlimit oldrlimit;
+static struct rlimit newrlimit;
 static pid_t child_pid = -1;
 static int locked;
 static void *exclusive_focus;
@@ -469,6 +472,7 @@ autostartexec(void) {
 	autostart_pids = calloc(autostart_len, sizeof(pid_t));
 	for (p = autostart; *p; i++, p++) {
 		if ((autostart_pids[i] = fork()) == 0) {
+			setrlimit(RLIMIT_CORE, &oldrlimit);
 			setsid();
 			execvp(*p, (char *const *)p);
 			die("dwl: execvp %s failed:", *p);
@@ -2332,6 +2336,7 @@ run(char *startup_cmd)
 		if ((child_pid = fork()) < 0)
 			die("startup: fork:");
 		if (child_pid == 0) {
+			setrlimit(RLIMIT_CORE, &oldrlimit);
 			dup2(piperw[0], STDIN_FILENO);
 			close(piperw[0]);
 			close(piperw[1]);
@@ -2756,6 +2761,7 @@ void
 spawn(const Arg *arg)
 {
 	if (fork() == 0) {
+		setrlimit(RLIMIT_CORE, &oldrlimit);
 		dup2(STDERR_FILENO, STDOUT_FILENO);
 		setsid();
 		execvp(((char **)arg->v)[0], (char **)arg->v);
@@ -3273,6 +3279,10 @@ main(int argc, char *argv[])
 	char *startup_cmd = NULL;
 	int c;
 
+	getrlimit(RLIMIT_CORE, &oldrlimit);
+	newrlimit.rlim_cur = newrlimit.rlim_max = oldrlimit.rlim_max;
+	setrlimit(RLIMIT_CORE, &newrlimit);
+
 	while ((c = getopt(argc, argv, "s:hdv")) != -1) {
 		if (c == 's')
 			startup_cmd = optarg;