From 9b3a8ec1ad946449d27074abacc634cc996c586d Mon Sep 17 00:00:00 2001 From: brooks Date: Tue, 29 Jan 2013 18:19:40 +0000 Subject: 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) --- bin/cat/cat.1 | 17 ++++++++++++++--- bin/cat/cat.c | 19 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) (limited to 'bin/cat') 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 #include -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 */ } -- cgit v1.1