===================================================================
RCS file: /cvs/mandoc/cgi.c,v
retrieving revision 1.119
retrieving revision 1.127
diff -u -p -r1.119 -r1.127
--- mandoc/cgi.c 2016/03/18 13:22:27 1.119
+++ mandoc/cgi.c 2016/04/15 15:13:07 1.127
@@ -1,4 +1,4 @@
-/* $Id: cgi.c,v 1.119 2016/03/18 13:22:27 schwarze Exp $ */
+/* $Id: cgi.c,v 1.127 2016/04/15 15:13:07 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012 Kristaps Dzonsons \n"
+ printf(" \n"
"This web interface is documented in the\n"
- "man.cgi\n"
+ "man.cgi\n"
"manual, and the\n"
- "apropos\n"
+ "apropos\n"
"manual explains the query syntax.\n"
- "
"); + puts("
"); puts(msg); - puts("
"); + puts(""); resp_end_html(); } @@ -533,12 +535,12 @@ pg_error_badrequest(const char *msg) { resp_begin_html(400, "Bad Request"); - puts("\n"); + puts("
\n"); puts(msg); printf("Try again from the\n" - "main page.\n" - "
", scriptname); + "main page.\n" + "", scriptname); resp_end_html(); } @@ -546,7 +548,7 @@ static void pg_error_internal(void) { resp_begin_html(500, "Internal Server Error"); - puts("Internal Server Error
"); + puts("Internal Server Error
"); resp_end_html(); } @@ -554,10 +556,10 @@ static void pg_searchres(const struct req *req, struct manpage *r, size_t sz) { char *arch, *archend; - size_t i, iuse, isec; + const char *sec; + size_t i, iuse; int archprio, archpriouse; int prio, priouse; - char sec; for (i = 0; i < sz; i++) { if (validate_filename(r[i].file)) @@ -568,7 +570,7 @@ pg_searchres(const struct req *req, struct manpage *r, return; } - if (1 == sz) { + if (req->isquery && sz == 1) { /* * If we have just one result, then jump there now * without any delay. @@ -586,50 +588,55 @@ pg_searchres(const struct req *req, struct manpage *r, resp_begin_html(200, NULL); resp_searchform(req); - puts("\n" - "q.manpath, r[i].file); - printf("\">"); - html_print(r[i].names); - printf("\n" - " | \n" - ""); - html_print(r[i].output); - puts(" | \n" - "
You specified an invalid manual file.
"); + puts("You specified an invalid manual file.
"); return; } - puts(""); + puts("\n" + "\n" + ""); + puts(""); p = NULL; sz = 0; @@ -694,9 +701,9 @@ catman(const struct req *req, const char *file) if ('\b' != p[i + 1]) { if (italic) - printf(""); + printf(""); if (bold) - printf(""); + printf(""); italic = bold = 0; html_putchar(p[i]); continue; @@ -707,9 +714,9 @@ catman(const struct req *req, const char *file) if ('_' == p[i]) { if (bold) - printf(""); + printf(""); if ( ! italic) - printf(""); + printf(""); bold = 0; italic = 1; i += 2; @@ -731,9 +738,9 @@ catman(const struct req *req, const char *file) ('*' == p[i] && '|' == p[i + 2]) || ('|' == p[i] && '*' == p[i + 2])) { if (italic) - printf(""); + printf(""); if (bold) - printf(""); + printf(""); italic = bold = 0; putchar('*'); i += 2; @@ -745,9 +752,9 @@ catman(const struct req *req, const char *file) ('+' == p[i] && '|' == p[i + 1]) || ('|' == p[i] && '+' == p[i + 1])) { if (italic) - printf(""); + printf(""); if (bold) - printf(""); + printf(""); italic = bold = 0; putchar('+'); i += 2; @@ -757,9 +764,9 @@ catman(const struct req *req, const char *file) /* Bold mode. */ if (italic) - printf(""); + printf(""); if ( ! bold) - printf(""); + printf(""); bold = 1; italic = 0; i += 2; @@ -772,9 +779,9 @@ catman(const struct req *req, const char *file) */ if (italic) - printf(""); + printf(""); if (bold) - printf(""); + printf(""); if (i == len - 1 && p[i] != '\n') html_putchar(p[i]); @@ -783,8 +790,8 @@ catman(const struct req *req, const char *file) } free(p); - puts("\n" - "
You specified an invalid manual file.
"); + puts("You specified an invalid manual file.
"); return; } @@ -812,12 +819,8 @@ format(const struct req *req, const char *file) memset(&conf, 0, sizeof(conf)); conf.fragment = 1; usepath = strcmp(req->q.manpath, req->p[0]); - mandoc_asprintf(&conf.man, "/%s?query=%%N&sec=%%S%s%s%s%s", - scriptname, - req->q.arch ? "&arch=" : "", - req->q.arch ? req->q.arch : "", - usepath ? "&manpath=" : "", - usepath ? req->q.manpath : ""); + mandoc_asprintf(&conf.man, "/%s%s%%N.%%S", + usepath ? req->q.manpath : "", usepath ? "/" : ""); mparse_result(mp, &man, NULL); if (man == NULL) { @@ -1034,9 +1037,10 @@ main(void) else if (*path == '/') path++; - if (*path != '\0' && access(path, F_OK) == -1) { + if (*path != '\0') { path_parse(&req, path); - path = ""; + if (access(path, F_OK) == -1) + path = ""; } else if ((querystring = getenv("QUERY_STRING")) != NULL) http_parse(&req, querystring); @@ -1081,8 +1085,9 @@ main(void) static void path_parse(struct req *req, const char *path) { - int dir_done; + char *dir; + req->isquery = 0; req->q.equal = 1; req->q.manpath = mandoc_strdup(path); @@ -1110,23 +1115,19 @@ path_parse(struct req *req, const char *path) req->q.query = mandoc_strdup(req->q.query); /* Optional architecture. */ - dir_done = 0; - for (;;) { - if ((req->q.arch = strrchr(req->q.manpath, '/')) == NULL) - break; - *req->q.arch++ = '\0'; - if (dir_done || strncmp(req->q.arch, "man", 3)) { - req->q.arch = mandoc_strdup(req->q.arch); - break; - } + dir = strrchr(req->q.manpath, '/'); + if (dir != NULL && strncmp(dir + 1, "man", 3) != 0) { + *dir++ = '\0'; + req->q.arch = mandoc_strdup(dir); + dir = strrchr(req->q.manpath, '/'); + } else + req->q.arch = NULL; - /* Optional directory name. */ - req->q.arch += 3; - if (*req->q.arch != '\0') { - free(req->q.sec); - req->q.sec = mandoc_strdup(req->q.arch); - } - dir_done = 1; + /* Optional directory name. */ + if (dir != NULL && strncmp(dir + 1, "man", 3) == 0) { + *dir++ = '\0'; + free(req->q.sec); + req->q.sec = mandoc_strdup(dir + 3); } }