git: df268d4b03a1 - main - lockf: add a -p mode to write the child's pid
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 10 Jul 2025 17:54:29 UTC
The branch main has been updated by kevans:
URL: https://cgit.FreeBSD.org/src/commit/?id=df268d4b03a16869502d6842d40aeb66329db982
commit df268d4b03a16869502d6842d40aeb66329db982
Author: Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2025-06-24 15:41:53 +0000
Commit: Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2025-07-10 17:54:19 +0000
lockf: add a -p mode to write the child's pid
If we're going to hold the lock, it can be useful to scribble down the
pid that we spawned off to quickly associate the lock back to the
process that's keeping it open.
Reviewed by: allanjude (previous version), des
Differential Revision: https://reviews.freebsd.org/D51014
---
usr.bin/lockf/lockf.1 | 14 ++++++++++++--
usr.bin/lockf/lockf.c | 15 ++++++++++++---
2 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/usr.bin/lockf/lockf.1 b/usr.bin/lockf/lockf.1
index d73033101632..5832903246f1 100644
--- a/usr.bin/lockf/lockf.1
+++ b/usr.bin/lockf/lockf.1
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd November 25, 2023
+.Dd June 24, 2025
.Dt LOCKF 1
.Os
.Sh NAME
@@ -30,7 +30,7 @@
.Nd execute a command while holding a file lock
.Sh SYNOPSIS
.Nm
-.Op Fl knsw
+.Op Fl knpsw
.Op Fl t Ar seconds
.Ar file
.Ar command
@@ -126,6 +126,16 @@ is not specified,
will create
.Ar file
if necessary.
+.It Fl p
+Write the pid of the
+.Ar command
+to
+.Ar file .
+This option will cause
+.Nm
+to open
+.Ar file
+for writing rather than reading.
.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 7f88753d1743..93164e30762c 100644
--- a/usr.bin/lockf/lockf.c
+++ b/usr.bin/lockf/lockf.c
@@ -91,15 +91,15 @@ fdlock_implied(const char *name, long *ofd)
int
main(int argc, char **argv)
{
- int ch, flags, silent, status;
+ int ch, flags, silent, status, writepid;
long long waitsec;
pid_t child;
union lock_subject subj;
- silent = keep = 0;
+ silent = keep = writepid = 0;
flags = O_CREAT | O_RDONLY;
waitsec = -1; /* Infinite. */
- while ((ch = getopt(argc, argv, "knst:w")) != -1) {
+ while ((ch = getopt(argc, argv, "knpst:w")) != -1) {
switch (ch) {
case 'k':
keep = 1;
@@ -120,6 +120,10 @@ main(int argc, char **argv)
"invalid timeout \"%s\"", optarg);
}
break;
+ case 'p':
+ writepid = 1;
+ flags |= O_TRUNC;
+ /* FALLTHROUGH */
case 'w':
flags = (flags & ~O_RDONLY) | O_WRONLY;
break;
@@ -249,6 +253,11 @@ main(int argc, char **argv)
fclose(stdin);
fclose(stdout);
fclose(stderr);
+
+ /* Write out the pid before we sleep on it. */
+ if (writepid)
+ (void)dprintf(lockfd, "%d\n", child);
+
if (waitpid(child, &status, 0) == -1)
exit(EX_OSERR);
return (WIFEXITED(status) ? WEXITSTATUS(status) : EX_SOFTWARE);