]> git.cameronkatri.com Git - mandoc.git/commitdiff
Make catman and man.cgi understand the index type-field.
authorKristaps Dzonsons <kristaps@bsd.lv>
Sun, 4 Dec 2011 22:52:50 +0000 (22:52 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Sun, 4 Dec 2011 22:52:50 +0000 (22:52 +0000)
Also make catman's man.conf be generated as catman.conf to avoid clobbering
a real man.conf file.
Finally, add a placeholder catman() function to man.cgi for preformatted
manuals in the cache.

catman.8
catman.c
cgi.c
man.cgi.7

index b6bf4fba107fbf8d0c92d5e0ad91cbfc06a0186a..4b6b5853566554c2e17782db6faf2e17f323f25a 100644 (file)
--- a/catman.8
+++ b/catman.8
@@ -1,4 +1,4 @@
-.\"    $Id: catman.8,v 1.1 2011/11/26 19:54:13 kristaps Exp $
+.\"    $Id: catman.8,v 1.2 2011/12/04 22:52:50 kristaps Exp $
 .\"
 .\" Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: November 26 2011 $
+.Dd $Mdocdate: December 4 2011 $
 .Dt CATMAN 8
 .Os
 .Sh NAME
@@ -29,7 +29,8 @@
 .Sh DESCRIPTION
 The
 .Nm
-utility updates cached manpages for a jailed man.cgi.
+utility updates cached manpages for a jailed
+.Xr man.cgi 7 .
 Its arguments are as follows:
 .Bl -tag -width Ds
 .It Fl f
@@ -73,6 +74,7 @@ is specified, all files are updated.
 .Ex -std
 .Sh SEE ALSO
 .Xr mandoc 1 ,
+.Xr man.cgi 7 ,
 .Xr mandocdb 8
 .Sh AUTHORS
 The
index f3e214e6deb67cfed24e8197024a9c3676a355fb..7118e1baed47c7012c998c1c98a48385c6ff53b1 100644 (file)
--- a/catman.c
+++ b/catman.c
@@ -1,4 +1,4 @@
-/*     $Id: catman.c,v 1.2 2011/11/27 11:46:44 kristaps Exp $ */
+/*     $Id: catman.c,v 1.3 2011/12/04 22:52:50 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -265,12 +265,12 @@ jobstart(const char *dst, const char *src, pid_t *pid)
 static int
 indexhtml(char *dst)
 {
-       DB              *db;
+       DB              *idx;
        DBT              key, val;
        size_t           sz;
        int              c, rc;
        unsigned int     fl;
-       const char      *f;
+       const char      *f, *cp;
        char            *d;
        char             fname[MAXPATHLEN];
        pid_t            pid;
@@ -281,25 +281,32 @@ indexhtml(char *dst)
        xstrlcpy(fname, dst, MAXPATHLEN);
        xstrlcat(fname, "/mandoc.index", MAXPATHLEN);
 
-       db = dbopen(fname, O_RDONLY, 0, DB_RECNO, NULL);
-       if (NULL == db) {
+       idx = dbopen(fname, O_RDONLY, 0, DB_RECNO, NULL);
+       if (NULL == idx) {
                perror(fname);
                return(-1);
        }
 
        fl = R_FIRST;
-       while (0 == (c = (*db->seq)(db, &key, &val, fl))) {
+       while (0 == (c = (*idx->seq)(idx, &key, &val, fl))) {
                fl = R_NEXT;
-               f = (const char *)val.data;
+               cp = (const char *)val.data;
+               if (0 == val.size)
+                       continue;
+               if (NULL == (f = memchr(cp, '\0', val.size)))
+                       break;
+               if (++f - cp >= (int)val.size)
+                       break;
+               if (NULL == memchr(f, '\0', val.size - (f - cp)))
+                       break;
 
                dst[(int)sz] = '\0';
 
                xstrlcat(dst, "/", MAXPATHLEN);
                xstrlcat(dst, f, MAXPATHLEN);
-               /*xstrlcat(dst, ".html", MAXPATHLEN);*/
 
                if (-1 == (rc = isnewer(dst, f))) {
-                       fprintf(stderr, "%s: Manpage missing\n", f);
+                       fprintf(stderr, "%s: File missing\n", f);
                        break;
                } else if (0 == rc)
                        continue;
@@ -317,19 +324,24 @@ indexhtml(char *dst)
 
                if ( ! filecpy(dst, f))
                        break;
-
-               /*if ( ! jobstart(dst, f, &pid))
-                       break;*/
+#if 0
+               if ( ! jobstart(dst, f, &pid))
+                       break;
+#endif
                if (verbose)
                        printf("%s\n", dst);
        }
 
