[hackers] [slock] Refactor dontkillme() || FRIGN

From: <git_AT_suckless.org>
Date: Wed, 31 Aug 2016 19:08:04 +0200 (CEST)

commit 137f0076c2986306109d637599b885bdaf92cd58
Author: FRIGN <dev_AT_frign.de>
AuthorDate: Tue Aug 23 01:45:46 2016 +0200
Commit: Markus Teich <markus.teich_AT_stusta.mhn.de>
CommitDate: Wed Aug 31 01:06:44 2016 +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.

diff --git a/slock.c b/slock.c
index 3e2ab8f..9ec2f71 100644
--- a/slock.c
+++ b/slock.c
_AT_@ -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
Received on Wed Aug 31 2016 - 19:08:04 CEST

This archive was generated by hypermail 2.3.0 : Wed Aug 31 2016 - 19:12:21 CEST