document distributed with 4.2BSD
[unix-history] / usr / src / bin / cat / cat.c
index 91eca19..0b9e5ef 100644 (file)
@@ -1,6 +1,12 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cat.c       4.8 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)cat.c      5.2 (Berkeley) %G%";
+#endif not lint
 
 /*
  * Concatenate files.
 
 /*
  * Concatenate files.
@@ -10,7 +16,7 @@ static        char *sccsid = "@(#)cat.c       4.8 (Berkeley) %G%";
 #include <sys/types.h>
 #include <sys/stat.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
 
-/* #define OPTSIZE BUFSIZ      /* define this only if not 4.2 BSD */
+/* #define OPTSIZE BUFSIZ      /* define this only if not 4.2 BSD or beyond */
 
 int    bflg, eflg, nflg, sflg, tflg, uflg, vflg;
 int    spaced, col, lno, inline, ibsize, obsize;
 
 int    bflg, eflg, nflg, sflg, tflg, uflg, vflg;
 int    spaced, col, lno, inline, ibsize, obsize;
@@ -64,7 +70,9 @@ char **argv;
                        dev = statb.st_dev;
                        ino = statb.st_ino;
                }
                        dev = statb.st_dev;
                        ino = statb.st_ino;
                }
+#ifndef        OPTSIZE
                obsize = statb.st_blksize;
                obsize = statb.st_blksize;
+#endif
        }
        else
                obsize = 0;
        }
        else
                obsize = 0;
@@ -91,7 +99,9 @@ char **argv;
                                retval = 1;
                                continue;
                        }
                                retval = 1;
                                continue;
                        }
+#ifndef        OPTSIZE
                        ibsize = statb.st_blksize;
                        ibsize = statb.st_blksize;
+#endif
                }
                else
                        ibsize = 0;
                }
                else
                        ibsize = 0;
@@ -101,9 +111,11 @@ char **argv;
                        while ((c = getc(fi)) != EOF)
                                putchar(c);
                } else
                        while ((c = getc(fi)) != EOF)
                                putchar(c);
                } else
-                       fastcat(fileno(fi));    /* no flags specified */
+                       retval |= fastcat(fileno(fi));  /* no flags specified */
                if (fi!=stdin)
                        fclose(fi);
                if (fi!=stdin)
                        fclose(fi);
+               else
+                       clearerr(fi);           /* reset sticky eof */
                if (ferror(stdout)) {
                        fprintf(stderr, "cat: output write error\n");
                        retval = 1;
                if (ferror(stdout)) {
                        fprintf(stderr, "cat: output write error\n");
                        retval = 1;
@@ -169,18 +181,20 @@ register int fd;
        char            *malloc();
 
 #ifndef        OPTSIZE
        char            *malloc();
 
 #ifndef        OPTSIZE
-       if (ibsize == 0)
-               buffsize = BUFSIZ;      /* handle reads from a pipe */
-       else if (obsize == 0)
+       if (obsize)
+               buffsize = obsize;      /* common case, use output blksize */
+       else if (ibsize)
                buffsize = ibsize;
        else
                buffsize = ibsize;
        else
-               buffsize = obsize;      /* common case, use output blksize */
+               buffsize = BUFSIZ;
 #else
        buffsize = OPTSIZE;
 #endif
 
 #else
        buffsize = OPTSIZE;
 #endif
 
-       if ((buff = malloc(buffsize)) == NULL)
+       if ((buff = malloc(buffsize)) == NULL) {
                perror("cat: no memory");
                perror("cat: no memory");
+               return (1);
+       }
 
        /*
         * Note that on some systems (V7), very large writes to a pipe
 
        /*
         * Note that on some systems (V7), very large writes to a pipe
@@ -191,13 +205,18 @@ register int fd;
                offset = 0;
                do {
                        nwritten = write(fileno(stdout), &buff[offset], n);
                offset = 0;
                do {
                        nwritten = write(fileno(stdout), &buff[offset], n);
-                       if (nwritten <= 0)
+                       if (nwritten <= 0) {
                                perror("cat: write error");
                                perror("cat: write error");
+                               exit(2);
+                       }
                        offset += nwritten;
                } while ((n -= nwritten) > 0);
        }
                        offset += nwritten;
                } while ((n -= nwritten) > 0);
        }
-       if (n < 0)
-               perror("cat: read error");
 
        free(buff);
 
        free(buff);
+       if (n < 0) {
+               perror("cat: read error");
+               return (1);
+       }
+       return (0);
 }
 }