diff options
author | Joe <rbo@gmx.us> | 2025-03-02 15:33:19 +0100 |
---|---|---|
committer | Joe <rbo@gmx.us> | 2025-03-02 15:33:19 +0100 |
commit | 689fc7895e719eb69427c971a92da369c6b82ed5 (patch) | |
tree | 3fe4e8e88e5775b4ba8115ac19f6c9c9c840f0c1 | |
parent | winviewed (diff) | |
download | dwl-689fc7895e719eb69427c971a92da369c6b82ed5.tar.gz dwl-689fc7895e719eb69427c971a92da369c6b82ed5.tar.bz2 dwl-689fc7895e719eb69427c971a92da369c6b82ed5.tar.xz dwl-689fc7895e719eb69427c971a92da369c6b82ed5.tar.zst dwl-689fc7895e719eb69427c971a92da369c6b82ed5.zip |
rlimit
-rw-r--r-- | dwl.c | 22 | ||||
-rw-r--r-- | patches/applied/rlimit_max.patch | 91 |
2 files changed, 113 insertions, 0 deletions
@@ -9,6 +9,7 @@ #include <signal.h> #include <stdio.h> #include <stdlib.h> +#include <sys/resource.h> #include <sys/wait.h> #include <time.h> #include <unistd.h> @@ -368,6 +369,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, uint32_t time); static void powermgrsetmode(struct wl_listener *listener, void *data); static void quit(const Arg *arg); +static void restorerlimit(void); static void rendermon(struct wl_listener *listener, void *data); static void requestdecorationmode(struct wl_listener *listener, void *data); static void requeststartdrag(struct wl_listener *listener, void *data); @@ -427,6 +429,7 @@ static void swallow(Client *c, Client *w); /* variables */ static const char broken[] = "broken"; +static struct rlimit og_rlimit; static pid_t child_pid = -1; static int locked; static void *exclusive_focus; @@ -2595,6 +2598,15 @@ quit(const Arg *arg) } void +restorerlimit(void) +{ + if (og_rlimit.rlim_cur == 0) + return; + if (setrlimit(RLIMIT_NOFILE, &og_rlimit) < 0) + die("setrlimit:"); +} + +void rendermon(struct wl_listener *listener, void *data) { /* This function is called every time an output is ready to display a frame, @@ -2734,6 +2746,7 @@ run(char *startup_cmd) if ((child_pid = fork()) < 0) die("startup: fork:"); if (child_pid == 0) { + restorerlimit(); close(STDIN_FILENO); setsid(); execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL); @@ -2931,10 +2944,18 @@ setsel(struct wl_listener *listener, void *data) void setup(void) { + struct rlimit new_rlimit; int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig}; sigemptyset(&sa.sa_mask); + if (getrlimit(RLIMIT_NOFILE, &og_rlimit) < 0) + die("getrlimit:"); + new_rlimit = og_rlimit; + new_rlimit.rlim_cur = new_rlimit.rlim_max; + if (setrlimit(RLIMIT_NOFILE, &new_rlimit) < 0) + die("setrlimit:"); + for (i = 0; i < (int)LENGTH(sig); i++) sigaction(sig[i], &sa, NULL); @@ -3189,6 +3210,7 @@ void spawn(const Arg *arg) { if (fork() == 0) { + restorerlimit(); close(STDIN_FILENO); dup2(STDERR_FILENO, STDOUT_FILENO); setsid(); diff --git a/patches/applied/rlimit_max.patch b/patches/applied/rlimit_max.patch new file mode 100644 index 0000000..81111b3 --- /dev/null +++ b/patches/applied/rlimit_max.patch @@ -0,0 +1,91 @@ +From d25a8222651671613322677d17b2f987135e02cd Mon Sep 17 00:00:00 2001 +From: sewn <sewn@disroot.org> +Date: Sat, 24 Aug 2024 19:26:26 +0300 +Subject: [PATCH] set max open file descriptors to available max + +--- + dwl.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/dwl.c b/dwl.c +index a2711f6..163ebdd 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> +@@ -316,6 +317,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface, + static void printstatus(void); + static void powermgrsetmode(struct wl_listener *listener, void *data); + static void quit(const Arg *arg); ++static void restorerlimit(void); + static void rendermon(struct wl_listener *listener, void *data); + static void requestdecorationmode(struct wl_listener *listener, void *data); + static void requeststartdrag(struct wl_listener *listener, void *data); +@@ -358,6 +360,7 @@ static void zoom(const Arg *arg); + + /* variables */ + static const char broken[] = "broken"; ++static struct rlimit og_rlimit; + static pid_t child_pid = -1; + static int locked; + static void *exclusive_focus; +@@ -2096,6 +2099,15 @@ quit(const Arg *arg) + wl_display_terminate(dpy); + } + ++void ++restorerlimit(void) ++{ ++ if (og_rlimit.rlim_cur == 0) ++ return; ++ if (setrlimit(RLIMIT_NOFILE, &og_rlimit) < 0) ++ die("setrlimit:"); ++} ++ + void + rendermon(struct wl_listener *listener, void *data) + { +@@ -2232,6 +2244,7 @@ run(char *startup_cmd) + if ((child_pid = fork()) < 0) + die("startup: fork:"); + if (child_pid == 0) { ++ restorerlimit(); + setsid(); + dup2(piperw[0], STDIN_FILENO); + close(piperw[0]); +@@ -2429,10 +2442,18 @@ setsel(struct wl_listener *listener, void *data) + void + setup(void) + { ++ struct rlimit new_rlimit; + int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; + struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig}; + sigemptyset(&sa.sa_mask); + ++ if (getrlimit(RLIMIT_NOFILE, &og_rlimit) < 0) ++ die("getrlimit:"); ++ new_rlimit = og_rlimit; ++ new_rlimit.rlim_cur = new_rlimit.rlim_max; ++ if (setrlimit(RLIMIT_NOFILE, &new_rlimit) < 0) ++ die("setrlimit:"); ++ + for (i = 0; i < (int)LENGTH(sig); i++) + sigaction(sig[i], &sa, NULL); + +@@ -2649,6 +2670,7 @@ void + spawn(const Arg *arg) + { + if (fork() == 0) { ++ restorerlimit(); + dup2(STDERR_FILENO, STDOUT_FILENO); + setsid(); + execvp(((char **)arg->v)[0], (char **)arg->v); +-- +2.46.0 + |