===================================================================
RCS file: /cvs/mandoc/cgi.c,v
retrieving revision 1.117
retrieving revision 1.126
diff -u -p -r1.117 -r1.126
--- mandoc/cgi.c 2016/03/17 21:22:59 1.117
+++ mandoc/cgi.c 2016/04/15 01:34:51 1.126
@@ -1,7 +1,7 @@
-/* $Id: cgi.c,v 1.117 2016/03/17 21:22:59 schwarze Exp $ */
+/* $Id: cgi.c,v 1.126 2016/04/15 01:34:51 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(); } @@ -532,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(); } @@ -545,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(); } @@ -553,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)) @@ -567,14 +570,16 @@ 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. */ printf("Status: 303 See Other\r\n"); - printf("Location: http://%s%s/%s/%s", - HTTP_HOST, scriptname, req->q.manpath, r[0].file); + printf("Location: http://%s/%s%s%s/%s", + HTTP_HOST, scriptname, + *scriptname == '\0' ? "" : "/", + req->q.manpath, r[0].file); printf("\r\n" "Content-Type: text/html; charset=utf-8\r\n" "\r\n"); @@ -583,49 +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; @@ -690,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; @@ -703,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; @@ -727,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; @@ -741,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; @@ -753,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; @@ -768,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]); @@ -779,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; } @@ -808,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) { @@ -1006,18 +1013,6 @@ main(void) return EXIT_FAILURE; } - /* Scan our run-time environment. */ - - if (NULL == (scriptname = getenv("SCRIPT_NAME"))) - scriptname = ""; - - if ( ! validate_urifrag(scriptname)) { - fprintf(stderr, "unsafe SCRIPT_NAME \"%s\"\n", - scriptname); - pg_error_internal(); - return EXIT_FAILURE; - } - /* * First we change directory into the MAN_DIR so that * subsequent scanning for manpath directories is rooted @@ -1032,6 +1027,7 @@ main(void) } memset(&req, 0, sizeof(struct req)); + req.q.equal = 1; pathgen(&req); /* Parse the path info and the query string. */ @@ -1041,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); @@ -1090,6 +1087,7 @@ path_parse(struct req *req, const char *path) { int dir_done; + req->isquery = 0; req->q.equal = 1; req->q.manpath = mandoc_strdup(path);