=================================================================== RCS file: /cvs/mandoc/cgi.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -p -r1.25 -r1.26 --- mandoc/cgi.c 2011/12/10 22:20:59 1.25 +++ mandoc/cgi.c 2011/12/10 22:45:47 1.26 @@ -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 * @@ -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("

\n" ""); + assert(req->q.manroot >= 0); for (i = 0; i < (int)sz; i++) { printf("\n" "
\n" "", 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.