mv more tahoe stuff to machdep; clk_enable was dup;
[unix-history] / usr / src / old / catman / catman.c
index 65452a0..b50b2c7 100644 (file)
@@ -1,6 +1,18 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)catman.c    4.5 (Berkeley) %G%";
-#endif
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif not lint
+
+#ifndef lint
+static char sccsid[] = "@(#)catman.c   5.7 (Berkeley) %G%";
+#endif not lint
 
 /*
  * catman: update cat'able versions of manual pages
 
 /*
  * catman: update cat'able versions of manual pages
@@ -9,58 +21,102 @@ static char *sccsid = "@(#)catman.c 4.5 (Berkeley) %G%";
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/file.h>
 #include <sys/time.h>
 #include <sys/dir.h>
 #include <ctype.h>
 
 #include <sys/time.h>
 #include <sys/dir.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   buf[BUFSIZ];
 char   pflag;
 char   nflag;
 char   wflag;
 char   man[MAXNAMLEN+6] = "manx/";
+int    exstat = 0;
 char   cat[MAXNAMLEN+6] = "catx/";
 char   cat[MAXNAMLEN+6] = "catx/";
-char   *rindex();
+char   lncat[MAXNAMLEN+9] = "../catx/";
+char   *manpath = "/usr/man";
+char   *sections = "12345678ln";
+char   *makewhatis = "/usr/lib/makewhatis";
+char   *index(), *rindex();
+char   *strcpy();
+char   *getenv();
 
 main(ac, av)
        int ac;
        char *av[];
 {
 
 main(ac, av)
        int ac;
        char *av[];
 {
-       register char *msp, *csp, *sp;
-       register char *sections;
-       register int exstat = 0;
-       register char changed = 0;
+       char *mp, *nextp;
+
+       if ((mp = getenv("MANPATH")) != NULL)
+               manpath = mp;
+
+       ac--, av++;
+       while (ac > 0 && av[0][0] == '-') {
+               switch (av[0][1]) {
 
 
-       while (ac > 1) {
-               av++;
-               if (strcmp(*av, "-p") == 0)
+               case 'p':
                        pflag++;
                        pflag++;
-               else if (strcmp(*av, "-n") == 0)
+                       break;
+
+               case 'n':
                        nflag++;
                        nflag++;
-               else if (strcmp(*av, "-w") == 0)
+                       break;
+
+               case 'w':
                        wflag++;
                        wflag++;
-               else if (*av[0] == '-')
-                       goto usage;
-               else
                        break;
                        break;
-               ac--;
+
+               case 'M':
+               case 'P':
+                       if (ac < 1) {
+                               fprintf(stderr, "%s: missing path\n",
+                                   av[0]);
+                               exit(1);
+                       }
+                       ac--, av++;
+                       manpath = *av;
+                       break;
+
+               default:
+                       goto usage;
+               }
+               ac--, av++;
        }
        }
-       if (ac == 2)
-               sections = *av;
-       else if (ac < 2)
-               sections = "12345678";
-       else {
+       if (ac > 1) {
 usage:
 usage:
-               printf("usage: catman [ -p ] [ -n ] [ -w ] [ sections ]\n");
+               printf("usage: catman [ -p ] [ -n ] [ -w ] [ -M path ] [ sections ]\n");
                exit(-1);
        }
                exit(-1);
        }
+       if (ac == 1)
+               sections = *av;
+       for (mp = manpath; mp && ((nextp = index(mp, ':')), 1); mp = nextp) {
+               if (nextp)
+                       *nextp++ = '\0';
+               doit(mp);
+       }
+       exit(exstat);
+}
+
+doit(mandir)
+       char *mandir;
+{
+       register char *msp, *csp, *sp;
+       int changed = 0;
+       int status;
+
        if (wflag)
                goto whatis;
        if (wflag)
                goto whatis;
-       chdir("/usr/man");
+       if (chdir(mandir) < 0) {
+               sprintf(buf, "catman: %s", mandir);
+               perror(buf);
+               /* exstat = 1; */
+               return;
+       }
+       if (pflag)
+               printf("cd %s\n", mandir);
        msp = &man[5];
        csp = &cat[5];
        msp = &man[5];
        csp = &cat[5];
