source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Initial support for man.conf/makepath(1).
@ 2011-11-20 21:36 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2011-11-20 21:36 UTC (permalink / raw)
  To: source

Log Message:
-----------
Initial support for man.conf/makepath(1).

Modified Files:
--------------
    mdocml:
        Makefile
        apropos.1
        apropos.c

Revision Data
-------------
Index: apropos.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/apropos.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -Lapropos.c -Lapropos.c -u -p -r1.16 -r1.17
--- apropos.c
+++ apropos.c
@@ -20,6 +20,7 @@
 #endif
 
 #include <assert.h>
+#include <ctype.h>
 #include <getopt.h>
 #include <limits.h>
 #include <stdio.h>
@@ -30,6 +31,13 @@
 #include "mandoc.h"
 
 /*
+ * FIXME: add support for manpath(1), which everybody but OpenBSD and
+ * NetBSD seem to use.
+ */
+#define MAN_CONF_FILE	"/etc/man.conf"
+#define MAN_CONF_KEY	"_whatdb"
+
+/*
  * List of paths to be searched for manual databases.
  */
 struct	manpaths {
@@ -41,6 +49,7 @@ static	int	 cmp(const void *, const void
 static	void	 list(struct res *, size_t, void *);
 static	void	 manpath_add(struct manpaths *, const char *);
 static	void	 manpath_parse(struct manpaths *, char *);
+static	void	 manpath_parseconf(struct manpaths *);
 static	void	 usage(void);
 
 static	char	*progname;
@@ -53,6 +62,7 @@ main(int argc, char *argv[])
 	size_t		 terms;
 	struct opts	 opts;
 	struct expr	*e;
+	char		*defpaths, *auxpaths;
 	extern int	 optind;
 	extern char	*optarg;
 
@@ -65,13 +75,17 @@ main(int argc, char *argv[])
 	memset(&paths, 0, sizeof(struct manpaths));
 	memset(&opts, 0, sizeof(struct opts));
 
+	auxpaths = defpaths = NULL;
 	e = NULL;
 	rc = 0;
 
-	while (-1 != (ch = getopt(argc, argv, "m:S:s:"))) 
+	while (-1 != (ch = getopt(argc, argv, "M:m:S:s:"))) 
 		switch (ch) {
+		case ('M'):
+			defpaths = optarg;
+			break;
 		case ('m'):
-			manpath_parse(&paths, optarg);
+			auxpaths = optarg;
 			break;
 		case ('S'):
 			opts.arch = optarg;
@@ -92,14 +106,15 @@ main(int argc, char *argv[])
 		goto out;
 	}
 
-	/*
-	 * Let MANPATH override our default paths.
-	 */
-
 	if (NULL != getenv("MANPATH"))
-		manpath_add(&paths, getenv("MANPATH"));
+		defpaths = getenv("MANPATH");
+
+	if (NULL == defpaths)
+		manpath_parseconf(&paths);
 	else
-		manpath_add(&paths, ".");
+		manpath_parse(&paths, defpaths);
+
+	manpath_parse(&paths, auxpaths);
 
 	if (NULL == (e = exprcomp(argc, argv, &terms))) {
 		fprintf(stderr, "%s: Bad expression\n", progname);
@@ -153,6 +168,7 @@ usage(void)
 {
 
 	fprintf(stderr, "usage: %s "
+			"[-M dirs] "
 			"[-m dirs] "
 			"[-S arch] "
 			"[-s section] "
@@ -167,6 +183,9 @@ manpath_parse(struct manpaths *dirs, cha
 {
 	char	*dir;
 
+	if (NULL == path)
+		return;
+
 	for (dir = strtok(path, ":"); dir; dir = strtok(NULL, ":"))
 		manpath_add(dirs, dir);
 }
@@ -180,13 +199,78 @@ manpath_add(struct manpaths *dirs, const
 {
 	char		 buf[PATH_MAX];
 	char		*cp;
+	int		 i;
 
 	if (NULL == (cp = realpath(dir, buf)))
 		return;
 
+	for (i = 0; i < dirs->sz; i++)
+		if (0 == strcmp(dirs->paths[i], dir))
+			return;
+
 	dirs->paths = mandoc_realloc
 		(dirs->paths, 
 		 ((size_t)dirs->sz + 1) * sizeof(char *));
 
 	dirs->paths[dirs->sz++] = mandoc_strdup(cp);
+}
+
+static void
+manpath_parseconf(struct manpaths *dirs) 
+{
+	FILE		*stream;
+#ifdef	USE_MANPATH
+	char		*buf;
+	size_t		 sz, bsz;
+
+	stream = popen("manpath", "r");
+	if (NULL == stream)
+		return;
+
+	buf = NULL;
+	bsz = 0;
+
+	do {
+		buf = mandoc_realloc(buf, bsz + 1024);
+		sz = fread(buf + (int)bsz, 1, 1024, stream);
+		bsz += sz;
+	} while (sz > 0);
+
+	assert(bsz && '\n' == buf[bsz - 1]);
+	buf[bsz - 1] = '\0';
+
+	manpath_parse(dirs, buf);
+	free(buf);
+	pclose(stream);
+#else
+	char		*p, *q;
+	size_t	 	 len, keysz;
+
+	keysz = strlen(MAN_CONF_KEY);
+	assert(keysz > 0);
+
+	if (NULL == (stream = fopen(MAN_CONF_FILE, "r")))
+		return;
+
+	while (NULL != (p = fgetln(stream, &len))) {
+		if (0 == len || '\n' == p[--len])
+			break;
+		p[len] = '\0';
+		while (isspace((unsigned char)*p))
+			p++;
+		if (strncmp(MAN_CONF_KEY, p, keysz))
+			continue;
+		p += keysz;
+		while (isspace(*p))
+			p++;
+		if ('\0' == *p)
+			continue;
+		if (NULL == (q = strrchr(p, '/')))
+			continue;
+		*q = '\0';
+		manpath_add(dirs, p);
+	}
+
+	fclose(stream);
+#endif
 }
Index: apropos.1
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/apropos.1,v
retrieving revision 1.6
retrieving revision 1.7
diff -Lapropos.1 -Lapropos.1 -u -p -r1.6 -r1.7
--- apropos.1
+++ apropos.1
@@ -22,6 +22,7 @@
 .Nd search manual page databases
 .Sh SYNOPSIS
 .Nm
+.Op Fl M Ar manpath
 .Op Fl m Ar manpath
 .Op Fl S Ar arch
 .Op Fl s Ar section
@@ -36,8 +37,14 @@ evaluating on
 for each file in each database.
 Its arguments are as follows:
 .Bl -tag -width Ds
+.It Fl M Ar manpath
+Use the colon-separated path instead of the default list of paths
+searched for
+.Xr mandocdb 8
+databases.
+Invalid paths, or paths without manual databases, are ignored.
 .It Fl m Ar manpath
-Append the colon-separated paths to the default list of paths searched
+Append the colon-separated paths to the list of paths searched
 for
 .Xr mandocdb 8
 databases.
@@ -112,9 +119,10 @@ is evaluated case-insensitively.
 .Pp
 By default,
 .Nm
-searches for a
+searches for
 .Xr mandocdb 8
-database in the current working directory and
+databases in the default paths stipulated by
+.Xr man 1 ,
 parses terms as case-sensitive regular expressions
 .Pq the Li \&~ operator
 over manual names and descriptions
@@ -150,6 +158,8 @@ If an architecture is specified in the o
 Comma-separated paths overriding the default list of paths searched for
 manual databases.
 Invalid paths, or paths without manual databases, are ignored.
+Takes precedence over
+.Fl M .
 .El
 .\" .Sh FILES
 .Sh EXIT STATUS
Index: Makefile
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/Makefile,v
retrieving revision 1.378
retrieving revision 1.379
diff -LMakefile -LMakefile -u -p -r1.378 -r1.379
--- Makefile
+++ Makefile
@@ -23,6 +23,9 @@ VDATE		 = 8 October 2011
 #
 CFLAGS	 	+= -DUSE_WCHAR
 
+# If your system has manpath(1), check this off.
+# CFLAGS	+= -DUSE_MANPATH
+
 CFLAGS		+= -g -DHAVE_CONFIG_H -DVERSION="\"$(VERSION)\""
 CFLAGS     	+= -W -Wall -Wstrict-prototypes -Wno-unused-parameter -Wwrite-strings
 PREFIX		 = /usr/local
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-11-20 21:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-20 21:36 mdocml: Initial support for man.conf/makepath(1) kristaps

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