Annotation of 40BSD/cmd/catman.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)catman.c    4.1 (Berkeley) 10/1/80";
                      2: # include      <stdio.h>
                      3: # include      <sys/types.h>
                      4: # include      <dir.h>
                      5: # include      <stat.h>
                      6: # include      <ctype.h>
                      7: 
                      8: # define       reg     register
                      9: # define       bool    char
                     10: 
                     11: # define       SYSTEM(str)     (pflag ? printf("%s\n", str) : system(str))
                     12: 
                     13: char           buf[BUFSIZ],
                     14:                pflag = 0,
                     15:                nflag = 0,
                     16:                wflag = 0;
                     17: 
                     18: main(ac, av)
                     19: int    ac;
                     20: char   *av[]; {
                     21: 
                     22:        reg char        *tsp, *msp, *csp, *man, *cat, *sp;
                     23:        reg FILE        *mdir, *inf;
                     24:        reg long        time;
                     25:        reg char        *sections;
                     26:        reg int         exstat = 0;
                     27:        reg bool        changed = 0;
                     28:        static struct dir       dir;
                     29:        static struct stat      sbuf;
                     30: 
                     31:        while (ac > 1) {
                     32:                av++;
                     33:                if (strcmp(*av, "-p") == 0)
                     34:                        pflag++;
                     35:                else if (strcmp(*av, "-n") == 0)
                     36:                        nflag++;
                     37:                else if (strcmp(*av, "-w") == 0)
                     38:                        wflag++;
                     39:                else if (*av[0] == '-')
                     40:                        goto usage;
                     41:                else
                     42:                        break;
                     43:                ac--;
                     44:        }
                     45:        if (ac == 2)
                     46:                sections = *av;
                     47:        else if (ac < 2)
                     48:                sections = "12345678";
                     49:        else {
                     50: usage:
                     51:                printf("usage: catman [ -p ] [ -n ] [ -w ] [ sections ]\n");
                     52:                exit(-1);
                     53:        }
                     54:        if (wflag)
                     55:                goto whatis;
                     56:        chdir("/usr/man");
                     57:        man = "manx/xxxxxxxxxxxxxx";
                     58:        cat = "catx/xxxxxxxxxxxxxx";
                     59:        msp = &man[5];
                     60:        csp = &cat[5];
                     61:        umask(0);
                     62:        for (sp = sections; *sp; sp++) {
                     63:                man[3] = cat[3] = *sp;
                     64:                *msp = *csp = '\0';
                     65:                if ((mdir = fopen(man, "r")) == NULL) {
                     66:                        fprintf(stderr, "fopen:");
                     67:                        perror(man);
                     68:                        exstat = 1;
                     69:                        continue;
                     70:                }
                     71:                if (stat(cat, &sbuf) < 0) {
                     72:                        sprintf(buf, "mkdir %s", cat);
                     73:                        SYSTEM(buf);
                     74:                        stat(cat, &sbuf);
                     75:                }
                     76:                if ((sbuf.st_mode & 0777) != 0777)
                     77:                        chmod(cat, 0777);
                     78:                while (fread((char *) &dir, sizeof dir, 1, mdir) > 0) {
                     79:                        if (dir.d_ino == 0 || dir.d_name[0] == '.')
                     80:                                continue;
                     81:                        /*
                     82:                         * make sure this is a man file, i.e., that it
                     83:                         * ends in .[0-9] or .[0-9][a-z]
                     84:                         */
                     85:                        tsp = rindex(dir.d_name, '.');
                     86:                        if (tsp == NULL)
                     87:                                continue;
                     88:                        if (!isdigit(*++tsp) || ((*++tsp && !isalpha(*tsp)) || *++tsp))
                     89:                                continue;
                     90: 
                     91:                        strncpy(msp, dir.d_name, DIRSIZ);
                     92:                        if ((inf = fopen(man, "r")) == NULL) {
                     93:                                perror(man);
                     94:                                exstat = 1;
                     95:                                continue;
                     96:                        }
                     97:                        if (getc(inf) == '.' && getc(inf) == 's'
                     98:                            && getc(inf) == 'o') {
                     99:                                fclose(inf);
                    100:                                continue;
                    101:                        }
                    102:                        fclose(inf);
                    103:                        strncpy(csp, dir.d_name, DIRSIZ);
                    104:                        if (stat(cat, &sbuf) >= 0) {
                    105:                                time = sbuf.st_mtime;
                    106:                                stat(man, &sbuf);
                    107:                                if (time >= sbuf.st_mtime)
                    108:                                        continue;
                    109:                                unlink(cat);
                    110:                        }
                    111:                        sprintf(buf, "nroff -man %s > %s", man, cat);
                    112:                        SYSTEM(buf);
                    113:                        changed = 1;
                    114:                }
                    115:                fclose(mdir);
                    116:        }
                    117:        if (changed && !nflag) {
                    118: whatis:
                    119:                if (pflag)
                    120:                        printf("/bin/sh /usr/lib/makewhatis\n");
                    121:                else {
                    122:                        execl("/bin/sh", "/bin/sh", "/usr/lib/makewhatis", 0);
                    123:                        perror("/bin/sh /usr/lib/makewhatis");
                    124:                        exstat = 1;
                    125:                }
                    126:        }
                    127:        exit(exstat);
                    128: }

unix.superglobalmegacorp.com

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