Annotation of researchv10dc/cmd/cat.c, revision 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.