source@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: merge OpenBSD rev.
Date: Tue, 17 Sep 2013 18:48:54 -0400 (EDT)	[thread overview]
Message-ID: <201309172248.r8HMms1U005286@krisdoz.my.domain> (raw)

Log Message:
-----------
merge OpenBSD rev. 1.41:
backout non-portable code

Tags:
----
VERSION_1_12

Modified Files:
--------------
    mdocml:
        mandocdb.c

Revision Data
-------------
Index: mandocdb.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandocdb.c,v
retrieving revision 1.49.2.1
retrieving revision 1.49.2.2
diff -Lmandocdb.c -Lmandocdb.c -u -p -r1.49.2.1 -r1.49.2.2
--- mandocdb.c
+++ mandocdb.c
@@ -56,15 +56,6 @@
 #define	MANDOC_SRC	  0x1
 #define	MANDOC_FORM	  0x2
 
-#define WARNING(_f, _b, _fmt, _args...) \
-	do if (warnings) { \
-		fprintf(stderr, "%s: ", (_b)); \
-		fprintf(stderr, (_fmt), ##_args); \
-		if ('\0' != *(_f)) \
-			fprintf(stderr, ": %s", (_f)); \
-		fprintf(stderr, "\n"); \
-	} while (/* CONSTCOND */ 0)
-		
 /* Access to the mandoc database on disk. */
 
 struct	mdb {
@@ -133,17 +124,16 @@ static	void		  hash_put(DB *, const stru
 static	void		  hash_reset(DB **);
 static	void		  index_merge(const struct of *, struct mparse *,
 				struct buf *, struct buf *, DB *,
-				struct mdb *, struct recs *,
-				const char *);
+				struct mdb *, struct recs *);
 static	void		  index_prune(const struct of *, struct mdb *,
-				struct recs *, const char *);
-static	void		  ofile_argbuild(int, char *[],
-				struct of **, const char *);
+				struct recs *);
+static	void		  ofile_argbuild(int, char *[], struct of **,
+				const char *);
 static	void		  ofile_dirbuild(const char *, const char *,
-				const char *, int, struct of **, char *);
+				const char *, int, struct of **);
 static	void		  ofile_free(struct of *);
-static	void		  pformatted(DB *, struct buf *, struct buf *,
-				const struct of *, const char *);
+static	void		  pformatted(DB *, struct buf *, 
+				struct buf *, const struct of *);
 static	int		  pman_node(MAN_ARGS);
 static	void		  pmdoc_node(MDOC_ARGS);
 static	int		  pmdoc_head(MDOC_ARGS);
@@ -304,8 +294,9 @@ main(int argc, char *argv[])
 	struct recs	 recs;
 	enum op		 op; /* current operation */
 	const char	*dir;
+	char		*cp;
+	char		 pbuf[PATH_MAX];
 	int		 ch, i, flags;
-	char		 dirbuf[PATH_MAX];
 	DB		*hash; /* temporary keyword hashtable */
 	BTREEINFO	 info; /* btree configuration */
 	size_t		 sz1, sz2;
@@ -407,25 +398,31 @@ main(int argc, char *argv[])
 	dbuf.cp = mandoc_malloc(dbuf.size);
 
 	if (OP_TEST == op) {
-		ofile_argbuild(argc, argv, &of, ".");
+		ofile_argbuild(argc, argv, &of, NULL);
 		if (NULL == of)
 			goto out;
-		index_merge(of, mp, &dbuf, &buf,
-				hash, &mdb, &recs, ".");
+		index_merge(of, mp, &dbuf, &buf, hash, &mdb, &recs);
 		goto out;
 	}
 
 	if (OP_UPDATE == op || OP_DELETE == op) {
-		strlcat(mdb.dbn, dir, PATH_MAX);
-		strlcat(mdb.dbn, "/", PATH_MAX);
+		if (NULL == realpath(dir, pbuf)) {
+			perror(dir);
+			exit((int)MANDOCLEVEL_BADARG);
+		}
+		if (strlcat(pbuf, "/", PATH_MAX) >= PATH_MAX) {
+			fprintf(stderr, "%s: path too long\n", pbuf);
+			exit((int)MANDOCLEVEL_BADARG);
+		}
+
+		strlcat(mdb.dbn, pbuf, PATH_MAX);
 		sz1 = strlcat(mdb.dbn, MANDOC_DB, PATH_MAX);
 
-		strlcat(mdb.idxn, dir, PATH_MAX);
-		strlcat(mdb.idxn, "/", PATH_MAX);
+		strlcat(mdb.idxn, pbuf, PATH_MAX);
 		sz2 = strlcat(mdb.idxn, MANDOC_IDX, PATH_MAX);
 
 		if (sz1 >= PATH_MAX || sz2 >= PATH_MAX) {
-			fprintf(stderr, "%s: path too long\n", dir);
+			fprintf(stderr, "%s: path too long\n", mdb.idxn);
 			exit((int)MANDOCLEVEL_BADARG);
 		}
 
@@ -441,12 +438,12 @@ main(int argc, char *argv[])
 			exit((int)MANDOCLEVEL_SYSERR);
 		}
 
