Ultrix-3.1/src/cmd/catman.c

Compare this file to the similar file:
Show the results in this format:


/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

#ifndef lint
static char Sccsid[] = "@(#)catman.c 3.0 4/21/86";
#endif

/* static char *sccsid = "@(#)catman.c     4.5 (Berkeley) 7/1/83";*/

/*
 * catman: update cat'able versions of manual pages
 *  (whatis database also)
 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <ndir.h>
#include <ctype.h>

#define SYSTEM(str)     (pflag ? printf("%s\n", str) : system(str))

char    buf[BUFSIZ];
char    pflag;
char    nflag;
char    wflag;
char    man[MAXNAMLEN+6] = "manx/";
char    cat[MAXNAMLEN+6] = "catx/";
char    *rindex();

main(ac, av)
        int ac;
        char *av[];
{
        register char *msp, *csp, *sp;
        register char *sections;
        register int exstat = 0;
        register char changed = 0;

        while (ac > 1) {
                av++;
                if (strcmp(*av, "-p") == 0)
                        pflag++;
                else if (strcmp(*av, "-n") == 0)
                        nflag++;
                else if (strcmp(*av, "-w") == 0)
                        wflag++;
                else if (*av[0] == '-')
                        goto usage;
                else
                        break;
                ac--;
        }
        if (ac == 2)
                sections = *av;
        else if (ac < 2)
                sections = "12345678";
        else {
usage:
                printf("usage: catman [ -p ] [ -n ] [ -w ] [ sections ]\n");
                exit(-1);
        }
        if (wflag)
                goto whatis;
        chdir("/usr/man");
        msp = &man[5];
        csp = &cat[5];
        umask(0);
        for (sp = sections; *sp; sp++) {
                register DIR *mdir;
                register struct direct *dir;
                struct stat sbuf;

                man[3] = cat[3] = *sp;
                *msp = *csp = '\0';
                if ((mdir = opendir(man)) == NULL) {
                        fprintf(stderr, "opendir:");
                        perror(man);
                        exstat = 1;
                        continue;
                }
                if (stat(cat, &sbuf) < 0) {
                        char buf[MAXNAMLEN + 6], *cp, *rindex();

                        strcpy(buf, cat);
                        cp = rindex(buf, '/');
                        if (cp && cp[1] == '\0')
                                *cp = '\0';
                        if (pflag)
                                printf("mkdir %s\n", buf);
                        else if (mkdir(buf, 0777) < 0) {
                                sprintf(buf, "catman: mkdir: %s", cat);
                                perror(buf);
                                continue;
                        }
                        stat(cat, &sbuf);
                }
                if ((sbuf.st_mode & 0777) != 0777)
                        chmod(cat, 0777);
                while ((dir = readdir(mdir)) != NULL) {
                        time_t time;
                        char *tsp;
                        FILE *inf;

                        if (dir->d_ino == 0 || dir->d_name[0] == '.')
                                continue;
                        /*
                         * Make sure this is a man file, i.e., that it
                         * ends in .[0-9] or .[0-9][a-z]
                         */
                        tsp = rindex(dir->d_name, '.');
                        if (tsp == NULL)
                                continue;
                        if (!isdigit(*++tsp))
                                continue;
                        if (*++tsp && !isalpha(*tsp))
                                continue;
                        if (*tsp && *++tsp)
                                continue;
                        strcpy(msp, dir->d_name);
                        if ((inf = fopen(man, "r")) == NULL) {
                                perror(man);
                                exstat = 1;
                                continue;
                        }
                        if (getc(inf) == '.' && getc(inf) == 's'
                            && getc(inf) == 'o') {
                                fclose(inf);
                                continue;
                        }
                        fclose(inf);
                        strcpy(csp, dir->d_name);
                        if (stat(cat, &sbuf) >= 0) {
                                time = sbuf.st_mtime;
                                stat(man, &sbuf);
                                if (time >= sbuf.st_mtime)
                                        continue;
                                unlink(cat);
                        }
                        sprintf(buf, "nroff -man %s > %s", man, cat);
                        SYSTEM(buf);
                        changed = 1;
                }
                closedir(mdir);
        }
        if (changed && !nflag) {
whatis:
                if (pflag)
                        printf("/bin/sh /usr/lib/makewhatis\n");
                else {
                        execl("/bin/sh", "/bin/sh", "/usr/lib/makewhatis", 0);
                        perror("/bin/sh /usr/lib/makewhatis");
                        exstat = 1;
                }
        }
        exit(exstat);
}