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

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)catman.c   5.7 (Berkeley) 5/27/86";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * catman: update cat'able versions of manual pages
                     19:  *  (whatis database also)
                     20:  */
                     21: #include <stdio.h>
                     22: #include <sys/types.h>
                     23: #include <sys/stat.h>
                     24: #include <sys/file.h>
                     25: #include <sys/time.h>
                     26: #include <sys/dir.h>
                     27: #include <ctype.h>
                     28: 
                     29: char   buf[BUFSIZ];
                     30: char   pflag;
                     31: char   nflag;
                     32: char   wflag;
                     33: char   man[MAXNAMLEN+6] = "manx/";
                     34: int    exstat = 0;
                     35: char   cat[MAXNAMLEN+6] = "catx/";
                     36: char   lncat[MAXNAMLEN+9] = "../catx/";
                     37: char   *manpath = "/usr/man";
                     38: char   *sections = "12345678ln";
                     39: char   *makewhatis = "/usr/lib/makewhatis";
                     40: char   *index(), *rindex();
                     41: char   *strcpy();
                     42: char   *getenv();
                     43: 
                     44: main(ac, av)
                     45:        int ac;
                     46:        char *av[];
                     47: {
                     48:        char *mp, *nextp;
                     49: 
                     50:        if ((mp = getenv("MANPATH")) != NULL)
                     51:                manpath = mp;
                     52: 
                     53:        ac--, av++;
                     54:        while (ac > 0 && av[0][0] == '-') {
                     55:                switch (av[0][1]) {
                     56: 
                     57:                case 'p':
                     58:                        pflag++;
                     59:                        break;
                     60: 
                     61:                case 'n':
                     62:                        nflag++;
                     63:                        break;
                     64: 
                     65:                case 'w':
                     66:                        wflag++;
                     67:                        break;
                     68: 
                     69:                case 'M':
                     70:                case 'P':
                     71:                        if (ac < 1) {
                     72:                                fprintf(stderr, "%s: missing path\n",
                     73:                                    av[0]);
                     74:                                exit(1);
                     75:                        }
                     76:                        ac--, av++;
                     77:                        manpath = *av;
                     78:                        break;
                     79: 
                     80:                default:
                     81:                        goto usage;
                     82:                }
                     83:                ac--, av++;
                     84:        }
                     85:        if (ac > 1) {
                     86: usage:
                     87:                printf("usage: catman [ -p ] [ -n ] [ -w ] [ -M path ] [ sections ]\n");
                     88:                exit(-1);
                     89:        }
                     90:        if (ac == 1)
                     91:                sections = *av;
                     92:        for (mp = manpath; mp && ((nextp = index(mp, ':')), 1); mp = nextp) {
                     93:                if (nextp)
                     94:                        *nextp++ = '\0';
                     95:                doit(mp);
                     96:        }
                     97:        exit(exstat);
                     98: }
                     99: 
                    100: doit(mandir)
                    101:        char *mandir;
                    102: {
                    103:        register char *msp, *csp, *sp;
                    104:        int changed = 0;
                    105:        int status;
                    106: 
                    107:        if (wflag)
                    108:                goto whatis;
                    109:        if (chdir(mandir) < 0) {
                    110:                sprintf(buf, "catman: %s", mandir);
                    111:                perror(buf);
                    112:                /* exstat = 1; */
                    113:                return;
                    114:        }
                    115:        if (pflag)
                    116:                printf("cd %s\n", mandir);
                    117:        msp = &man[5];
                    118:        csp = &cat[5];
                    119:        (void) umask(0);
                    120:        for (sp = sections; *sp; sp++) {
                    121:                register DIR *mdir;
                    122:                register struct direct *dir;
                    123:                struct stat sbuf;
                    124: 
                    125:                man[3] = cat[3] = *sp;
                    126:                *msp = *csp = '\0';
                    127:                if ((mdir = opendir(man)) == NULL) {
                    128:                        sprintf(buf, "catman: opendir: %s", man);
                    129:                        perror(buf);
                    130:                        /* exstat = 1; */
                    131:                        continue;
                    132:                }
                    133:                if (stat(cat, &sbuf) < 0) {
                    134:                        register char *cp;
                    135: 
                    136:                        (void) strcpy(buf, cat);
                    137:                        cp = rindex(buf, '/');
                    138:                        if (cp && cp[1] == '\0')
                    139:                                *cp = '\0';
                    140:                        if (pflag)
                    141:                                printf("mkdir %s\n", buf);
                    142:                        else if (mkdir(buf, 0777) < 0) {
                    143:                                sprintf(buf, "catman: mkdir: %s", cat);
                    144:                                perror(buf);
                    145:                                exstat = 1;
                    146:                                continue;
                    147:                        }
                    148:                        (void) stat(cat, &sbuf);
                    149:                }
                    150:                if (access(cat, R_OK|W_OK|X_OK) == -1) {
                    151:                        sprintf(buf, "catman: %s", cat);
                    152:                        perror(buf);
                    153:                        exstat = 1;
                    154:                        continue;
                    155:                }
                    156:                if ((sbuf.st_mode & S_IFMT) != S_IFDIR) {
                    157:                        fprintf(stderr, "catman: %s: Not a directory\n", cat);
                    158:                        exstat = 1;
                    159:                        continue;
                    160:                }
                    161:                while ((dir = readdir(mdir)) != NULL) {
                    162:                        time_t time;
                    163:                        register char *tsp;
                    164:                        FILE *inf;
                    165:                        int  makelink;
                    166: 
                    167:                        if (dir->d_ino == 0 || dir->d_name[0] == '.')
                    168:                                continue;
                    169:                        /*
                    170:                         * Make sure this is a man file, i.e., that it
                    171:                         * ends in .[0-9] or .[0-9][a-z]
                    172:                         */
                    173:                        tsp = rindex(dir->d_name, '.');
                    174:                        if (tsp == NULL)
                    175:                                continue;
                    176:                        if (!isdigit(*++tsp) && *tsp != *sp)
                    177:                                continue;
                    178:                        if (*++tsp && !isalpha(*tsp))
                    179:                                continue;
                    180:                        if (*tsp && *++tsp)
                    181:                                continue;
                    182:                        (void) strcpy(msp, dir->d_name);
                    183:                        if ((inf = fopen(man, "r")) == NULL) {
                    184:                                sprintf(buf, "catman: %s");
                    185:                                perror(buf);
                    186:                                exstat = 1;
                    187:                                continue;
                    188:                        }
                    189:                        makelink = 0;
                    190:                        if (getc(inf) == '.' && getc(inf) == 's'
                    191:                            && getc(inf) == 'o') {
                    192:                                if (getc(inf) != ' ' ||
                    193:                                    fgets(lncat+3, sizeof(lncat)-3, inf)==NULL) {
                    194:                                        fclose(inf);
                    195:                                        continue;
                    196:                                }
                    197:                                if (lncat[strlen(lncat)-1] == '\n')
                    198:                                        lncat[strlen(lncat)-1] = '\0';
                    199:                                if (strncmp(lncat+3, "man", 3) != 0) {
                    200:                                        fclose(inf);
                    201:                                        continue;
                    202:                                }
                    203:                                bcopy("../cat", lncat, sizeof("../cat")-1);
                    204:                                makelink = 1;
                    205:                        }
                    206:                        fclose(inf);
                    207:                        (void) strcpy(csp, dir->d_name);
                    208:                        if (stat(cat, &sbuf) >= 0) {
                    209:                                time = sbuf.st_mtime;
                    210:                                (void) stat(man, &sbuf);
                    211:                                if (time >= sbuf.st_mtime)
                    212:                                        continue;
                    213:                                (void) unlink(cat);
                    214:                        }
                    215:                        if (makelink) {
                    216:                                /*
                    217:                                 * Don't unlink a directory by accident.
                    218:                                 */
                    219:                                if (stat(lncat+3, &sbuf) >= 0 &&
                    220:                                    (((sbuf.st_mode&S_IFMT)==S_IFREG) ||
                    221:                                     ((sbuf.st_mode&S_IFMT)==S_IFLNK)))
                    222:                                        (void) unlink(cat);
                    223:                                if (pflag)
                    224:                                        printf("ln -s %s %s\n", lncat, cat);
                    225:                                else
                    226:                                        if (symlink(lncat, cat) == -1) {
                    227:                                                sprintf(buf, "catman: symlink: %s", cat);
                    228:                                                perror(buf);
                    229:                                                exstat = 1;
                    230:                                                continue;
                    231:                                        }
                    232:                        }
                    233:                        else {
                    234:                                sprintf(buf, "nroff -man %s > %s", man, cat);
                    235:                                if (pflag)
                    236:                                        printf("%s\n", buf);
                    237:                                else if ((status = system(buf)) != 0) {
                    238:                                        fprintf(stderr, "catman: nroff: %s: exit status %d: Owooooo!\n", cat, status);
                    239:                                        exstat = 1;
                    240:                                        continue;
                    241:                                }
                    242:                        }
                    243:                        changed = 1;
                    244:                }
                    245:                closedir(mdir);
                    246:        }
                    247:        if (changed && !nflag) {
                    248: whatis:
                    249:                sprintf(buf, "%s %s", makewhatis, mandir);
                    250:                if (pflag)
                    251:                        printf("%s\n", buf);
                    252:                else if ((status = system(buf)) != 0) {
                    253:                        fprintf(stderr, "catman: %s: exit status %d\n",
                    254:                            buf, status);
                    255:                        exstat = 1;
                    256:                }
                    257:        }
                    258:        return;
                    259: }

unix.superglobalmegacorp.com

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