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:
parent
c31597fcda
commit
9b3a8ec1ad
@ -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
|
||||
|
@ -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 */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user