Author: brooks
Date: Fri Mar 15 19:27:27 2013
New Revision: 248337
URL: http://svnweb.freebsd.org/changeset/base/248337

Log:
  MFC all features as of r248336:
  
  The user visable feature is from r246083:
  
  Add -l option to cat(1). This option causes cat(1) to use fcntl(2) to
  set an exclusive advisory lock on stdout.  This will be used to guarantee
  orderly writing to METALOG.
  
  Sponsored by: DARPA, AFRL
  Obtained from:        NetBSD (mason)

Modified:
  stable/9/bin/cat/cat.1
  stable/9/bin/cat/cat.c
Directory Properties:
  stable/9/bin/cat/   (props changed)

Modified: stable/9/bin/cat/cat.1
==============================================================================
--- stable/9/bin/cat/cat.1      Fri Mar 15 19:16:35 2013        (r248336)
+++ stable/9/bin/cat/cat.1      Fri Mar 15 19:27:27 2013        (r248337)
@@ -32,7 +32,7 @@
 .\"     @(#)cat.1      8.3 (Berkeley) 5/2/95
 .\" $FreeBSD$
 .\"
-.Dd March 21, 2004
+.Dd January 29, 2013
 .Dt CAT 1
 .Os
 .Sh NAME
@@ -40,7 +40,7 @@
 .Nd concatenate and print files
 .Sh SYNOPSIS
 .Nm
-.Op Fl benstuv
+.Op Fl belnstuv
 .Op Ar
 .Sh DESCRIPTION
 The
@@ -79,6 +79,16 @@ Display non-printing characters (see the
 option), and display 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
@@ -127,7 +137,7 @@ to the file
 truncating
 .Pa file3
 if it already exists.
-See the manual page for your shell (i.e.,
+See the manual page for your shell (e.g.,
 .Xr sh 1 )
 for more information on redirection.
 .Pp
@@ -160,6 +170,7 @@ operand.
 .Xr tail 1 ,
 .Xr vis 1 ,
 .Xr zcat 1 ,
+.Xr fcntl 2 ,
 .Xr setbuf 3
 .Rs
 .%A Rob Pike
@@ -175,7 +186,7 @@ utility is compliant with the
 specification.
 .Pp
 The flags
-.Op Fl benstv
+.Op Fl belnstv
 are extensions to the specification.
 .Sh HISTORY
 A

Modified: stable/9/bin/cat/cat.c
==============================================================================
--- stable/9/bin/cat/cat.c      Fri Mar 15 19:16:35 2013        (r248336)
+++ stable/9/bin/cat/cat.c      Fri Mar 15 19:27:27 2013        (r248337)
@@ -64,9 +64,9 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 
-int bflag, eflag, nflag, sflag, tflag, vflag;
-int rval;
-const char *filename;
+static int bflag, eflag, lflag, nflag, sflag, tflag, vflag;
+static int rval;
+static const char *filename;
 
 static void usage(void);
 static void scanfiles(char *argv[], int cooked);
@@ -96,10 +96,11 @@ int
 main(int argc, char *argv[])
 {
        int ch;
+       struct flock stdout_lock;
 
        setlocale(LC_CTYPE, "");
 
-       while ((ch = getopt(argc, argv, "benstuv")) != -1)
+       while ((ch = getopt(argc, argv, "belnstuv")) != -1)
                switch (ch) {
                case 'b':
                        bflag = nflag = 1;      /* -b implies -n */
@@ -107,6 +108,9 @@ main(int argc, char *argv[])
                case 'e':
                        eflag = vflag = 1;      /* -e implies -v */
                        break;
+               case 'l':
+                       lflag = 1;
+                       break;
                case 'n':
                        nflag = 1;
                        break;
@@ -127,6 +131,15 @@ main(int argc, char *argv[])
                }
        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(EXIT_FAILURE, "stdout");
+       }
+
        if (bflag || eflag || nflag || sflag || tflag || vflag)
                scanfiles(argv, 1);
        else
@@ -140,7 +153,7 @@ main(int argc, char *argv[])
 static void
 usage(void)
 {
-       fprintf(stderr, "usage: cat [-benstuv] [file ...]\n");
+       fprintf(stderr, "usage: cat [-belnstuv] [file ...]\n");
        exit(1);
        /* NOTREACHED */
 }
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to