Annotation of researchv10no/cmd/cat.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Concatenate files.
                      3:  */
                      4: 
                      5: #include <stdio.h>
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: #define BLOCK 4096
                      9: 
                     10: char   buf[BLOCK];
                     11: 
                     12: main (argc, argv)
                     13:        int argc;
                     14:        char **argv;
                     15: {
                     16:        register int fflg = 0;
                     17:        register int fi, fo;
                     18:        register int n;
                     19:        register int dev, ino = -1;
                     20:        struct stat statb;
                     21:        int retcode=0;
                     22: 
                     23:        if (fstat (1, &statb) < 0) {
                     24:                perror ("cat stdout");
                     25:                return 1;
                     26:        }
                     27: 
                     28:        statb.st_mode &= S_IFMT;
                     29:        /*
                     30:         * st_nlink == 0 for pipes and other magic files
                     31:         */
                     32:        if (statb.st_nlink!=0 && statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) {
                     33:                dev = statb.st_dev;
                     34:                ino = statb.st_ino;
                     35:        }
                     36:        if (argc < 2) {
                     37:                argc = 2;
                     38:                fflg++;
                     39:        }
                     40:        while (--argc > 0) {
                     41:                if (fflg || **++argv == '-' && (*argv)[1] == '\0')
                     42:                        fi = 0;
                     43:                else {
                     44:                        if ((fi = open (*argv, 0)) < 0) {
                     45:                                fprintf(stderr, "cat: ");
                     46:                                perror (*argv);
                     47:                                retcode = 1;
                     48:                                continue;
                     49:                        }
                     50:                }
                     51:                if (fstat (fi, &statb) >= 0
                     52:                    && statb.st_dev == dev
                     53:                    && statb.st_ino == ino) {
                     54:                        fprintf (stderr, "cat: input %s is output\n",
                     55:                           fflg? "-": *argv);
                     56:                        close (fi);
                     57:                        retcode = 1;
                     58:                        continue;
                     59:                }
                     60:                while ((n = read (fi, buf, sizeof buf)) > 0)
                     61:                        if (write (1, buf, n) != n){
                     62:                                perror ("cat output");
                     63:                                return 1;
                     64:                        }
                     65:                if (fi != 0)
                     66:                        close (fi);
                     67:        }
                     68:        return retcode;
                     69: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.