Hi,
Attached patch adds the -l flag to cat
"This option causes cat(1) to use fcntl(2) to set an exclusive advisory
lock on stdout." which was used to guarantee orderly writing to file.
Obtained from NetBSD cat.c r1.26


Sevan Janiyan
From NetBSD
cat.c r1.32
cat.1 r1.26

Index: bin/cat/cat.1
===================================================================
RCS file: /cvs/src/bin/cat/cat.1,v
retrieving revision 1.34
diff -u -r1.34 cat.1
--- bin/cat/cat.1       15 Jan 2015 19:06:31 -0000      1.34
+++ bin/cat/cat.1       22 Jul 2015 23:17:57 -0000
@@ -41,7 +41,7 @@
 .Nd concatenate and print files
 .Sh SYNOPSIS
 .Nm cat
-.Op Fl benstuv
+.Op Fl belnstuv
 .Op Ar
 .Sh DESCRIPTION
 The
@@ -70,6 +70,15 @@
 option and also prints a dollar sign
 .Pq Ql \&$
 at the end of each line.
+.It Fl l
+Set an exclusive advisory lock on the standard output file descriptor.
+This lock is set using
+.Xr fcntl 2
+with the
+.Dv F_SETLKW
+command. If the output file is already locked,
+.Nm
+will block until the lock is acquired.
 .It Fl n
 Number the output lines, starting at 1.
 .It Fl s
Index: bin/cat/cat.c
===================================================================
RCS file: /cvs/src/bin/cat/cat.c,v
retrieving revision 1.21
diff -u -r1.21 cat.c
--- bin/cat/cat.c       16 Jan 2015 06:39:28 -0000      1.21
+++ bin/cat/cat.c       22 Jul 2015 23:17:57 -0000
@@ -50,7 +50,7 @@
 
 extern char *__progname;
 
-int bflag, eflag, nflag, sflag, tflag, vflag;
+int bflag, eflag, lflag, nflag, sflag, tflag, vflag;
 int rval;
 char *filename;
 
@@ -63,10 +63,11 @@
 main(int argc, char *argv[])
 {
        int ch;
+       struct flock stdout_lock;
 
        setlocale(LC_ALL, "");
 
-       while ((ch = getopt(argc, argv, "benstuv")) != -1)
+       while ((ch = getopt(argc, argv, "belnstuv")) != -1)
                switch (ch) {
                case 'b':
                        bflag = nflag = 1;      /* -b implies -n */
@@ -74,6 +75,9 @@
                case 'e':
                        eflag = vflag = 1;      /* -e implies -v */
                        break;
+               case 'l':
+                       lflag = 1;
+                       break;
                case 'n':
                        nflag = 1;
                        break;
@@ -91,11 +95,20 @@
                        break;
                default:
                        (void)fprintf(stderr,
-                           "usage: %s [-benstuv] [file ...]\n", __progname);
+                           "usage: %s [-belnstuv] [file ...]\n", __progname);
                        exit(1);
                        /* NOTREACHED */
                }
        argv += optind;
+
+       if (lflag) {
+               stdout_lock.l_len = 0;
+               stdout_lock.l_start = 0;
+               stdout_lock.l_type = F_WRLCK;
+               stdout_lock.l_whence = SEEK_SET;
+               if (fcntl(STDOUT_FILENO, F_SETLKW, &stdout_lock) == -1)
+                       err(1, "stdout");
+       }
 
        if (bflag || eflag || nflag || sflag || tflag || vflag)
                cook_args(argv);

Reply via email to