tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mandocdb(8) relative paths
@ 2011-12-15  1:04 Kristaps Dzonsons
  2011-12-15 10:10 ` Kristaps Dzonsons
  0 siblings, 1 reply; 2+ messages in thread
From: Kristaps Dzonsons @ 2011-12-15  1:04 UTC (permalink / raw)
  To: tech

[-- Attachment #1: Type: text/plain, Size: 672 bytes --]

Hi,

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.

Thoughts?

Kristaps

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 4712 bytes --]

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 00:43:32 -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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: mandocdb(8) relative paths
  2011-12-15  1:04 mandocdb(8) relative paths Kristaps Dzonsons
@ 2011-12-15 10:10 ` Kristaps Dzonsons
  0 siblings, 0 replies; 2+ messages in thread
From: Kristaps Dzonsons @ 2011-12-15 10:10 UTC (permalink / raw)
  To: tech

[-- 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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-12-15 10:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-15  1:04 mandocdb(8) relative paths Kristaps Dzonsons
2011-12-15 10:10 ` Kristaps Dzonsons

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).