tech@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: Kristaps Dzonsons <kristaps@bsd.lv>
To: tech@mdocml.bsd.lv
Cc: Ingo Schwarze <schwarze@usta.de>
Subject: Re: mandocdb: do not use bogus files
Date: Mon, 14 Nov 2011 21:07:13 +0100	[thread overview]
Message-ID: <4EC174F1.70902@bsd.lv> (raw)
In-Reply-To: <20111114191302.GJ27815@iris.usta.de>

On 14/11/2011 20:13, Ingo Schwarze wrote:
> Hi,
>
> because this patch started getting large and unwieldy, and i'm trying
> to move fast, i have just put it into OpenBSD:
>
>   ----- 8<  ----- schnipp ----->8 ----- 8<  ----- schnapp ----->8 -----
>
> CVSROOT:        /cvs
> Module name:    src
> Changes by:     schwarze@cvs.openbsd.org        2011/11/14 11:52:05
>
> Modified files:
>          usr.bin/mandoc : mandocdb.8 mandocdb.c
>
> Log message:
> Store page titles in the correct case, and by default, only
> put stuff into the database that man(1) will be able to retrieve.
> However, support an option to use all directories and files.
>
> Kristaps@ agreed with the general direction and provided some feedback.
>
>   ----- 8<  ----- schnipp ----->8 ----- 8<  ----- schnapp ----->8 -----
>
> Of course, more tweaking will be required, and i'm open for
> suggestions!
>
> Tell me if you think i should merge to bsd.lv;
> for that purpose, i'm appending the committed patch below.

Hi Ingo,

This is a good start, but it needs more documentation as to what's 
happening.  You mention man(1) a great deal, but I can't easily find an 
authoritative list of man's behaviour in this regard (not on a 4.9 box, 
anyway).

> -.Op Fl v
> +.Op Fl av
>   .Op Ar dir...
>   .Nm
>   .Op Fl v
> @@ -42,8 +42,15 @@ manuals and indexes them in a
>   and
>   .Sx Index Database
>   for fast retrieval.
> +.Pp
>   The arguments are as follows:
>   .Bl -tag -width Ds
> +.It Fl a
> +Use all directories and files found below
> +.Ar dir ... .
> +By default, directories and files
> +.Xr man 1
> +cannot find will be silently skipped.

Can you instead list the measures taken and remove the Xr man reference? 
  This reference is not portable.

> +		/*
> +		 * Make sure the manual section and architecture
> +		 * agree with the directory where the file is located
> +		 * or man(1) will not be able to find it.
> +		 */

Same here.  Yes, this seems like quibbling, but without making this 
change all of these comments are useless beyond OpenBSD.  Plus, I'd 
rather have the correct measures in-line than having to infer behaviour.

