Hi,
Attached is a patch to add the -f flag to cat(1).
-f ensures that cat is opening a regular file in non blocking mode &
aborts otherwise.
Obtained from NetBSD src/bin/cat/cat.c r1.22 & r1.34
Sevan Janiyan
From NetBSD
cat.c r1.22, r1.34
cat.1 r1.18, r1.25
Index: bin/cat/cat.c
===================================================================
RCS file: /cvs/src/bin/cat/cat.c,v
retrieving revision 1.21
diff -u -r1.21 cat.c
--- bin/cat/cat.c 16 Jan 2015 06:39:28 -0000 1.21
+++ bin/cat/cat.c 18 Jul 2015 01:45:14 -0000
@@ -50,7 +50,7 @@
extern char *__progname;
-int bflag, eflag, nflag, sflag, tflag, vflag;
+int bflag, eflag, fflag, nflag, sflag, tflag, vflag;
int rval;
char *filename;
@@ -66,7 +66,7 @@
setlocale(LC_ALL, "");
- while ((ch = getopt(argc, argv, "benstuv")) != -1)
+ while ((ch = getopt(argc, argv, "befnstuv")) != -1)
switch (ch) {
case 'b':
bflag = nflag = 1; /* -b implies -n */
@@ -74,6 +74,9 @@
case 'e':
eflag = vflag = 1; /* -e implies -v */
break;
+ case 'f':
+ fflag = 1;
+ break;
case 'n':
nflag = 1;
break;
@@ -91,7 +94,7 @@
break;
default:
(void)fprintf(stderr,
- "usage: %s [-benstuv] [file ...]\n", __progname);
+ "usage: %s [-befnstuv] [file ...]\n", __progname);
exit(1);
/* NOTREACHED */
}
@@ -118,7 +121,7 @@
if (*argv) {
if (!strcmp(*argv, "-"))
fp = stdin;
- else if ((fp = fopen(*argv, "r")) == NULL) {
+ else if ((fp = fopen(*argv, "rf")) == NULL) {
warn("%s", *argv);
rval = 1;
++argv;
@@ -202,8 +205,26 @@
if (*argv) {
if (!strcmp(*argv, "-"))
fd = fileno(stdin);
+ else if (fflag) {
+ struct stat st;
+ fd = open(*argv, O_RDONLY|O_NONBLOCK, 0);
+ if (fd < 0)
+ goto skip;
+
+ if (fstat(fd, &st) == -1) {
+ close(fd);
+ goto skip;
+ }
+ if (!S_ISREG(st.st_mode)) {
+ close(fd);
+ warnx("%s: not a regular file", *argv);
+ goto skipnomsg;
+ }
+ }
else if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
+skip:
warn("%s", *argv);
+skipnomsg:
rval = 1;
++argv;
continue;
Index: bin/cat/cat.1
===================================================================
RCS file: /cvs/src/bin/cat/cat.1,v
retrieving revision 1.34
diff -u -r1.34 cat.1
--- bin/cat/cat.1 15 Jan 2015 19:06:31 -0000 1.34
+++ bin/cat/cat.1 18 Jul 2015 02:02:23 -0000
@@ -33,7 +33,7 @@
.\"
.\" @(#)cat.1 8.3 (Berkeley) 5/2/95
.\"
-.Dd $Mdocdate: January 15 2015 $
+.Dd $Mdocdate: July 18 2015 $
.Dt CAT 1
.Os
.Sh NAME
@@ -41,7 +41,7 @@
.Nd concatenate and print files
.Sh SYNOPSIS
.Nm cat
-.Op Fl benstuv
+.Op Fl befnstuv
.Op Ar
.Sh DESCRIPTION
The
@@ -70,6 +70,8 @@
option and also prints a dollar sign
.Pq Ql \&$
at the end of each line.
+.It Fl f
+Only attempt to display regular files.
.It Fl n
Number the output lines, starting at 1.
.It Fl s