-       umask(0);
+       (void) umask(0);
        for (sp = sections; *sp; sp++) {
                register DIR *mdir;
                register struct direct *dir;
        for (sp = sections; *sp; sp++) {
                register DIR *mdir;
                register struct direct *dir;
@@ -69,15 +125,15 @@ usage:
                man[3] = cat[3] = *sp;
                *msp = *csp = '\0';
                if ((mdir = opendir(man)) == NULL) {
                man[3] = cat[3] = *sp;
                *msp = *csp = '\0';
                if ((mdir = opendir(man)) == NULL) {
-                       fprintf(stderr, "opendir:");
-                       perror(man);
-                       exstat = 1;
+                       sprintf(buf, "catman: opendir: %s", man);
+                       perror(buf);
+                       /* exstat = 1; */
                        continue;
                }
                if (stat(cat, &sbuf) < 0) {
                        continue;
                }
                if (stat(cat, &sbuf) < 0) {
-                       char buf[MAXNAMLEN + 6], *cp, *rindex();
+                       register char *cp;
 
 
-                       strcpy(buf, cat);
+                       (void) strcpy(buf, cat);
                        cp = rindex(buf, '/');
                        if (cp && cp[1] == '\0')
                                *cp = '\0';
                        cp = rindex(buf, '/');
                        if (cp && cp[1] == '\0')
                                *cp = '\0';
@@ -86,16 +142,27 @@ usage:
                        else if (mkdir(buf, 0777) < 0) {
                                sprintf(buf, "catman: mkdir: %s", cat);
                                perror(buf);
                        else if (mkdir(buf, 0777) < 0) {
                                sprintf(buf, "catman: mkdir: %s", cat);
                                perror(buf);
+                               exstat = 1;
                                continue;
                        }
                                continue;
                        }
-                       stat(cat, &sbuf);
+                       (void) stat(cat, &sbuf);
+               }
+               if (access(cat, R_OK|W_OK|X_OK) == -1) {
+                       sprintf(buf, "catman: %s", cat);
+                       perror(buf);
+                       exstat = 1;
+                       continue;
+               }
+               if ((sbuf.st_mode & S_IFMT) != S_IFDIR) {
+                       fprintf(stderr, "catman: %s: Not a directory\n", cat);
+                       exstat = 1;
+                       continue;
                }
                }
-               if ((sbuf.st_mode & 0777) != 0777)
-                       chmod(cat, 0777);
                while ((dir = readdir(mdir)) != NULL) {
                        time_t time;
                while ((dir = readdir(mdir)) != NULL) {
                        time_t time;
-                       char *tsp;
+                       register char *tsp;
                        FILE *inf;
                        FILE *inf;
+                       int  makelink;
 
                        if (dir->d_ino == 0 || dir->d_name[0] == '.')
                                continue;
 
                        if (dir->d_ino == 0 || dir->d_name[0] == '.')
                                continue;
@@ -106,47 +173,87 @@ usage:
                        tsp = rindex(dir->d_name, '.');
                        if (tsp == NULL)
                                continue;
                        tsp = rindex(dir->d_name, '.');
                        if (tsp == NULL)
                                continue;
-                       if (!isdigit(*++tsp))
+                       if (!isdigit(*++tsp) && *tsp != *sp)
                                continue;
                        if (*++tsp && !isalpha(*tsp))
                                continue;
                        if (*tsp && *++tsp)
                                continue;
                                continue;
                        if (*++tsp && !isalpha(*tsp))
                                continue;
                        if (*tsp && *++tsp)
                                continue;
-                       strcpy(msp, dir->d_name);
+                       (void) strcpy(msp, dir->d_name);
                        if ((inf = fopen(man, "r")) == NULL) {
                        if ((inf = fopen(man, "r")) == NULL) {
-                               perror(man);
+                               sprintf(buf, "catman: %s");
+                               perror(buf);
                                exstat = 1;
                                continue;
                        }
                                exstat = 1;
                                continue;
                        }
+                       makelink = 0;
                        if (getc(inf) == '.' && getc(inf) == 's'
                            && getc(inf) == 'o') {
                        if (getc(inf) == '.' && getc(inf) == 's'
                            && getc(inf) == 'o') {
-                               fclose(inf);
-                               continue;
+                               if (getc(inf) != ' ' ||
+                                   fgets(lncat+3, sizeof(lncat)-3, inf)==NULL) {
+                                       fclose(inf);
+                                       continue;
+                               }
+                               if (lncat[strlen(lncat)-1] == '\n')
+                                       lncat[strlen(lncat)-1] = '\0';
+                               if (strncmp(lncat+3, "man", 3) != 0) {
+                                       fclose(inf);
+                                       continue;
+                               }
+                               bcopy("../cat", lncat, sizeof("../cat")-1);
+                               makelink = 1;
                        }
                        fclose(inf);
                        }
                        fclose(inf);
-                       strcpy(csp, dir->d_name);
+                       (void) strcpy(csp, dir->d_name);
                        if (stat(cat, &sbuf) >= 0) {
                                time = sbuf.st_mtime;
                        if (stat(cat, &sbuf) >= 0) {
                                time = sbuf.st_mtime;
-                               stat(man, &sbuf);
+                               (void) stat(man, &sbuf);
                                if (time >= sbuf.st_mtime)
                                        continue;
                                if (time >= sbuf.st_mtime)
                                        continue;
-                               unlink(cat);
+                               (void) unlink(cat);
+                       }
+                       if (makelink) {
+                               /*
+                                * Don't unlink a directory by accident.
+                                */
+                               if (stat(lncat+3, &sbuf) >= 0 &&
+                                   (((sbuf.st_mode&S_IFMT)==S_IFREG) ||
+                                    ((sbuf.st_mode&S_IFMT)==S_IFLNK)))
+                                       (void) unlink(cat);
+                               if (pflag)
+                                       printf("ln -s %s %s\n", lncat, cat);
+                               else
+                                       if (symlink(lncat, cat) == -1) {
+                                               sprintf(buf, "catman: symlink: %s", cat);
+                                               perror(buf);
+                                               exstat = 1;
+                                               continue;
+                                       }
+                       }
+                       else {
+                               sprintf(buf, "nroff -man %s > %s", man, cat);
+                               if (pflag)
+                                       printf("%s\n", buf);
+                               else if ((status = system(buf)) != 0) {
+                                       fprintf(stderr, "catman: nroff: %s: exit status %d: Owooooo!\n", cat, status);
+                                       exstat = 1;
+                                       continue;
+                               }
                        }
                        }
-                       sprintf(buf, "nroff -man %s > %s", man, cat);
-                       SYSTEM(buf);
                        changed = 1;
                }
                closedir(mdir);
        }
        if (changed && !nflag) {
 whatis:
                        changed = 1;
                }
                closedir(mdir);
        }
        if (changed && !nflag) {
 whatis:
+               sprintf(buf, "%s %s", makewhatis, mandir);
                if (pflag)
                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");
+                       printf("%s\n", buf);
+               else if ((status = system(buf)) != 0) {
+                       fprintf(stderr, "catman: %s: exit status %d\n",
+                           buf, status);
                        exstat = 1;
                }
        }
                        exstat = 1;
                }
        }
-       exit(exstat);
+       return;
 }
 }