simplify post-lock cmd and die if it fails

this patch does two things:

0. simplify the code by using posix_spawn()
1. unify the behavior of what happens if the post-lock cmd fails.

currently, if `fork()` fails, slock will die without locking the screen.
HOWEVER if `execvp()` fails it prints a message to stderr (which the
user cannot see since the screen has been locked already) and only exits
the child while the parent locks the screen.

to reproduce:

	# slock some_bin_that_doesnt_exist

this behavior is inconsistent, if the idea is that post-lock cmd is
_not_ important then we shouldn't `die()` on `fork()` failure either.
and if we assume that the post-lock cmd _is_ important, then we should
die on exec failure as well.

this patch assumes the latter and calls `die()` if `posix_spawn()`
fails.
This commit is contained in:
NRK
2022-09-09 14:50:12 +06:00
committed by Hiltjo Posthuma
parent a34d8fb432
commit a70d5d2429

16
slock.c
View File

@@ -13,6 +13,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <spawn.h>
#include <sys/types.h> #include <sys/types.h>
#include <X11/extensions/Xrandr.h> #include <X11/extensions/Xrandr.h>
#include <X11/keysym.h> #include <X11/keysym.h>
@@ -376,15 +377,12 @@ main(int argc, char **argv) {
/* run post-lock command */ /* run post-lock command */
if (argc > 0) { if (argc > 0) {
switch (fork()) { pid_t pid;
case -1: extern char **environ;
die("slock: fork failed: %s\n", strerror(errno)); int err = posix_spawnp(&pid, argv[0], NULL, NULL, argv, environ);
case 0: if (err) {
if (close(ConnectionNumber(dpy)) < 0) die("slock: failed to execute post-lock command: %s: %s\n",
die("slock: close: %s\n", strerror(errno)); argv[0], strerror(err));
execvp(argv[0], argv);
fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno));
_exit(1);
} }
} }