From: Kristaps Dzonsons <kristaps@bsd.lv>
To: tech@mdocml.bsd.lv
Subject: Re: mandocdb(8) relative paths
Date: Thu, 15 Dec 2011 11:10:30 +0100 [thread overview]
Message-ID: <4EE9C796.50507@bsd.lv> (raw)
In-Reply-To: <4EE94799.90308@bsd.lv>
[-- Attachment #1: Type: text/plain, Size: 735 bytes --]
> 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.
[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 9269 bytes --]
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 <sys/param.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <assert.h>
#include <dirent.h>
@@ -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
prev parent reply other threads:[~2011-12-15 10:10 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-15 1:04 Kristaps Dzonsons
2011-12-15 10:10 ` Kristaps Dzonsons [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EE9C796.50507@bsd.lv \
--to=kristaps@bsd.lv \
--cc=tech@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).