From 4c565d2020230ad3fdf603fde32b9892e56c16e1 Mon Sep 17 00:00:00 2001 From: David Vazgenovich Shakaryan Date: Mon, 26 Feb 2024 20:23:19 -0800 Subject: add ability to fork and print PID after locking --- slock.1 | 5 +++++ slock.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/slock.1 b/slock.1 index 40c15e1..08b62b9 100644 --- a/slock.1 +++ b/slock.1 @@ -6,6 +6,7 @@ .Nd simple X screen locker .Sh SYNOPSIS .Nm +.Op Fl f Op Fl p .Op Fl v .Op Ar cmd Op Ar arg ... .Sh DESCRIPTION @@ -17,6 +18,10 @@ is executed after the screen has been locked. .Pp The options are as follows: .Bl -tag -width Ds +.It Fl f +Fork and exit parent process after locking screen. +.It Fl p +Print child PID to stdout after forking. .It Fl v Print version information to stdout and exit. .El diff --git a/slock.c b/slock.c index b2f14e3..0036c10 100644 --- a/slock.c +++ b/slock.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -300,7 +301,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) static void usage(void) { - die("usage: slock [-v] [cmd [arg ...]]\n"); + die("usage: slock [-f [-p]] [-v] [cmd [arg ...]]\n"); } int @@ -314,8 +315,19 @@ main(int argc, char **argv) { const char *hash; Display *dpy; int s, nlocks, nscreens; + int opt_fork, opt_pid; + pid_t pid; + + opt_fork = 0; + opt_pid = 0; ARGBEGIN { + case 'f': + opt_fork = 1; + break; + case 'p': + opt_pid = 1; + break; case 'v': puts("slock-"VERSION); return 0; @@ -323,6 +335,9 @@ main(int argc, char **argv) { usage(); } ARGEND + if (opt_pid && !opt_fork) + usage(); + /* validate drop-user and -group */ errno = 0; if (!(pwd = getpwnam(user))) @@ -374,6 +389,20 @@ main(int argc, char **argv) { if (nlocks != nscreens) return 1; + if (opt_fork) { + switch (pid = fork()) { + case -1: + die("slock: fork failed: %s\n", strerror(errno)); + case 0: + freopen("/dev/null", "w", stdout); + break; + default: + if (opt_pid) + printf("%ji\n", (intmax_t)pid); + exit(0); + } + } + /* run post-lock command */ if (argc > 0) { switch (fork()) { -- cgit v1.2.3-70-g09d2