source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Switch on "manpath=" handling, which I call the "manroot" (as
@ 2011-12-10 22:45 kristaps
  0 siblings, 0 replies; only message in thread
From: kristaps @ 2011-12-10 22:45 UTC (permalink / raw)
  To: source

Log Message:
-----------
Switch on "manpath=" handling, which I call the "manroot" (as "manpath" is
reserved for paths within a manroot).  This functionality is bare-bones:
right now, the default manroot is the first one scanned from the cache
directory.  At some point this will be sexy and smooth, but it's easy to
upgrade functionality by modifying pathgen() and so forth.  If a manroot
isn't parsed from the "manpath=", results are always empty.

Modified Files:
--------------
    mdocml:
        cgi.c

Revision Data
-------------
Index: cgi.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/cgi.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -Lcgi.c -Lcgi.c -u -p -r1.25 -r1.26
--- cgi.c
+++ cgi.c
@@ -67,6 +67,7 @@ struct	query {
 	const char	*arch; /* architecture */
 	const char	*sec; /* manual section */
 	const char	*expr; /* unparsed expression string */
+	int		 manroot; /* manroot index (or -1)*/
 	int		 whatis; /* whether whatis mode */
 	int		 legacy; /* whether legacy mode */
 };
@@ -85,7 +86,7 @@ static	void		 format(const char *);
 static	void		 html_print(const char *);
 static	void		 html_putchar(char);
 static	int 		 http_decode(char *);
-static	void		 http_parse(struct query *, char *);
+static	void		 http_parse(struct req *, char *);
 static	int		 pathstop(DIR *);
 static	void		 pathgen(DIR *, char *, struct req *);
 static	void		 pg_index(const struct req *, char *);
@@ -182,16 +183,17 @@ html_print(const char *p)
  * uses only GET for simplicity.
  */
 static void
-http_parse(struct query *q, char *p)
+http_parse(struct req *req, char *p)
 {
-	char            *key, *val;
+	char            *key, *val, *manroot;
 	size_t		 sz;
-	int		 legacy;
+	int		 i, legacy;
 
-	memset(q, 0, sizeof(struct query));
+	memset(&req->q, 0, sizeof(struct query));
 
-	q->whatis = 1;
+	req->q.whatis = 1;
 	legacy = -1;
+	manroot = NULL;
 
 	while (p && '\0' != *p) {
 		while (' ' == *p)
@@ -232,29 +234,31 @@ http_parse(struct query *q, char *p)
 			break;
 
 		if (0 == strcmp(key, "expr"))
-			q->expr = val;
+			req->q.expr = val;
 		else if (0 == strcmp(key, "query"))
-			q->expr = val;
+			req->q.expr = val;
 		else if (0 == strcmp(key, "sec"))
-			q->sec = val;
+			req->q.sec = val;
 		else if (0 == strcmp(key, "sektion"))
-			q->sec = val;
+			req->q.sec = val;
 		else if (0 == strcmp(key, "arch"))
-			q->arch = val;
+			req->q.arch = val;
+		else if (0 == strcmp(key, "manpath"))
+			manroot = val;
 		else if (0 == strcmp(key, "apropos"))
 			legacy = 0 == strcmp(val, "0");
 		else if (0 == strcmp(key, "op"))
-			q->whatis = 0 == strcasecmp(val, "whatis");
+			req->q.whatis = 0 == strcasecmp(val, "whatis");
 	}
 
 	/* Test for old man.cgi compatibility mode. */
 
 	if (legacy == 0) {
-		q->whatis = 0;
-		q->legacy = 1;
+		req->q.whatis = 0;
+		req->q.legacy = 1;
 	} else if (legacy > 0) {
-		q->legacy = 1;
-		q->whatis = 1;
+		req->q.legacy = 1;
+		req->q.whatis = 1;
 	}
 
 	/* 
@@ -262,12 +266,21 @@ http_parse(struct query *q, char *p)
 	 * For some man.cgi scripts, "default" arch is none.
 	 */
 
-	if (q->legacy && NULL != q->sec)
-		if (0 == strcmp(q->sec, "0"))
-			q->sec = NULL;
-	if (q->legacy && NULL != q->arch)
-		if (0 == strcmp(q->arch, "default"))
-			q->arch = NULL;
+	if (req->q.legacy && NULL != req->q.sec)
+		if (0 == strcmp(req->q.sec, "0"))
+			req->q.sec = NULL;
+	if (req->q.legacy && NULL != req->q.arch)
+		if (0 == strcmp(req->q.arch, "default"))
+			req->q.arch = NULL;
+
+	/* Default to first manroot. */
+
+	if (NULL != manroot) {
+		for (i = 0; i < (int)req->psz; i++)
+			if (0 == strcmp(req->p[i].name, manroot))
+				break;
+		req->q.manroot = i < (int)req->psz ? i : -1;
+	}
 }
 
 /*
@@ -486,12 +499,15 @@ resp_search(struct res *r, size_t sz, vo
 	puts("<P></P>\n"
 	     "<TABLE>");
 
+	assert(req->q.manroot >= 0);
 	for (i = 0; i < (int)sz; i++) {
 		printf("<TR>\n"
 		       "<TD CLASS=\"title\">\n"
 		       "<A HREF=\"");
 		html_print(progname);
-		printf("/show/0/%u/%u.html\">", r[i].volume, r[i].rec);
+		printf("/show/%d/%u/%u.html\">", 
+				req->q.manroot,
+				r[i].volume, r[i].rec);
 		html_print(r[i].title);
 		putchar('(');
 		html_print(r[i].cat);
@@ -751,7 +767,7 @@ pg_show(const struct req *req, char *pat
 	}
 
 	/*
-	 * Begin by chdir()ing into the root of the manpath.
+	 * Begin by chdir()ing into the manroot.
 	 * This way we can pick up the database files, which are
 	 * relative to the manpath root.
 	 */
@@ -821,7 +837,7 @@ pg_search(const struct req *req, char *p
 	struct opts	  opt;
 	struct expr	 *expr;
 
-	if (0 == req->psz) {
+	if (req->q.manroot < 0) {
 		resp_search(NULL, 0, (void *)req);
 		return;
 	}
@@ -841,8 +857,9 @@ pg_search(const struct req *req, char *p
 	 * relative to the manpath root.
 	 */
 
-	if (-1 == (chdir(req->p[0].path))) {
-		perror(req->p[0].path);
+	assert(req->q.manroot < (int)req->psz);
+	if (-1 == (chdir(req->p[req->q.manroot].path))) {
+		perror(req->p[req->q.manroot].path);
 		resp_search(NULL, 0, (void *)req);
 		return;
 	}
@@ -946,7 +963,7 @@ main(void)
 	/* Next parse out the query string. */
 
 	if (NULL != (p = getenv("QUERY_STRING")))
-		http_parse(&req.q, p);
+		http_parse(&req, p);
 
 	/*
 	 * Now juggle paths to extract information.
--
 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-12-10 22:45 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-10 22:45 mdocml: Switch on "manpath=" handling, which I call the "manroot" (as 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).