-		ofile_argbuild(argc, argv, &of, dir);
+		ofile_argbuild(argc, argv, &of, pbuf);
 
 		if (NULL == of)
 			goto out;
 
-		index_prune(of, &mdb, &recs, dir);
+		index_prune(of, &mdb, &recs);
 
 		/*
 		 * Go to the root of the respective manual tree.
@@ -460,7 +457,7 @@ main(int argc, char *argv[])
 				exit((int)MANDOCLEVEL_SYSERR);
 			}
 			index_merge(of, mp, &dbuf, &buf, hash,
-					&mdb, &recs, dir);
+					&mdb, &recs);
 		}
 
 		goto out;
@@ -475,12 +472,18 @@ main(int argc, char *argv[])
 	if (argc > 0) {
 		dirs.paths = mandoc_calloc(argc, sizeof(char *));
 		dirs.sz = argc;
-		for (i = 0; i < argc; i++) 
-			dirs.paths[i] = mandoc_strdup(argv[i]);
+		for (i = 0; i < argc; i++) {
+			if (NULL == (cp = realpath(argv[i], pbuf))) {
+				perror(argv[i]);
+				goto out;
+			}
+			dirs.paths[i] = mandoc_strdup(cp);
+		}
 	} else
 		manpath_parse(&dirs, dir, NULL, NULL);
 
 	for (i = 0; i < dirs.sz; i++) {
+
 		/*
 		 * Go to the root of the respective manual tree.
 		 * This must work or no manuals may be found:
@@ -511,12 +514,11 @@ main(int argc, char *argv[])
 		 * Search for manuals and fill the new database.
 		 */
 
-		strlcpy(dirbuf, dirs.paths[i], PATH_MAX);
-	       	ofile_dirbuild(".", "", "", 0, &of, dirbuf);
+	       	ofile_dirbuild(".", "", "", 0, &of);
 
 		if (NULL != of) {
 			index_merge(of, mp, &dbuf, &buf, hash,
-			     &mdb, &recs, dirs.paths[i]);
+			     &mdb, &recs);
 			ofile_free(of);
 			of = NULL;
 		}
@@ -547,7 +549,7 @@ out:
 
 usage:
 	fprintf(stderr,
-		"usage: %s [-av] [-C file] | dir ... | -t file ...\n"
+		"usage: %s [-avvv] [-C file] | dir ... | -t file ...\n"
 		"                        -d dir [file ...] | "
 		"-u dir [file ...]\n",
 		progname);
