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