aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/cgi.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgi.c')
-rw-r--r--cgi.c75
1 files changed, 46 insertions, 29 deletions
diff --git a/cgi.c b/cgi.c
index 6a813a8f..f3dff9fe 100644
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-/* $Id: cgi.c,v 1.25 2011/12/10 22:20:59 kristaps Exp $ */
+/* $Id: cgi.c,v 1.26 2011/12/10 22:45:47 kristaps Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -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.