summaryrefslogtreecommitdiffstats
path: root/cgi.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-12-10 22:45:47 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-12-10 22:45:47 +0000
commite71b7d0b4e0dbe63f42eb1b7b586c6f3175f07f1 (patch)
tree1f61a00de546886bcfea25ae36e4cc6b7fad3db2 /cgi.c
parent339c7839f2337f21101971fc34ddb9f7d0e1c096 (diff)
downloadmandoc-e71b7d0b4e0dbe63f42eb1b7b586c6f3175f07f1.tar.gz
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.
Diffstat (limited to 'cgi.c')
-rw-r--r--cgi.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/cgi.c b/cgi.c
index 89f8a22c..e82e61eb 100644
--- a/cgi.c
+++ b/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, void *arg)
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 *path)
}
/*
- * 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 *path)
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 *path)
* 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.