>   	for (i = 0; i<  argc; i++) {
> +
> +		/*
> +		 * Analyze the path.
> +		 */

Hm.  Can be you be more specific?  Yes, I can figure it out by looking 
at the code (the strrchr() call threw me: I've never seen it used like 
that).  But I'd rather you describe it beforehand.

> +
> +		if (strlcpy(buf, argv[i], sizeof(buf))>= sizeof(buf)) {
> +			fprintf(stderr, "%s: Path too long\n", argv[i]);
> +			continue;
> +		}
> +		sec = arch = title = NULL;
> +		p = strrchr(buf, '\0');
> +		while (p-->  buf) {
> +			if (NULL == sec&&  '.' == *p) {
> +				sec = p + 1;
> +				*p = '\0';
> +				continue;
> +			}
> +			if ('/' != *p)
> +				continue;
> +			if (NULL == title) {
> +				title = p + 1;
> +				*p = '\0';
> +				continue;
> +			}
> +			if (strncmp("man", p + 1, 3))
> +				arch = p + 1;
> +			break;
> +		}
> +		if (NULL == title)
> +			title = buf;
> +
> +		/*
> +		 * Build the file structure.
> +		 */
> +
>   		nof = mandoc_calloc(1, sizeof(struct of));
> -		nof->fname = strdup(argv[i]);
> +		nof->fname = mandoc_strdup(argv[i]);
> +		if (NULL != sec)
> +			nof->sec = mandoc_strdup(sec);
> +		if (NULL != arch)
> +			nof->arch = mandoc_strdup(arch);
> +		nof->title = mandoc_strdup(title);
> +
> +		/*
> +		 * Add the structure to the list.
> +		 */
> +
>   		if (verb>  2)
>   			printf("%s: Scheduling\n", argv[i]);
>   		if (NULL == *of) {
> @@ -1180,12 +1275,14 @@ ofile_argbuild(char *argv[], int argc, i
>    * Pass in a pointer to a NULL structure for the first invocation.
>    */
>   static int
> -ofile_dirbuild(const char *dir, int verb, struct of **of)
> +ofile_dirbuild(const char *dir, const char* psec, const char *parch,
> +		int use_all, int verb, struct of **of)
>   {
>   	char		 buf[MAXPATHLEN];
>   	size_t		 sz;
>   	DIR		*d;
> -	const char	*fn;
> +	const char	*fn, *sec, *arch;
> +	char		*suffix;
>   	struct of	*nof;
>   	struct dirent	*dp;
>
> @@ -1196,10 +1293,30 @@ ofile_dirbuild(const char *dir, int verb
>
>   	while (NULL != (dp = readdir(d))) {
>   		fn = dp->d_name;
> +
> +		if ('.' == *fn)
> +			continue;
> +
>   		if (DT_DIR == dp->d_type) {
> -			if (0 == strcmp(".", fn))
> -				continue;
> -			if (0 == strcmp("..", fn))
> +			sec = psec;
> +			arch = parch;
> +
> +			/*
> +	 		 * Don't bother parsing directories
> +			 * that man(1) won't find.
> +			 */

Same argument as above....

> +
> +			if (NULL == sec) {
> +				if(0 == strncmp("man", fn, 3))
> +					sec = fn + 3;
> +				else if (use_all)
> +					sec = fn;
> +				else
> +					continue;
> +			} else if (NULL == arch&&  (use_all ||
> +					NULL == strchr(fn, '.')))
> +				arch = fn;
> +			else if (0 == use_all)
>   				continue;
>
>   			buf[0] = '\0';
> @@ -1207,22 +1324,35 @@ ofile_dirbuild(const char *dir, int verb
>   			strlcat(buf, "/", MAXPATHLEN);
>   			sz = strlcat(buf, fn, MAXPATHLEN);
>
> -			if (sz<  MAXPATHLEN) {
> -				if ( ! ofile_dirbuild(buf, verb, of))
> -					return(0);
> -				continue;
> -			} else if (sz<  MAXPATHLEN)
> -				continue;
> -
> -			fprintf(stderr, "%s: Path too long\n", dir);
> -			return(0);
> +			if (MAXPATHLEN<= sz) {
> +				fprintf(stderr, "%s: Path too long\n", dir);
> +				return(0);
> +			}
> +
> +			if (verb>  2)
> +				printf("%s: Scanning\n", buf);
> +
> +			if ( ! ofile_dirbuild(buf, sec, arch,
> +					use_all, verb, of))
> +				return(0);
>   		}
> -		if (DT_REG != dp->d_type)
> +		if (DT_REG != dp->d_type ||
> +		    (NULL == psec&&  !use_all) ||
> +		    !strcmp(MANDOC_DB, fn) ||
> +		    !strcmp(MANDOC_IDX, fn))
>   			continue;
>
> -		if (0 == strcmp(MANDOC_DB, fn) ||
> -				0 == strcmp(MANDOC_IDX, fn))
> -			continue;
> +		/*
> +		 * Don't bother parsing files that man(1) won't find.
> +		 */

Again...

> +
> +		suffix = strrchr(fn, '.');
> +		if (0 == use_all) {
> +			if (NULL == suffix)
> +				continue;
> +			if (strcmp(suffix + 1, psec))
> +				continue;
> +		}
>
>   		buf[0] = '\0';
>   		strlcat(buf, dir, MAXPATHLEN);
> @@ -1235,6 +1365,13 @@ ofile_dirbuild(const char *dir, int verb
>
>   		nof = mandoc_calloc(1, sizeof(struct of));
>   		nof->fname = mandoc_strdup(buf);
> +		if (NULL != psec)
> +			nof->sec = mandoc_strdup(psec);
> +		if (NULL != parch)
> +			nof->arch = mandoc_strdup(parch);
> +		if (NULL != suffix)
> +			*suffix = '\0';
> +		nof->title = mandoc_strdup(fn);
>
>   		if (verb>  2)
>   			printf("%s: Scheduling\n", buf);
> @@ -1261,6 +1398,9 @@ ofile_free(struct of *of)
>   	while (of) {
>   		nof = of->next;
>   		free(of->fname);
> +		free(of->sec);
> +		free(of->arch);
> +		free(of->title);
>   		free(of);
>   		of = nof;
>   	}
> --
>   To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
>

--
 To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv

  reply	other threads:[~2011-11-14 20:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-13 18:42 Ingo Schwarze
2011-11-13 20:05 ` Kristaps Dzonsons
2011-11-14  0:06   ` Ingo Schwarze
2011-11-14 19:13     ` Ingo Schwarze
2011-11-14 20:07       ` Kristaps Dzonsons [this message]
2011-11-14 23:34         ` Ingo Schwarze
2011-11-24 10:10           ` Kristaps Dzonsons

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=4EC174F1.70902@bsd.lv \
    --to=kristaps@bsd.lv \
    --cc=schwarze@usta.de \
    --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).