summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2013-01-29 18:19:40 +0000
committerbrooks <brooks@FreeBSD.org>2013-01-29 18:19:40 +0000
commit9b3a8ec1ad946449d27074abacc634cc996c586d (patch)
treeed7a3db17b1e19dbe0d665e445ce9e6887761769
parentc31597fcdaaf38f69c91d2c49c57f1d674fb3a94 (diff)
downloadFreeBSD-src-9b3a8ec1ad946449d27074abacc634cc996c586d.zip
FreeBSD-src-9b3a8ec1ad946449d27074abacc634cc996c586d.tar.gz
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)
-rw-r--r--bin/cat/cat.117
-rw-r--r--bin/cat/cat.c19
2 files changed, 30 insertions, 6 deletions
diff --git a/bin/cat/cat.1 b/bin/cat/cat.1
index 4fdff3a..d4933b2 100644
--- a/bin/cat/cat.1
+++ b/bin/cat/cat.1
@@ -32,7 +32,7 @@
.\" @(#)cat.1 8.3 (Berkeley) 5/2/95
.\" $FreeBSD$
.\"
-.Dd March 21, 2004
+.Dd Jaunary 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
@@ -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
diff --git a/bin/cat/cat.c b/bin/cat/cat.c
index 69c56c0..9e12d3e 100644
--- a/bin/cat/cat.c
+++ b/bin/cat/cat.c
@@ -64,7 +64,7 @@ __FBSDID("$FreeBSD$");
#include <string.h>
#include <unistd.h>
-static int bflag, eflag, nflag, sflag, tflag, vflag;
+static int bflag, eflag, lflag, nflag, sflag, tflag, vflag;
static int rval;
static const char *filename;
@@ -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 */
}
OpenPOWER on IntegriCloud