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)
This commit is contained in:
Brooks Davis 2013-01-29 18:19:40 +00:00
parent 2d0d4f6b5e
commit aece80a2e8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=246083
2 changed files with 30 additions and 6 deletions

View File

@ -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

View File

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