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

Reply via email to