X-Git-Url: https://git.xinqibao.xyz/slock.git/blobdiff_plain/1766ecdfd4db86e5d022a8fb951559714eb1e6a4..65b8d5278882310eed758e6fbfd6ab9676db883c:/slock.c?ds=sidebyside

diff --git a/slock.c b/slock.c
index fa7ec84..c9cdee2 100644
--- a/slock.c
+++ b/slock.c
@@ -52,6 +52,7 @@ die(const char *errstr, ...)
 {
 	va_list ap;
 
+	fputs("slock: ", stderr);
 	va_start(ap, errstr);
 	vfprintf(stderr, errstr, ap);
 	va_end(ap);
@@ -60,28 +61,20 @@ die(const char *errstr, ...)
 
 #ifdef __linux__
 #include <fcntl.h>
-#include <linux/oom.h>
 
 static void
 dontkillme(void)
 {
 	int fd;
-	int length;
-	char value[64];
 
 	fd = open("/proc/self/oom_score_adj", O_WRONLY);
-	if (fd < 0 && errno == ENOENT)
+	if (fd < 0 && errno == ENOENT) {
 		return;
-
-	/* convert OOM_SCORE_ADJ_MIN to string for writing */
-	length = snprintf(value, sizeof(value), "%d\n", OOM_SCORE_ADJ_MIN);
-
-	/* bail on truncation */
-	if (length >= sizeof(value))
-		die("buffer too small\n");
-
-	if (fd < 0 || write(fd, value, length) != length || close(fd) != 0)
-		die("cannot disable the out-of-memory killer for this process (make sure to suid or sgid slock)\n");
+	}
+	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");
+	}
 }
 #endif
 
@@ -96,9 +89,9 @@ getpw(void)
 	errno = 0;
 	if (!(pw = getpwuid(getuid()))) {
 		if (errno)
-			die("slock: getpwuid: %s\n", strerror(errno));
+			die("getpwuid: %s\n", strerror(errno));
 		else
-			die("slock: cannot retrieve password entry\n");
+			die("cannot retrieve password entry\n");
 	}
 	rval = pw->pw_passwd;
 
@@ -106,7 +99,7 @@ getpw(void)
 	if (rval[0] == 'x' && rval[1] == '\0') {
 		struct spwd *sp;
 		if (!(sp = getspnam(getenv("USER"))))
-			die("slock: cannot retrieve shadow entry (make sure to suid or sgid slock)\n");
+			die("cannot retrieve shadow entry (make sure to suid or sgid slock)\n");
 		rval = sp->sp_pwdp;
 	}
 #endif
@@ -114,7 +107,7 @@ getpw(void)
 	/* drop privileges */
 	if (geteuid() == 0 &&
 	    ((getegid() != pw->pw_gid && setgid(pw->pw_gid) < 0) || setuid(pw->pw_uid) < 0))
-		die("slock: cannot drop privileges\n");
+		die("cannot drop privileges\n");
 	return rval;
 }
 #endif
@@ -295,10 +288,11 @@ main(int argc, char **argv) {
 	Display *dpy;
 	int screen;
 
-	if ((argc == 2) && !strcmp("-v", argv[1]))
-		die("slock-%s, © 2006-2015 slock engineers\n", VERSION);
+	if ((argc >= 2) && !strcmp("-v", argv[1]))
+		die("version %s, © 2006-2016 slock engineers\n", VERSION);
 
-	if ((argc == 2) && !strcmp("-h", argv[1]))
+	/* treat first argument starting with a '-' as option */
+	if ((argc >= 2) && argv[1][0] == '-')
 		usage();
 
 #ifdef __linux__
@@ -306,19 +300,19 @@ main(int argc, char **argv) {
 #endif
 
 	if (!getpwuid(getuid()))
-		die("slock: no passwd entry for you\n");
+		die("no passwd entry for you\n");
 
 #ifndef HAVE_BSD_AUTH
 	pws = getpw();
 #endif
 
 	if (!(dpy = XOpenDisplay(0)))
-		die("slock: cannot open display\n");
+		die("cannot open display\n");
 	rr = XRRQueryExtension(dpy, &rrevbase, &rrerrbase);
 	/* Get the number of screens in display "dpy" and blank them all. */
 	nscreens = ScreenCount(dpy);
 	if (!(locks = malloc(sizeof(Lock*) * nscreens)))
-		die("slock: malloc: %s\n", strerror(errno));
+		die("Out of memory.\n");
 	int nlocks = 0;
 	for (screen = 0; screen < nscreens; screen++) {
 		if ((locks[screen] = lockscreen(dpy, screen)) != NULL)
@@ -337,7 +331,7 @@ main(int argc, char **argv) {
 		if (dpy)
 			close(ConnectionNumber(dpy));
 		execvp(argv[1], argv+1);
-		die("slock: execvp %s failed: %s\n", argv[1], strerror(errno));
+		die("execvp %s failed: %s\n", argv[1], strerror(errno));
 	}
 
 	/* Everything is now blank. Now wait for the correct password. */