=================================================================== RCS file: /cvs/mandoc/cgi.c,v retrieving revision 1.125 retrieving revision 1.128 diff -u -p -r1.125 -r1.128 --- mandoc/cgi.c 2016/04/15 00:51:59 1.125 +++ mandoc/cgi.c 2016/04/15 16:42:52 1.128 @@ -1,4 +1,4 @@ -/* $Id: cgi.c,v 1.125 2016/04/15 00:51:59 schwarze Exp $ */ +/* $Id: cgi.c,v 1.128 2016/04/15 16:42:52 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2014, 2015, 2016 Ingo Schwarze @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -341,14 +342,14 @@ resp_begin_html(int code, const char *msg) resp_begin_http(code, msg); printf("\n" - "\n" - "\n" - "\n" - "\n" - "%s\n" - "\n" - "\n" + "\n" + "\n" + "\n" + "\n" + "%s\n" + "\n" + "\n" "\n", CSS_DIR, CUSTOMIZE_TITLE); @@ -361,8 +362,8 @@ resp_end_html(void) resp_copy(MAN_DIR "/footer.html"); - puts("\n" - ""); + puts("\n" + ""); } static void @@ -371,93 +372,93 @@ resp_searchform(const struct req *req) int i; puts(""); - printf("
\n" - "
\n" - "
\n" - "Manual Page Search Parameters\n", + printf("
\n" + "\n" + "
\n" + "Manual Page Search Parameters\n", scriptname); /* Write query input box. */ - printf( "
\n" - "
\n" + "q.query) html_print(req->q.query); - puts("\" SIZE=\"40\">"); + puts("\" size=\"40\">"); /* Write submission and reset buttons. */ - printf( "\n" - "\n"); + printf( "\n" + "\n"); /* Write show radio button */ - printf( "\n" - "\n" + "q.equal) - printf("CHECKED=\"checked\" "); - printf( "NAME=\"apropos\" ID=\"show\" VALUE=\"0\">\n" - "\n"); + printf("checked=\"checked\" "); + printf( "name=\"apropos\" id=\"show\" value=\"0\">\n" + "\n"); /* Write section selector. */ - puts( "
\n" - "
\n" + ""); + puts(""); /* Write architecture selector. */ - printf( ""); + puts(""); /* Write manpath selector. */ if (req->psz > 1) { - puts(""); for (i = 0; i < (int)req->psz; i++) { - printf(""); + puts(""); } - puts(""); + puts(""); } /* Write search radio button */ - printf( "\n" - "\n" + "q.equal) - printf("CHECKED=\"checked\" "); - printf( "NAME=\"apropos\" ID=\"search\" VALUE=\"1\">\n" - "\n"); + printf("checked=\"checked\" "); + printf( "name=\"apropos\" id=\"search\" value=\"1\">\n" + "\n"); - puts("
\n" - "
\n" - "\n" - "
"); + puts("\n" + "
\n" + "\n" + "
"); puts(""); } @@ -507,13 +508,13 @@ pg_index(const struct req *req) resp_begin_html(200, NULL); resp_searchform(req); - printf("

\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" - "

\n", + "

\n", scriptname, *scriptname == '\0' ? "" : "/", scriptname, *scriptname == '\0' ? "" : "/"); resp_end_html(); @@ -524,9 +525,9 @@ pg_noresult(const struct req *req, const char *msg) { resp_begin_html(200, NULL); resp_searchform(req); - puts("

"); + puts("

"); puts(msg); - puts("

"); + puts("

"); resp_end_html(); } @@ -535,12 +536,12 @@ pg_error_badrequest(const char *msg) { resp_begin_html(400, "Bad Request"); - puts("

Bad Request

\n" - "

\n"); + puts("

Bad Request

\n" + "

\n"); puts(msg); printf("Try again from the\n" - "main page.\n" - "

", scriptname); + "main page.\n" + "

", scriptname); resp_end_html(); } @@ -548,7 +549,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(); } @@ -564,7 +565,7 @@ pg_searchres(const struct req *req, struct manpage *r, for (i = 0; i < sz; i++) { if (validate_filename(r[i].file)) continue; - fprintf(stderr, "invalid filename %s in %s database\n", + warnx("invalid filename %s in %s database", r[i].file, req->q.manpath); pg_error_internal(); return; @@ -590,27 +591,27 @@ pg_searchres(const struct req *req, struct manpage *r, resp_searchform(req); if (sz > 1) { - puts("
"); - puts(""); + puts("
"); + puts("
"); for (i = 0; i < sz; i++) { - printf("\n" - "\n" - "\n" + "\n" - ""); + puts("\n" + ""); } - puts("
\n" - "\n" + "\n" + "q.manpath, r[i].file); printf("\">"); html_print(r[i].names); - printf("\n" - ""); + printf("\n" + ""); html_print(r[i].output); - puts("
\n" - "
"); + puts("\n" + ""); } /* @@ -619,7 +620,7 @@ pg_searchres(const struct req *req, struct manpage *r, */ if (req->q.equal || sz == 1) { - puts("
"); + puts("
"); iuse = 0; priouse = 20; archpriouse = 3; @@ -670,12 +671,12 @@ catman(const struct req *req, const char *file) int italic, bold; if ((f = fopen(file, "r")) == NULL) { - puts("

You specified an invalid manual file.

"); + puts("

You specified an invalid manual file.

"); return; } - puts("
\n" - "
");
+	puts("
\n" + "
");
 
 	p = NULL;
 	sz = 0;
@@ -701,9 +702,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;
@@ -714,9 +715,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;
@@ -738,9 +739,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;
@@ -752,9 +753,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;
@@ -764,9 +765,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;
@@ -779,9 +780,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]);
@@ -790,8 +791,8 @@ catman(const struct req *req, const char *file)
 	}
 	free(p);
 