-       (*db->close)(db);
+       (*idx->close)(idx);
 
        if (c < 0)
                perror(fname);
-       /*if ( ! jobwait(pid))
-               c = -1;*/
+       else if (0 == c) 
+               fprintf(stderr, "%s: Corrupt index\n", fname);
+#if 0
+       if ( ! jobwait(pid))
+               c = -1;
+#endif
 
        return(1 == c ? 1 : -1);
 }
@@ -433,7 +445,7 @@ manup(const struct manpaths *dirs, const char *dir)
                return(0);
        }
 
-       xstrlcat(dst, "/man.conf", MAXPATHLEN);
+       xstrlcat(dst, "/catman.conf", MAXPATHLEN);
 
        if (verbose)
                printf("%s\n", dst);
diff --git a/cgi.c b/cgi.c
index a3ec20e944f29c20de46910c08ee6bdc2f722be6..1d88c434207ee572ecb92d144ebc80f255abacc1 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-/*     $Id: cgi.c,v 1.8 2011/11/27 11:46:44 kristaps Exp $ */
+/*     $Id: cgi.c,v 1.9 2011/12/04 22:52:50 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -66,6 +66,7 @@ struct        req {
 };
 
 static int              atou(const char *, unsigned *);
+static void             catman(const char *);
 static void             format(const char *);
 static void             html_print(const char *);
 static int              kval_decode(char *);
@@ -81,6 +82,7 @@ static        void             resp_bad(void);
 static void             resp_baddb(void);
 static void             resp_badexpr(const struct req *);
 static void             resp_badmanual(void);
+static void             resp_badpage(void);
 static void             resp_begin_html(int, const char *);
 static void             resp_begin_http(int, const char *);
 static void             resp_end_html(void);
@@ -320,7 +322,7 @@ resp_searchform(const struct req *req)
        puts("<!-- Begin search form. //-->");
        printf("<FORM ACTION=\"");
        html_print(progname);
-       printf("/search\" METHOD=\"get\">\n");
+       printf("/search.html\" METHOD=\"get\">\n");
        puts(" <FIELDSET>"                                      "\n"
             "  <INPUT TYPE=\"submit\" VALUE=\"Search:\">");
        printf("  Terms: <INPUT TYPE=\"text\" "
@@ -347,6 +349,15 @@ resp_index(const struct req *req)
        resp_end_html();
 }
 
+static void
+resp_badpage(void)
+{
+
+       resp_begin_html(404, "Not Found");
+       puts("<P>Page not found.</P>");
+       resp_end_html();
+}
+
 static void
 resp_badmanual(void)
 {
@@ -434,6 +445,29 @@ pg_index(const struct manpaths *ps, const struct req *req, char *path)
        resp_index(req);
 }
 
+static void
+catman(const char *file)
+{
+       int              fd;
+       char             buf[BUFSIZ];
+       ssize_t          ssz;
+
+       if (-1 == (fd = open(file, O_RDONLY, 0))) {
+               resp_baddb();
+               return;
+       }
+
+       resp_begin_http(200, NULL);
+
+       while ((ssz = read(fd, buf, BUFSIZ)) > 0)
+               write(STDOUT_FILENO, buf, (size_t)ssz);
+
+       if (ssz < 0)
+               perror(file);
+
+       close(fd);
+}
+
 static void
 format(const char *file)
 {
@@ -479,9 +513,10 @@ pg_show(const struct manpaths *ps, const struct req *req, char *path)
 {
        char            *sub;
        char             file[MAXPATHLEN];
+       const char      *fn, *cp;
        int              rc;
        unsigned int     vol, rec;
-       DB              *db;
+       DB              *idx;
        DBT              key, val;
 
        if (NULL == path) {
@@ -506,8 +541,8 @@ pg_show(const struct manpaths *ps, const struct req *req, char *path)
 
        /* Open the index recno(3) database. */
 
