On Wed, Dec 15, 2021 at 11:51:48AM +0000, Ricardo Mestre wrote:
> 
> [...]
> 
> the filename parameter on cook_buf is just used to show a warning, but it 
> should
> be "stdin" instead of "(stdin)" to keep the same old behaviour.

Yep, fixed.

> additionally, please add a blank line after the pledge/err lines you added to
> help grepability.

I don't know why this would help, but sure, added a blank line.

> with those changed I have no objections to the diff, check if there's anyone
> else complaining :)

6 week bump.

To recap:

 - Refactor the open/close portions of cook_args() and raw_args() into a
   single function, cat_file().

 - Push the flag-check branch in main() down into cat_file().

 - Pull the argv loop in cat_file() up into main().

Once we've done that, we can then:

 - Drop the "rpath" promise in the no-file case in main().

Any objections?

Index: cat.c
===================================================================
RCS file: /cvs/src/bin/cat/cat.c,v
retrieving revision 1.32
diff -u -p -r1.32 cat.c
--- cat.c       24 Oct 2021 21:24:21 -0000      1.32
+++ cat.c       1 Feb 2022 15:58:25 -0000
@@ -50,9 +50,8 @@
 int bflag, eflag, nflag, sflag, tflag, vflag;
 int rval;
 
-void cook_args(char *argv[]);
+void cat_file(const char *);
 void cook_buf(FILE *, const char *);
-void raw_args(char *argv[]);
 void raw_cat(int, const char *);
 
 int
@@ -92,40 +91,62 @@ main(int argc, char *argv[])
                        return 1;
                }
        }
+       argc -= optind;
        argv += optind;
 
-       if (bflag || eflag || nflag || sflag || tflag || vflag)
-               cook_args(argv);
-       else
-               raw_args(argv);
+       if (argc == 0) {
+               if (pledge("stdio", NULL) == -1)
+                       err(1, "pledge");
+
+               cat_file(NULL);
+       } else {
+               for (; *argv != NULL; argv++)
+                       cat_file(*argv);
+       }
        if (fclose(stdout))
                err(1, "stdout");
        return rval;
 }
 
 void
-cook_args(char **argv)
+cat_file(const char *path)
 {
+       const char *name;
        FILE *fp;
+       int fd;
 
-       if (*argv == NULL) {
-               cook_buf(stdin, "stdin");
-               return;
-       }
-
-       for (; *argv != NULL; argv++) {
-               if (!strcmp(*argv, "-")) {
-                       cook_buf(stdin, "stdin");
-                       clearerr(stdin);
-                       continue;
+       if (bflag || eflag || nflag || sflag || tflag || vflag) {
+               if (path == NULL || strcmp(path, "-") == 0) {
+                       name = "stdin";
+                       fp = stdin;
+               } else {
+                       name = path;
+                       if ((fp = fopen(name, "r")) == NULL) {
+                               warn("%s", name);
+                               rval = 1;
+                               return;
+                       }
                }
-               if ((fp = fopen(*argv, "r")) == NULL) {
-                       warn("%s", *argv);
-                       rval = 1;
-                       continue;
+               cook_buf(fp, name);
+               if (fp == stdin)
+                       clearerr(stdin);
+               else
+                       fclose(fp);
+       } else {
+               if (path == NULL || strcmp(path, "-") == 0) {
+                       name = "stdin";
+                       fd = STDIN_FILENO;
+               } else {
+                       name = path;
+                       if ((fd = open(name, O_RDONLY)) == -1) {
+                               warn("%s", name);
+                               rval = 1;
+                               return;
+                       }
                }
-               cook_buf(fp, *argv);
-               fclose(fp);
+               raw_cat(fd, name);
+               if (fd != STDIN_FILENO)
+                       close(fd);
        }
 }
 
@@ -191,31 +212,6 @@ cook_buf(FILE *fp, const char *filename)
        }
        if (ferror(stdout))
                err(1, "stdout");
-}
-
-void
-raw_args(char **argv)
-{
-       int fd;
-
-       if (*argv == NULL) {
-               raw_cat(fileno(stdin), "stdin");
-               return;
-       }
-
-       for (; *argv != NULL; argv++) {
-               if (!strcmp(*argv, "-")) {
-                       raw_cat(fileno(stdin), "stdin");
-                       continue;
-               }
-               if ((fd = open(*argv, O_RDONLY)) == -1) {
-                       warn("%s", *argv);
-                       rval = 1;
-                       continue;
-               }
-               raw_cat(fd, *argv);
-               close(fd);
-       }
 }
 
 void

Reply via email to