aboutsummaryrefslogtreecommitdiffstatshomepage
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
commit876bce67dbedbec3c6aba7e84e4fdb8c8c7a91c5 (patch)
tree93ec3b02511d2e47eedd90ee2e02ef1446a3d589 /cgi.c
parentaf1638d4475c42ff93ccb855b28749c78603683d (diff)
downloadmandoc-876bce67dbedbec3c6aba7e84e4fdb8c8c7a91c5.tar.gz
mandoc-876bce67dbedbec3c6aba7e84e4fdb8c8c7a91c5.tar.zst
mandoc-876bce67dbedbec3c6aba7e84e4fdb8c8c7a91c5.zip
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.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.