svn commit: r248337 - stable/9/bin/cat

Brooks Davis brooks at FreeBSD.org
Fri Mar 15 19:27:28 UTC 2013


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 */
 }


More information about the svn-src-all mailing list