-       db = dbopen(file, O_RDONLY, 0, DB_RECNO, NULL);
-       if (NULL == db) {
+       idx = dbopen(file, O_RDONLY, 0, DB_RECNO, NULL);
+       if (NULL == idx) {
                resp_baddb();
                return;
        }
@@ -515,21 +550,30 @@ pg_show(const struct manpaths *ps, const struct req *req, char *path)
        key.data = &rec;
        key.size = 4;
 
-       if (0 != (rc = (*db->get)(db, &key, &val, 0))) {
+       if (0 != (rc = (*idx->get)(idx, &key, &val, 0))) {
                rc < 0 ? resp_baddb() : resp_badmanual();
-               (*db->close)(db);
-               return;
+               goto out;
        } 
 
-       /* Extra filename: the first nil-terminated entry. */
+       cp = (char *)val.data;
 
-       strlcpy(file, ps->paths[vol], MAXPATHLEN);
-       strlcat(file, "/", MAXPATHLEN);
-       strlcat(file, (char *)val.data, MAXPATHLEN);
-
-       (*db->close)(db);
-
-       format(file);
+       if (NULL == (fn = memchr(cp, '\0', val.size)))
+               resp_baddb();
+       else if (++fn - cp >= (int)val.size)
+               resp_baddb();
+       else if (NULL == memchr(fn, '\0', val.size - (fn - cp)))
+               resp_baddb();
+       else {
+               strlcpy(file, ps->paths[vol], MAXPATHLEN);
+               strlcat(file, "/", MAXPATHLEN);
+               strlcat(file, fn, MAXPATHLEN);
+               if (0 == strcmp(cp, "cat"))
+                       catman(file);
+               else
+                       format(file);
+       }
+out:
+       (*idx->close)(idx);
 }
 
 static void
@@ -670,7 +714,7 @@ main(void)
        /* Initialise MANPATH. */
 
        memset(&paths, 0, sizeof(struct manpaths));
-       manpath_manconf("etc/man.conf", &paths);
+       manpath_manconf("etc/catman.conf", &paths);
 
        /* Route pages. */
 
@@ -685,6 +729,7 @@ main(void)
                pg_show(&paths, &req, subpath);
                break;
        default:
+               resp_badpage();
                break;
        }
 
index 6115bde5b776c7fc2c5917c21519c7ebace06d4e..f5b640615adc7d945af64d859fba048a1c78c5b8 100644 (file)
--- a/man.cgi.7
+++ b/man.cgi.7
@@ -1,4 +1,4 @@
-.Dd $Mdocdate: November 27 2011 $
+.Dd $Mdocdate: December 4 2011 $
 .Dt MAN.CGI 7
 .Os
 .Sh NAME
@@ -13,7 +13,7 @@ script queries and displays manual pages.
 It interfaces with
 .Xr mandocdb 8
 databases for query and with
-.Xr mandoc 1
+.Xr mandoc 3
 for display.
 It operates over a cache of manuals generated by
 .Xr catman 8 .
@@ -40,13 +40,12 @@ cache directory.
 .El
 .Sh FILES
 The configuration file
-.Pa etc/man.conf
+.Pa etc/catman.conf
 must exist within the cache directory.
 This is built by
 .Xr catman 8 .
 .Sh SEE ALSO
-.Xr apropos 1 ,
-.Xr mandoc 1 ,
+.Xr mandoc 3 ,
 .Xr catman 8 ,
 .Xr mandocdb 8
 .Sh AUTHORS