From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp-1.sys.kth.se (smtp-1.sys.kth.se [130.237.32.175]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id pBFAAe7M017335 for ; Thu, 15 Dec 2011 05:10:40 -0500 (EST) Received: from mailscan-1.sys.kth.se (mailscan-1.sys.kth.se [130.237.32.91]) by smtp-1.sys.kth.se (Postfix) with ESMTP id 4A033156B83 for ; Thu, 15 Dec 2011 11:10:34 +0100 (CET) X-Virus-Scanned: by amavisd-new at kth.se Received: from smtp-1.sys.kth.se ([130.237.32.175]) by mailscan-1.sys.kth.se (mailscan-1.sys.kth.se [130.237.32.91]) (amavisd-new, port 10024) with LMTP id CvqSmnWDicvr for ; Thu, 15 Dec 2011 11:10:32 +0100 (CET) X-KTH-Auth: kristaps [83.250.6.251] X-KTH-mail-from: kristaps@bsd.lv X-KTH-rcpt-to: tech@mdocml.bsd.lv Received: from macky.local (c83-250-6-251.bredband.comhem.se [83.250.6.251]) by smtp-1.sys.kth.se (Postfix) with ESMTP id 6C3EC156333 for ; Thu, 15 Dec 2011 11:10:30 +0100 (CET) Message-ID: <4EE9C796.50507@bsd.lv> Date: Thu, 15 Dec 2011 11:10:30 +0100 From: Kristaps Dzonsons User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:8.0) Gecko/20111105 Thunderbird/8.0 X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 To: tech@mdocml.bsd.lv Subject: Re: mandocdb(8) relative paths References: <4EE94799.90308@bsd.lv> In-Reply-To: <4EE94799.90308@bsd.lv> Content-Type: multipart/mixed; boundary="------------010403070902080808040501" This is a multi-part message in MIME format. --------------010403070902080808040501 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit > Enclosed is a patch to mandocdb(8) that lists index filenames relative > to their database directory instead of absolute. > > In other words, > > /usr/local/man/man1/foo.1 -> man1/foo.1 > > This frees up a lot of space in the databases and also allows whole > subtrees to move around with `cp -R'. > > While here, I made chdir() error out since it's now required to traverse > the paths. I also touched up this and that, and removed some missed > "verb > 2" statements. > > apropos(1) and whatis(1) work fine with this patch (except my > "interactive mode" posted to discuss@, eagerly awaiting your comments), > but catman(8) and man.cgi(7) will need adjustment. Following up. This patch finishes the job for the other utilities. --------------010403070902080808040501 Content-Type: text/plain; name="patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="patch.txt" Index: catman.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/catman.c,v retrieving revision 1.5 diff -u -r1.5 catman.c --- catman.c 12 Dec 2011 02:00:49 -0000 1.5 +++ catman.c 15 Dec 2011 10:01:51 -0000 @@ -51,11 +51,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; @@ -198,11 +198,10 @@ * 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; @@ -210,7 +209,6 @@ char fname[MAXPATHLEN]; pid_t pid; - sz = strlen(base); pid = -1; xstrlcpy(fname, dst, MAXPATHLEN); @@ -235,32 +233,35 @@ if (NULL == memchr(f, '\0', val.size - (f - cp))) break; - base[(int)sz] = '\0'; + src[(int)ssz] = dst[(int)dsz] = '\0'; + + xstrlcat(dst, "/", MAXPATHLEN); + xstrlcat(dst, f, MAXPATHLEN); - xstrlcat(base, "/", MAXPATHLEN); - xstrlcat(base, f, MAXPATHLEN); + xstrlcat(src, "/", MAXPATHLEN); + xstrlcat(src, f, MAXPATHLEN); - if (-1 == (rc = isnewer(base, f))) { + 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,7 +280,7 @@ * 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; @@ -304,9 +305,9 @@ 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 +317,7 @@ * 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; @@ -333,7 +334,7 @@ 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); @@ -345,7 +346,7 @@ dst[(int)dsz] = src[(int)ssz] = '\0'; - return(update(base, dst, src)); + return(update(dst, src)); } /* @@ -383,7 +384,7 @@ 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 +392,7 @@ } xstrlcpy(src, path, MAXPATHLEN); - if (-1 == (c = treecpy(base, dst, src))) + if (-1 == (c = treecpy(dst, src))) break; else if (0 == c) continue; Index: cgi.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/cgi.c,v retrieving revision 1.31 diff -u -r1.31 cgi.c --- cgi.c 14 Dec 2011 13:36:59 -0000 1.31 +++ cgi.c 15 Dec 2011 10:01:51 -0000 @@ -744,6 +744,7 @@ pg_show(const struct req *req, char *path) { struct manpaths ps; + size_t sz; char *sub; char file[MAXPATHLEN]; const char *fn, *cp; @@ -799,7 +800,8 @@ goto out; } - strlcpy(file, ps.paths[vol], MAXPATHLEN); + sz = strlcpy(file, ps.paths[vol], MAXPATHLEN); + assert(sz < MAXPATHLEN); strlcat(file, "/mandoc.index", MAXPATHLEN); /* Open the index recno(3) database. */ @@ -828,10 +830,13 @@ else if (NULL == memchr(fn, '\0', val.size - (fn - cp))) resp_baddb(); else { + file[(int)sz] = '\0'; + strlcat(file, "/", MAXPATHLEN); + strlcat(file, fn, MAXPATHLEN); if (0 == strcmp(cp, "cat")) - catman(fn + 1); + catman(file); else - format(fn + 1); + format(file); } out: if (idx) Index: mandocdb.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandocdb.c,v retrieving revision 1.34 diff -u -r1.34 mandocdb.c --- mandocdb.c 12 Dec 2011 02:00:49 -0000 1.34 +++ mandocdb.c 15 Dec 2011 10:01:52 -0000 @@ -21,7 +21,6 @@ #include #include -#include #include #include @@ -110,7 +109,7 @@ recno_t *, recno_t **, size_t *, size_t *); static void ofile_argbuild(int, char *[], struct of **); -static int ofile_dirbuild(const char *, const char *, +static void ofile_dirbuild(const char *, const char *, const char *, int, struct of **); static void ofile_free(struct of *); static void pformatted(DB *, struct buf *, struct buf *, @@ -384,12 +383,8 @@ exit((int)MANDOCLEVEL_SYSERR); } - if (verb > 2) { - printf("%s: Opened\n", fbuf); - printf("%s: Opened\n", ibuf); - } - ofile_argbuild(argc, argv, &of); + if (NULL == of) goto out; @@ -399,13 +394,16 @@ &maxrec, &recs, &recsz, &reccur); /* - * Go to the root of the respective manual tree - * such that .so links work. In case of failure, - * just prod on, even though .so links won't work. + * Go to the root of the respective manual tree. + * This must work or no manuals may be found (they're + * indexed relative to the root). */ if (OP_UPDATE == op) { - chdir(dir); + if (-1 == chdir(dir)) { + perror(dir); + exit((int)MANDOCLEVEL_SYSERR); + } index_merge(of, mp, &dbuf, &buf, hash, db, fbuf, idx, ibuf, maxrec, recs, reccur); @@ -466,17 +464,15 @@ exit((int)MANDOCLEVEL_SYSERR); } - if (verb > 2) { - printf("%s: Truncated\n", fbuf); - printf("%s: Truncated\n", ibuf); - } - ofile_free(of); of = NULL; - if ( ! ofile_dirbuild(dirs.paths[i], NULL, NULL, - 0, &of)) + if (-1 == chdir(dirs.paths[i])) { + perror(dirs.paths[i]); exit((int)MANDOCLEVEL_SYSERR); + } + + ofile_dirbuild(".", NULL, NULL, 0, &of); if (NULL == of) continue; @@ -484,12 +480,16 @@ of = of->first; /* - * Go to the root of the respective manual tree - * such that .so links work. In case of failure, - * just prod on, even though .so links won't work. + * Go to the root of the respective manual tree. + * This must work or no manuals may be found (they're + * indexed relative to the root). */ - chdir(dirs.paths[i]); + if (-1 == chdir(dirs.paths[i])) { + perror(dirs.paths[i]); + exit((int)MANDOCLEVEL_SYSERR); + } + index_merge(of, mp, &dbuf, &buf, hash, db, fbuf, idx, ibuf, maxrec, recs, reccur); } @@ -1434,8 +1434,6 @@ * Add the structure to the list. */ - if (verb > 2) - printf("%s: Scheduling\n", argv[i]); if (NULL == *of) { *of = nof; (*of)->first = nof; @@ -1455,12 +1453,11 @@ * everything else is a manual. * Pass in a pointer to a NULL structure for the first invocation. */ -static int +static void ofile_dirbuild(const char *dir, const char* psec, const char *parch, int p_src_form, struct of **of) { char buf[MAXPATHLEN]; - struct stat sb; size_t sz; DIR *d; const char *fn, *sec, *arch; @@ -1471,7 +1468,7 @@ if (NULL == (d = opendir(dir))) { perror(dir); - return(0); + exit((int)MANDOCLEVEL_SYSERR); } while (NULL != (dp = readdir(d))) { @@ -1516,20 +1513,16 @@ if (MAXPATHLEN <= sz) { fprintf(stderr, "%s: Path too long\n", dir); - return(0); + exit((int)MANDOCLEVEL_SYSERR); } - if (verb > 2) - printf("%s: Scanning\n", buf); - - if ( ! ofile_dirbuild(buf, sec, arch, - src_form, of)) - return(0); + ofile_dirbuild(buf, sec, arch, src_form, of); } + if (DT_REG != dp->d_type || - (NULL == psec && !use_all) || - !strcmp(MANDOC_DB, fn) || - !strcmp(MANDOC_IDX, fn)) + (NULL == psec && !use_all) || + ! strcmp(MANDOC_DB, fn) || + ! strcmp(MANDOC_IDX, fn)) continue; /* @@ -1593,13 +1586,15 @@ "%s: Path too long\n", buf); continue; } - if (0 == stat(buf, &sb)) + if (0 == access(buf, R_OK)) continue; } } + assert('.' == dir[0]); + assert('/' == dir[1]); buf[0] = '\0'; - strlcat(buf, dir, MAXPATHLEN); + strlcat(buf, dir + 2, MAXPATHLEN); strlcat(buf, "/", MAXPATHLEN); sz = strlcat(buf, fn, MAXPATHLEN); if (sz >= MAXPATHLEN) { @@ -1628,8 +1623,6 @@ * Add the structure to the list. */ - if (verb > 2) - printf("%s: Scheduling\n", buf); if (NULL == *of) { *of = nof; (*of)->first = nof; @@ -1641,7 +1634,6 @@ } closedir(d); - return(1); } static void --------------010403070902080808040501-- -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv