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