On Sun, Mar 09, 2025 at 10:10:29AM +0100, g...@suckless.org wrote:
> commit a70d5d2429abf8dcb70a8817990975dc9a621d27
> Author:     NRK <n...@disroot.org>
> AuthorDate: Fri Sep 9 14:50:12 2022 +0600
> Commit:     Hiltjo Posthuma <hil...@codemadness.org>
> CommitDate: Sun Mar 9 10:02:34 2025 +0100
> 
>     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.
> 
> diff --git a/slock.c b/slock.c
> index b2f14e3..b5a9b04 100644
> --- a/slock.c
> +++ b/slock.c
> @@ -13,6 +13,7 @@
>  #include <stdio.h>
>  #include <string.h>
>  #include <unistd.h>
> +#include <spawn.h>
>  #include <sys/types.h>
>  #include <X11/extensions/Xrandr.h>
>  #include <X11/keysym.h>
> @@ -376,15 +377,12 @@ main(int argc, char **argv) {
>  
>       /* run post-lock command */
>       if (argc > 0) {
> -             switch (fork()) {
> -             case -1:
> -                     die("slock: fork failed: %s\n", strerror(errno));
> -             case 0:
> -                     if (close(ConnectionNumber(dpy)) < 0)
> -                             die("slock: close: %s\n", strerror(errno));
> -                     execvp(argv[0], argv);
> -                     fprintf(stderr, "slock: execvp %s: %s\n", argv[0], 
> strerror(errno));
> -                     _exit(1);
> +             pid_t pid;
> +             extern char **environ;
> +             int err = posix_spawnp(&pid, argv[0], NULL, NULL, argv, 
> environ);
> +             if (err) {
> +                     die("slock: failed to execute post-lock command: %s: 
> %s\n",
> +                         argv[0], strerror(err));
>               }
>       }
>  
> 

Hi NRK,

Thanks for the patch! It looks good and I've pushed it to master.

-- 
Kind regards,
Hiltjo

Reply via email to