Refactor dontkillme() - slock - simple X display locker utility | |
git clone git://git.suckless.org/slock | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 137f0076c2986306109d637599b885bdaf92cd58 | |
parent a9eddbd94fb03a36186ef2b1e784468dfcddbc19 | |
Author: FRIGN <[email protected]> | |
Date: Tue, 23 Aug 2016 01:45:46 +0200 | |
Refactor dontkillme() | |
- Use file pointers instead of raw I/O, inspired by Kernel code. | |
- Use OOM_SCORE_ADJ_MIN from linux/oom.h instead of working with | |
magic values. | |
- Stricter error checking and descriptive error messages. | |
The reasoning for using the constant rather than magic values lies | |
in the fact that this ensures people get the message. | |
With "-1000", a code reviewer would question if that is really the | |
lowest possible number or just an arbitrary value. | |
The kernel ABI probably won't change, but even in the case, we wouldn't | |
have to modify the code. The OOM killer only is guaranteed to not | |
kill you if you have OOM_SCORE_ADJ_MIN. | |
Diffstat: | |
M slock.c | 22 +++++++++++++++------- | |
1 file changed, 15 insertions(+), 7 deletions(-) | |
--- | |
diff --git a/slock.c b/slock.c | |
@@ -65,19 +65,27 @@ die(const char *errstr, ...) | |
#ifdef __linux__ | |
#include <fcntl.h> | |
+#include <linux/oom.h> | |
static void | |
dontkillme(void) | |
{ | |
- int fd; | |
+ FILE *f; | |
+ const char oomfile[] = "/proc/self/oom_score_adj"; | |
- fd = open("/proc/self/oom_score_adj", O_WRONLY); | |
- if (fd < 0 && errno == ENOENT) { | |
- return; | |
+ if (!(f = fopen(oomfile, "w"))) { | |
+ if (errno == ENOENT) | |
+ return; | |
+ die("slock: fopen %s: %s\n", oomfile, strerror(errno)); | |
} | |
- if (fd < 0 || write(fd, "-1000\n", (sizeof("-1000\n") - 1)) != | |
- (sizeof("-1000\n") - 1) || close(fd) != 0) { | |
- die("can't tame the oom-killer. is suid or sgid set?\n"); | |
+ fprintf(f, "%d", OOM_SCORE_ADJ_MIN); | |
+ if (fclose(f)) { | |
+ if (errno == EACCES) | |
+ die("slock: unable to disable OOM killer. " | |
+ "suid or sgid set?\n"); | |
+ else | |
+ die("slock: fclose %s: %s\n", oomfile, | |
+ strerror(errno)); | |
} | |
} | |
#endif |