=================================================================== RCS file: /cvs/mandoc/catman.c,v retrieving revision 1.4 retrieving revision 1.9 diff -u -p -r1.4 -r1.9 --- mandoc/catman.c 2011/12/08 00:20:52 1.4 +++ mandoc/catman.c 2011/12/25 17:49:52 1.9 @@ -1,4 +1,4 @@ -/* $Id: catman.c,v 1.4 2011/12/08 00:20:52 kristaps Exp $ */ +/* $Id: catman.c,v 1.9 2011/12/25 17:49:52 kristaps Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * @@ -38,6 +38,7 @@ #endif #include "manpath.h" +#include "mandocdb.h" #define xstrlcpy(_dst, _src, _sz) \ do if (strlcpy((_dst), (_src), (_sz)) >= (_sz)) { \ @@ -51,11 +52,11 @@ exit(EXIT_FAILURE); \ } while (/* CONSTCOND */0) -static int indexhtml(char *, char *); +static int indexhtml(char *, size_t, char *, size_t); static int manup(const struct manpaths *, char *); static int mkpath(char *, mode_t, mode_t); -static int treecpy(char *, char *, char *); -static int update(char *, char *, char *); +static int treecpy(char *, char *); +static int update(char *, char *); static void usage(void); static const char *progname; @@ -66,7 +67,7 @@ int main(int argc, char *argv[]) { int ch; - char *aux, *base; + char *aux, *base, *conf_file; struct manpaths dirs; char buf[MAXPATHLEN]; extern char *optarg; @@ -81,8 +82,11 @@ main(int argc, char *argv[]) aux = base = NULL; xstrlcpy(buf, "/var/www/cache/man.cgi", MAXPATHLEN); - while (-1 != (ch = getopt(argc, argv, "fm:M:o:v"))) + while (-1 != (ch = getopt(argc, argv, "C:fm:M:o:v"))) switch (ch) { + case ('C'): + conf_file = optarg; + break; case ('f'): force = 1; break; @@ -112,7 +116,7 @@ main(int argc, char *argv[]) } memset(&dirs, 0, sizeof(struct manpaths)); - manpath_parse(&dirs, base, aux); + manpath_parse(&dirs, conf_file, base, aux); ch = manup(&dirs, buf); manpath_free(&dirs); return(ch ? EXIT_SUCCESS : EXIT_FAILURE); @@ -124,6 +128,7 @@ usage(void) fprintf(stderr, "usage: %s " "[-fv] " + "[-C file] " "[-o path] " "[-m manpath] " "[-M manpath]\n", @@ -198,23 +203,22 @@ out: * Returns -1 on fatal error, 1 on success. */ static int -indexhtml(char *base, char *dst) +indexhtml(char *src, size_t ssz, char *dst, size_t dsz) { DB *idx; DBT key, val; - size_t sz; int c, rc; unsigned int fl; - const char *f, *cp; + const char *f; char *d; char fname[MAXPATHLEN]; pid_t pid; - sz = strlen(base); pid = -1; xstrlcpy(fname, dst, MAXPATHLEN); - xstrlcat(fname, "/mandoc.index", MAXPATHLEN); + xstrlcat(fname, "/", MAXPATHLEN); + xstrlcat(fname, MANDOC_IDX, MAXPATHLEN); idx = dbopen(fname, O_RDONLY, 0, DB_RECNO, NULL); if (NULL == idx) { @@ -225,42 +229,46 @@ indexhtml(char *base, char *dst) fl = R_FIRST; while (0 == (c = (*idx->seq)(idx, &key, &val, fl))) { fl = R_NEXT; - cp = (const char *)val.data; + /* + * If the record is zero-length, then it's unassigned. + * Skip past these. + */ if (0 == val.size) continue; - if (NULL == (f = memchr(cp, '\0', val.size))) + + f = (const char *)val.data + 1; + if (NULL == memchr(f, '\0', val.size - 1)) break; - if (++f - cp >= (int)val.size) - break; - if (NULL == memchr(f, '\0', val.size - (f - cp))) - break; - base[(int)sz] = '\0'; + src[(int)ssz] = dst[(int)dsz] = '\0'; - xstrlcat(base, "/", MAXPATHLEN); - xstrlcat(base, f, MAXPATHLEN); + xstrlcat(dst, "/", MAXPATHLEN); + xstrlcat(dst, f, MAXPATHLEN); - if (-1 == (rc = isnewer(base, f))) { + xstrlcat(src, "/", MAXPATHLEN); + xstrlcat(src, f, MAXPATHLEN); + + if (-1 == (rc = isnewer(dst, src))) { fprintf(stderr, "%s: File missing\n", f); break; } else if (0 == rc) continue; - d = strrchr(base, '/'); + d = strrchr(dst, '/'); assert(NULL != d); *d = '\0'; - if (-1 == mkpath(base, 0755, 0755)) { - perror(base); + if (-1 == mkpath(dst, 0755, 0755)) { + perror(dst); break; } *d = '/'; - if ( ! filecpy(base, f)) + if ( ! filecpy(dst, src)) break; if (verbose) - printf("%s\n", base); + printf("%s\n", dst); } (*idx->close)(idx); @@ -279,16 +287,19 @@ indexhtml(char *base, char *dst) * Return -1 on fatal error and 1 if the update went well. */ static int -update(char *base, char *dst, char *src) +update(char *dst, char *src) { size_t dsz, ssz; dsz = strlen(dst); ssz = strlen(src); - xstrlcat(src, "/mandoc.db", MAXPATHLEN); - xstrlcat(dst, "/mandoc.db", MAXPATHLEN); + xstrlcat(src, "/", MAXPATHLEN); + xstrlcat(dst, "/", MAXPATHLEN); + xstrlcat(src, MANDOC_DB, MAXPATHLEN); + xstrlcat(dst, MANDOC_DB, MAXPATHLEN); + if ( ! filecpy(dst, src)) return(-1); if (verbose) @@ -296,17 +307,20 @@ update(char *base, char *dst, char *src) dst[(int)dsz] = src[(int)ssz] = '\0'; - xstrlcat(src, "/mandoc.index", MAXPATHLEN); - xstrlcat(dst, "/mandoc.index", MAXPATHLEN); + xstrlcat(src, "/", MAXPATHLEN); + xstrlcat(dst, "/", MAXPATHLEN); + xstrlcat(src, MANDOC_IDX, MAXPATHLEN); + xstrlcat(dst, MANDOC_IDX, MAXPATHLEN); + if ( ! filecpy(dst, src)) return(-1); if (verbose) printf("%s\n", dst); - dst[(int)dsz] = '\0'; + dst[(int)dsz] = src[(int)ssz] = '\0'; - return(indexhtml(base, dst)); + return(indexhtml(src, ssz, dst, dsz)); } /* @@ -316,7 +330,7 @@ update(char *base, char *dst, char *src) * shouldn't be listed), and 1 if the update went well. */ static int -treecpy(char *base, char *dst, char *src) +treecpy(char *dst, char *src) { size_t dsz, ssz; int rc; @@ -324,20 +338,26 @@ treecpy(char *base, char *dst, char *src) dsz = strlen(dst); ssz = strlen(src); - xstrlcat(src, "/mandoc.index", MAXPATHLEN); - xstrlcat(dst, "/mandoc.index", MAXPATHLEN); + xstrlcat(src, "/", MAXPATHLEN); + xstrlcat(dst, "/", MAXPATHLEN); + xstrlcat(src, MANDOC_IDX, MAXPATHLEN); + xstrlcat(dst, MANDOC_IDX, MAXPATHLEN); + if (-1 == (rc = isnewer(dst, src))) return(0); dst[(int)dsz] = src[(int)ssz] = '\0'; if (1 == rc) - return(update(base, dst, src)); + return(update(dst, src)); - xstrlcat(src, "/mandoc.db", MAXPATHLEN); - xstrlcat(dst, "/mandoc.db", MAXPATHLEN); + xstrlcat(src, "/", MAXPATHLEN); + xstrlcat(dst, "/", MAXPATHLEN); + xstrlcat(src, MANDOC_DB, MAXPATHLEN); + xstrlcat(dst, MANDOC_DB, MAXPATHLEN); + if (-1 == (rc = isnewer(dst, src))) return(0); else if (rc == 0) @@ -345,7 +365,7 @@ treecpy(char *base, char *dst, char *src) dst[(int)dsz] = src[(int)ssz] = '\0'; - return(update(base, dst, src)); + return(update(dst, src)); } /* @@ -383,7 +403,7 @@ manup(const struct manpaths *dirs, char *base) for (i = 0; i < dirs->sz; i++) { path = dirs->paths[i]; - dst[(int)sz] = base[(int)sz] = '\0'; + dst[(int)sz] = '\0'; xstrlcat(dst, path, MAXPATHLEN); if (-1 == mkpath(dst, 0755, 0755)) { perror(dst); @@ -391,7 +411,7 @@ manup(const struct manpaths *dirs, char *base) } xstrlcpy(src, path, MAXPATHLEN); - if (-1 == (c = treecpy(base, dst, src))) + if (-1 == (c = treecpy(dst, src))) break; else if (0 == c) continue;