-	puts("
\n" - "
"); + puts("
\n" + "
"); fclose(f); } @@ -807,7 +808,7 @@ format(const struct req *req, const char *file) int usepath; if (-1 == (fd = open(file, O_RDONLY, 0))) { - puts("

You specified an invalid manual file.

"); + puts("

You specified an invalid manual file.

"); return; } @@ -824,8 +825,7 @@ format(const struct req *req, const char *file) mparse_result(mp, &man, NULL); if (man == NULL) { - fprintf(stderr, "fatal mandoc error: %s/%s\n", - req->q.manpath, file); + warnx("fatal mandoc error: %s/%s", req->q.manpath, file); pg_error_internal(); mparse_free(mp); mchars_free(); @@ -889,8 +889,7 @@ pg_show(struct req *req, const char *fullpath) */ if (chdir(manpath) == -1) { - fprintf(stderr, "chdir %s: %s\n", - manpath, strerror(errno)); + warn("chdir %s", manpath); pg_error_internal(); free(manpath); return; @@ -931,9 +930,8 @@ pg_search(const struct req *req) * relative to the manpath root. */ - if (-1 == (chdir(req->q.manpath))) { - fprintf(stderr, "chdir %s: %s\n", - req->q.manpath, strerror(errno)); + if (chdir(req->q.manpath) == -1) { + warn("chdir %s", req->q.manpath); pg_error_internal(); return; } @@ -1008,7 +1006,7 @@ main(void) itimer.it_interval.tv_sec = 2; itimer.it_interval.tv_usec = 0; if (setitimer(ITIMER_VIRTUAL, &itimer, NULL) == -1) { - fprintf(stderr, "setitimer: %s\n", strerror(errno)); + warn("setitimer"); pg_error_internal(); return EXIT_FAILURE; } @@ -1019,9 +1017,8 @@ main(void) * relative to the same position. */ - if (-1 == chdir(MAN_DIR)) { - fprintf(stderr, "MAN_DIR: %s: %s\n", - MAN_DIR, strerror(errno)); + if (chdir(MAN_DIR) == -1) { + warn("MAN_DIR: %s", MAN_DIR); pg_error_internal(); return EXIT_FAILURE; } @@ -1085,7 +1082,7 @@ main(void) static void path_parse(struct req *req, const char *path) { - int dir_done; + char *dir; req->isquery = 0; req->q.equal = 1; @@ -1115,23 +1112,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); } } @@ -1146,9 +1139,8 @@ pathgen(struct req *req) size_t dpsz; ssize_t len; - if (NULL == (fp = fopen("manpath.conf", "r"))) { - fprintf(stderr, "%s/manpath.conf: %s\n", - MAN_DIR, strerror(errno)); + if ((fp = fopen("manpath.conf", "r")) == NULL) { + warn("%s/manpath.conf", MAN_DIR); pg_error_internal(); exit(EXIT_FAILURE); } @@ -1162,14 +1154,14 @@ pathgen(struct req *req) req->p = mandoc_realloc(req->p, (req->psz + 1) * sizeof(char *)); if ( ! validate_urifrag(dp)) { - fprintf(stderr, "%s/manpath.conf contains " - "unsafe path \"%s\"\n", MAN_DIR, dp); + warnx("%s/manpath.conf contains " + "unsafe path \"%s\"", MAN_DIR, dp); pg_error_internal(); exit(EXIT_FAILURE); } - if (NULL != strchr(dp, '/')) { - fprintf(stderr, "%s/manpath.conf contains " - "path with slash \"%s\"\n", MAN_DIR, dp); + if (strchr(dp, '/') != NULL) { + warnx("%s/manpath.conf contains " + "path with slash \"%s\"", MAN_DIR, dp); pg_error_internal(); exit(EXIT_FAILURE); } @@ -1179,8 +1171,8 @@ pathgen(struct req *req) } free(dp); - if ( req->p == NULL ) { - fprintf(stderr, "%s/manpath.conf is empty\n", MAN_DIR); + if (req->p == NULL) { + warnx("%s/manpath.conf is empty", MAN_DIR); pg_error_internal(); exit(EXIT_FAILURE); }