diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-10 22:45:47 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-10 22:45:47 +0000 |
commit | e71b7d0b4e0dbe63f42eb1b7b586c6f3175f07f1 (patch) | |
tree | 1f61a00de546886bcfea25ae36e4cc6b7fad3db2 /cgi.c | |
parent | 339c7839f2337f21101971fc34ddb9f7d0e1c096 (diff) | |
download | mandoc-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.c | 73 |
1 files changed, 45 insertions, 28 deletions
@@ -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. |