git: 679f619495f6 - main - lockf: add a -T option to terminate the child upon early abort
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 10 Jul 2025 17:54:32 UTC
The branch main has been updated by kevans:
URL: https://cgit.FreeBSD.org/src/commit/?id=679f619495f67eafc9fdb97d11381b14f2b49ccf
commit 679f619495f67eafc9fdb97d11381b14f2b49ccf
Author: Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2025-06-24 23:03:14 +0000
Commit: Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2025-07-10 17:54:20 +0000
lockf: add a -T option to terminate the child upon early abort
This is useful to avoid having the command running twice in the face of
the admin terminating the process. Notably, if the -p option is not in
use (or can't be used, e.g., because we can't open the file for writing)
then this provides a nice alternative where one simply needs to send a
SIGTERM to the lockf(1) process associated with the lock file to clean
it all up.
Reviewed by: des
Differential Revision: https://reviews.freebsd.org/D51025
---
usr.bin/lockf/lockf.1 | 18 +++++++++++++++++-
usr.bin/lockf/lockf.c | 9 ++++++++-
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/usr.bin/lockf/lockf.1 b/usr.bin/lockf/lockf.1
index 5832903246f1..40b4497bc80c 100644
--- a/usr.bin/lockf/lockf.1
+++ b/usr.bin/lockf/lockf.1
@@ -30,7 +30,7 @@
.Nd execute a command while holding a file lock
.Sh SYNOPSIS
.Nm
-.Op Fl knpsw
+.Op Fl knpsTw
.Op Fl t Ar seconds
.Ar file
.Ar command
@@ -136,6 +136,22 @@ This option will cause
to open
.Ar file
for writing rather than reading.
+.It Fl T
+Upon receipt of a
+.Dv SIGTERM ,
+forward a
+.Dv SIGTERM
+along to the
+.Ar command
+before cleaning up the
+.Ar file
+and exiting.
+By default,
+.Nm
+effectively orphans the
+.Ar command
+after cleaning up the
+.Ar file .
.It Fl t Ar seconds
Specifies a timeout for waiting for the lock.
By default,
diff --git a/usr.bin/lockf/lockf.c b/usr.bin/lockf/lockf.c
index 19424418ed68..b0e16285998a 100644
--- a/usr.bin/lockf/lockf.c
+++ b/usr.bin/lockf/lockf.c
@@ -35,6 +35,7 @@
#include <limits.h>
#include <signal.h>
#include <stdatomic.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -64,6 +65,7 @@ static int lockfd = -1;
static int keep;
static int fdlock;
static int status;
+static bool termchild;
static volatile sig_atomic_t timed_out;
/*
@@ -109,7 +111,7 @@ main(int argc, char **argv)
silent = keep = writepid = 0;
flags = O_CREAT | O_RDONLY;
waitsec = -1; /* Infinite. */
- while ((ch = getopt(argc, argv, "knpst:w")) != -1) {
+ while ((ch = getopt(argc, argv, "knpsTt:w")) != -1) {
switch (ch) {
case 'k':
keep = 1;
@@ -120,6 +122,9 @@ main(int argc, char **argv)
case 's':
silent = 1;
break;
+ case 'T':
+ termchild = true;
+ break;
case 't':
{
const char *errstr;
@@ -356,6 +361,8 @@ static void
killed(int sig)
{
+ if (termchild && child >= 0)
+ kill(child, sig);
cleanup();
signal(sig, SIG_DFL);
if (kill(getpid(), sig) == -1)