Annotation of 42BSD/etc/catman.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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