@@ -558,18 +560,16 @@ usage:
 void
 index_merge(const struct of *of, struct mparse *mp,
 		struct buf *dbuf, struct buf *buf, DB *hash,
-		struct mdb *mdb, struct recs *recs,
-		const char *basedir)
+		struct mdb *mdb, struct recs *recs)
 {
 	recno_t		 rec;
 	int		 ch, skip;
 	DBT		 key, val;
 	DB		*files;  /* temporary file name table */
-	char	 	 emptystring[1] = {'\0'};
 	struct mdoc	*mdoc;
 	struct man	*man;
-	char		*p;
 	const char	*fn, *msec, *march, *mtitle;
+	char		*p;
 	uint64_t	 mask;
 	size_t		 sv;
 	unsigned	 seq;
@@ -629,9 +629,13 @@ index_merge(const struct of *of, struct 
 		skip = 0;
 		assert(of->sec);
 		assert(msec);
-		if (strcasecmp(msec, of->sec))
-			WARNING(fn, basedir, "Section \"%s\" manual "
-				"in \"%s\" directory", msec, of->sec);
+		if (warnings)
+			if (strcasecmp(msec, of->sec))
+				fprintf(stderr, "%s: "
+					"section \"%s\" manual "
+					"in \"%s\" directory\n",
+					fn, msec, of->sec);
+
 		/*
 		 * Manual page directories exist for each kernel
 		 * architecture as returned by machine(1).
@@ -649,10 +653,12 @@ index_merge(const struct of *of, struct 
 
 		assert(of->arch);
 		assert(march);
-		if (strcasecmp(march, of->arch))
-			WARNING(fn, basedir, "Architecture \"%s\" "
-				"manual in \"%s\" directory",
-				march, of->arch);
+		if (warnings)
+			if (strcasecmp(march, of->arch))
+				fprintf(stderr, "%s: "
+					"architecture \"%s\" manual "
+					"in \"%s\" directory\n",
+					fn, march, of->arch);
 
 		/*
 		 * By default, skip a file if the title given
@@ -688,7 +694,7 @@ index_merge(const struct of *of, struct 
 			val.data = NULL;
 			val.size = 0;
 			if (0 == skip)
-				val.data = emptystring;
+				val.data = "";
 			else {
 				ch = (*files->get)(files, &key, &val, 0);
 				if (ch < 0) {
@@ -742,7 +748,7 @@ index_merge(const struct of *of, struct 
 		else if (man)
 			pman_node(hash, buf, dbuf, man_node(man));
 		else
-			pformatted(hash, buf, dbuf, of, basedir);
+			pformatted(hash, buf, dbuf, of);
 
 		/* Test mode, do not access any database. */
 
@@ -789,6 +795,8 @@ index_merge(const struct of *of, struct 
 		}
 		if (ch < 0) {
 			perror("hash");
+			unlink(mdb->dbn);
+			unlink(mdb->idxn);
 			exit((int)MANDOCLEVEL_SYSERR);
 		}
 
@@ -807,7 +815,7 @@ index_merge(const struct of *of, struct 
 		val.size = dbuf->len;
 
 		if (verb)
-			printf("%s: Adding to index: %s\n", basedir, fn);
+			printf("%s: adding to index\n", fn);
 
 		dbt_put(mdb->idx, mdb->idxn, &key, &val);
 	}
@@ -822,9 +830,9 @@ index_merge(const struct of *of, struct 
 		while (0 == (*files->seq)(files, &key, &val, seq)) {
 			seq = R_NEXT;
 			if (val.size)
-				WARNING((char *)val.data, basedir,
-					"Probably unreachable, title "
-					"is %s", (char *)key.data);
+				fprintf(stderr, "%s: probably "
+				    "unreachable, title is %s\n",
+				    (char *)val.data, (char *)key.data);
 		}
 		(*files->close)(files);
 	}
@@ -837,8 +845,7 @@ index_merge(const struct of *of, struct 
  * in `idx' (zeroing its value size).
  */
 static void
-index_prune(const struct of *ofile, struct mdb *mdb,
-		struct recs *recs, const char *basedir)
+index_prune(const struct of *ofile, struct mdb *mdb, struct recs *recs)
 {
 	const struct of	*of;
 	const char	*fn;
@@ -913,8 +920,7 @@ index_prune(const struct of *ofile, stru
 		}
 
 		if (verb)
-			printf("%s: Deleting from index: %s\n",
-					basedir, fn);
+			printf("%s: deleting from index\n", fn);
 
 		val.size = 0;
 		ch = (*mdb->idx->put)(mdb->idx, &key, &val, R_CURSOR);
@@ -1474,15 +1480,16 @@ pman_node(MAN_ARGS)
  * By necessity, this involves rather crude guesswork.
  */
 static void
-pformatted(DB *hash, struct buf *buf, struct buf *dbuf, 
-		const struct of *of, const char *basedir)
+pformatted(DB *hash, struct buf *buf, 
+		struct buf *dbuf, const struct of *of)
 {
 	FILE		*stream;
 	char		*line, *p, *title;
 	size_t		 len, plen, titlesz;
 
 	if (NULL == (stream = fopen(of->fname, "r"))) {
-		WARNING(of->fname, basedir, "%s", strerror(errno));
+		if (warnings)
+			perror(of->fname);
 		return;
 	}
 
@@ -1537,6 +1544,7 @@ pformatted(DB *hash, struct buf *buf, st
 		title[(int)titlesz - 1] = ' ';
 	}
 
+
 	/*
 	 * If no page content can be found, or the input line
 	 * is already the next section header, or there is no
@@ -1545,8 +1553,9 @@ pformatted(DB *hash, struct buf *buf, st
 	 */
 
 	if (NULL == title || '\0' == *title) {
-		WARNING(of->fname, basedir, 
-			"Cannot find NAME section");
+		if (warnings)
+			fprintf(stderr, "%s: cannot find NAME section\n",
+					of->fname);
 		buf_appendb(dbuf, buf->cp, buf->size);
 		hash_put(hash, buf, TYPE_Nd);
 		fclose(stream);
@@ -1567,8 +1576,9 @@ pformatted(DB *hash, struct buf *buf, st
 		for (p += 2; ' ' == *p || '\b' == *p; p++)
 			/* Skip to next word. */ ;
 	} else {
-		WARNING(of->fname, basedir, 
-			"No dash in title line");
+		if (warnings)
+			fprintf(stderr, "%s: no dash in title line\n",
+					of->fname);
 		p = title;
 	}
 
@@ -1595,16 +1605,30 @@ pformatted(DB *hash, struct buf *buf, st
 }
 
 static void
-ofile_argbuild(int argc, char *argv[], 
-		struct of **of, const char *basedir)
+ofile_argbuild(int argc, char *argv[], struct of **of,
+		const char *basedir)
 {
 	char		 buf[PATH_MAX];
+	char		 pbuf[PATH_MAX];
 	const char	*sec, *arch, *title;
-	char		*p;
+	char		*relpath, *p;
 	int		 i, src_form;
 	struct of	*nof;
 
 	for (i = 0; i < argc; i++) {
+		if (NULL == (relpath = realpath(argv[i], pbuf))) {
+			perror(argv[i]);
+			continue;
+		}
+		if (NULL != basedir) {
+			if (strstr(pbuf, basedir) != pbuf) {
+				fprintf(stderr, "%s: file outside "
+				    "base directory %s\n",
+				    pbuf, basedir);
+				continue;
+			}
+			relpath = pbuf + strlen(basedir);
+		}
 
 		/*
 		 * Try to infer the manual section, architecture and
@@ -1613,8 +1637,8 @@ ofile_argbuild(int argc, char *argv[], 
 		 *   cat<section>[/<arch>]/<title>.0
 		 */
 
-		if (strlcpy(buf, argv[i], sizeof(buf)) >= sizeof(buf)) {
-			fprintf(stderr, "%s: Path too long\n", argv[i]);
+		if (strlcpy(buf, relpath, sizeof(buf)) >= sizeof(buf)) {
+			fprintf(stderr, "%s: path too long\n", relpath);
 			continue;
 		}
 		sec = arch = title = "";
@@ -1646,8 +1670,11 @@ ofile_argbuild(int argc, char *argv[], 
 			break;
 		}
 		if ('\0' == *title) {
-			WARNING(argv[i], basedir, 
-				"Cannot deduce title from filename");
+			if (warnings)
+				fprintf(stderr,
+				    "%s: cannot deduce title "
+				    "from filename\n",
+				    relpath);
 			title = buf;
 		}
 
@@ -1656,7 +1683,7 @@ ofile_argbuild(int argc, char *argv[], 
 		 */
 
 		nof = mandoc_calloc(1, sizeof(struct of));
-		nof->fname = mandoc_strdup(argv[i]);
+		nof->fname = mandoc_strdup(relpath);
 		nof->sec = mandoc_strdup(sec);
 		nof->arch = mandoc_strdup(arch);
 		nof->title = mandoc_strdup(title);
@@ -1687,7 +1714,7 @@ ofile_argbuild(int argc, char *argv[], 
  */
 static void
 ofile_dirbuild(const char *dir, const char* psec, const char *parch,
-		int p_src_form, struct of **of, char *basedir)
+		int p_src_form, struct of **of)
 {
 	char		 buf[PATH_MAX];
 	size_t		 sz;
@@ -1699,7 +1726,8 @@ ofile_dirbuild(const char *dir, const ch
 	int		 src_form;
 
 	if (NULL == (d = opendir(dir))) {
-		WARNING("", dir, "%s", strerror(errno));
+		if (warnings)
+			perror(dir);
 		return;
 	}
 
@@ -1729,7 +1757,9 @@ ofile_dirbuild(const char *dir, const ch
 					src_form |= MANDOC_FORM;
 					sec = fn + 3;
 				} else {
-					WARNING(fn, basedir, "Bad section");
+					if (warnings) fprintf(stderr,
+					    "%s/%s: bad section\n",
+					    dir, fn);
 					if (use_all)
 						sec = fn;
 					else
@@ -1737,13 +1767,16 @@ ofile_dirbuild(const char *dir, const ch
 				}
 			} else if ('\0' == *arch) {
 				if (NULL != strchr(fn, '.')) {
-					WARNING(fn, basedir, "Bad architecture");
+					if (warnings) fprintf(stderr,
+					    "%s/%s: bad architecture\n",
+					    dir, fn);
 					if (0 == use_all)
 						continue;
 				}
 				arch = fn;
 			} else {
-				WARNING(fn, basedir, "Excessive subdirectory");
+				if (warnings) fprintf(stderr, "%s/%s: "
+				    "excessive subdirectory\n", dir, fn);
 				if (0 == use_all)
 					continue;
 			}
@@ -1751,31 +1784,32 @@ ofile_dirbuild(const char *dir, const ch
 			buf[0] = '\0';
 			strlcat(buf, dir, PATH_MAX);
 			strlcat(buf, "/", PATH_MAX);
-			strlcat(basedir, "/", PATH_MAX);
-			strlcat(basedir, fn, PATH_MAX);
 			sz = strlcat(buf, fn, PATH_MAX);
 
 			if (PATH_MAX <= sz) {
-				WARNING(fn, basedir, "Path too long");
+				if (warnings) fprintf(stderr, "%s/%s: "
+				    "path too long\n", dir, fn);
 				continue;
 			}
 
-			ofile_dirbuild(buf, sec, arch,
-					src_form, of, basedir);
-
-			p = strrchr(basedir, '/');
-			*p = '\0';
+			ofile_dirbuild(buf, sec, arch, src_form, of);
 			continue;
 		}
 
 		if (DT_REG != dp->d_type) {
-			WARNING(fn, basedir, "Not a regular file");
+			if (warnings)
+				fprintf(stderr,
+				    "%s/%s: not a regular file\n",
+				    dir, fn);
 			continue;
 		}
 		if (!strcmp(MANDOC_DB, fn) || !strcmp(MANDOC_IDX, fn))
 			continue;
 		if ('\0' == *psec) {
-			WARNING(fn, basedir, "File outside section");
+			if (warnings)
+				fprintf(stderr,
+				    "%s/%s: file outside section\n",
+				    dir, fn);
 			if (0 == use_all)
 				continue;
 		}
@@ -1788,14 +1822,20 @@ ofile_dirbuild(const char *dir, const ch
 
 		suffix = strrchr(fn, '.');
 		if (NULL == suffix) {
-			WARNING(fn, basedir, "No filename suffix");
+			if (warnings)
+				fprintf(stderr,
+				    "%s/%s: no filename suffix\n",
+				    dir, fn);
 			if (0 == use_all)
 				continue;
 		} else if ((MANDOC_SRC & src_form &&
 				strcmp(suffix + 1, psec)) ||
 			    (MANDOC_FORM & src_form &&
 				strcmp(suffix + 1, "0"))) {
-			WARNING(fn, basedir, "Wrong filename suffix");
+			if (warnings)
+				fprintf(stderr,
+				    "%s/%s: wrong filename suffix\n",
+				    dir, fn);
 			if (0 == use_all)
 				continue;
 			if ('0' == suffix[1])
@@ -1829,7 +1869,9 @@ ofile_dirbuild(const char *dir, const ch
 			strlcat(buf, "/", PATH_MAX);
 			sz = strlcat(buf, fn, PATH_MAX);
 			if (sz >= PATH_MAX) {
-				WARNING(fn, basedir, "Path too long");
+				if (warnings) fprintf(stderr,
+				    "%s/%s: path too long\n",
+				    dir, fn);
 				continue;
 			}
 			q = strrchr(buf, '.');
@@ -1837,7 +1879,9 @@ ofile_dirbuild(const char *dir, const ch
 				*q = '\0';
 				sz = strlcat(buf, psec, PATH_MAX);
 				if (sz >= PATH_MAX) {
-					WARNING(fn, basedir, "Path too long");
+					if (warnings) fprintf(stderr,
+					    "%s/%s: path too long\n",
+					    dir, fn);
 					continue;
 				}
 				if (0 == access(buf, R_OK))
@@ -1853,7 +1897,8 @@ ofile_dirbuild(const char *dir, const ch
 		}
 		sz = strlcat(buf, fn, PATH_MAX);
 		if (sz >= PATH_MAX) {
-			WARNING(fn, basedir, "Path too long");
+			if (warnings) fprintf(stderr,
+			    "%s/%s: path too long\n", dir, fn);
 			continue;
 		}
 
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

             reply	other threads:[~2013-09-17 22:48 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-17 22:48 schwarze [this message]
2013-09-17 23:07 mdocml: Merge " schwarze
2013-09-17 23:12 schwarze
2014-04-04 15:51 mdocml: merge " schwarze
2014-06-18 19:34 mdocml: Merge " schwarze
2014-07-11 22:25 mdocml: merge " schwarze
2014-07-11 22:27 schwarze

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=201309172248.r8HMms1U005286@krisdoz.my.domain \
    --to=schwarze@mdocml.bsd.lv \
    --cc=source@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).