summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc/cgi.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2022-07-05 14:03:36 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2022-07-05 14:03:36 +0000
commit392cb2fcdec20c53f29dc0165ae9f1cbc5a3cd6e (patch)
treece54146a49c35c1d6b7d9a5ec0934193e7415cfa /usr.bin/mandoc/cgi.c
parent748e8a8abc0095b1f3fbe975474f4ea9087405ba (diff)
Somehow, the content of header.html ended up
before and outside the <header> element. Fix this by moving it into the <header> element where it belongs. While here, also wrap footer.html in a <footer> element.
Diffstat (limited to 'usr.bin/mandoc/cgi.c')
-rw-r--r--usr.bin/mandoc/cgi.c74
1 files changed, 43 insertions, 31 deletions
diff --git a/usr.bin/mandoc/cgi.c b/usr.bin/mandoc/cgi.c
index a23cdfcee81..0b941b6463d 100644
--- a/usr.bin/mandoc/cgi.c
+++ b/usr.bin/mandoc/cgi.c
@@ -1,6 +1,6 @@
-/* $OpenBSD: cgi.c,v 1.116 2022/07/04 16:20:09 schwarze Exp $ */
+/* $OpenBSD: cgi.c,v 1.117 2022/07/05 14:03:35 schwarze Exp $ */
/*
- * Copyright (c) 2014-2019, 2021 Ingo Schwarze <schwarze@usta.de>
+ * Copyright (c) 2014-2019, 2021, 2022 Ingo Schwarze <schwarze@usta.de>
* Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2022 Anna Vyalkova <cyber@sysrq.in>
*
@@ -83,10 +83,10 @@ static void pg_search(const struct req *);
static void pg_searchres(const struct req *,
struct manpage *, size_t);
static void pg_show(struct req *, const char *);
-static void resp_begin_html(int, const char *, const char *);
+static int resp_begin_html(int, const char *, const char *);
static void resp_begin_http(int, const char *);
static void resp_catman(const struct req *, const char *);
-static void resp_copy(const char *);
+static int resp_copy(const char *, const char *);
static void resp_end_html(void);
static void resp_format(const struct req *, const char *);
static void resp_searchform(const struct req *, enum focus);
@@ -349,22 +349,26 @@ resp_begin_http(int code, const char *msg)
fflush(stdout);
}
-static void
-resp_copy(const char *filename)
+static int
+resp_copy(const char *element, const char *filename)
{
char buf[4096];
ssize_t sz;
int fd;
- if ((fd = open(filename, O_RDONLY)) != -1) {
- fflush(stdout);
- while ((sz = read(fd, buf, sizeof(buf))) > 0)
- write(STDOUT_FILENO, buf, sz);
- close(fd);
- }
+ if ((fd = open(filename, O_RDONLY)) == -1)
+ return 0;
+
+ if (element != NULL)
+ printf("<%s>\n", element);
+ fflush(stdout);
+ while ((sz = read(fd, buf, sizeof(buf))) > 0)
+ write(STDOUT_FILENO, buf, sz);
+ close(fd);
+ return 1;
}
-static void
+static int
resp_begin_html(int code, const char *msg, const char *file)
{
const char *name, *sec, *cp;
@@ -410,14 +414,14 @@ resp_begin_html(int code, const char *msg, const char *file)
"<body>\n",
CUSTOMIZE_TITLE);
- resp_copy(MAN_DIR "/header.html");
+ return resp_copy("header", MAN_DIR "/header.html");
}
static void
resp_end_html(void)
{
-
- resp_copy(MAN_DIR "/footer.html");
+ if (resp_copy("footer", MAN_DIR "/footer.html"))
+ puts("</footer>");
puts("</body>\n"
"</html>");
@@ -428,8 +432,7 @@ resp_searchform(const struct req *req, enum focus focus)
{
int i;
- printf("<header>\n"
- "<form role=\"search\" action=\"/%s\" method=\"get\" "
+ printf("<form role=\"search\" action=\"/%s\" method=\"get\" "
"autocomplete=\"off\" autocapitalize=\"none\">\n"
" <fieldset>\n"
" <legend>Manual Page Search Parameters</legend>\n",
@@ -497,8 +500,7 @@ resp_searchform(const struct req *req, enum focus focus)
}
puts(" </fieldset>\n"
- "</form>\n"
- "</header>");
+ "</form>");
}
static int
@@ -553,10 +555,11 @@ validate_filename(const char *file)
static void
pg_index(const struct req *req)
{
-
- resp_begin_html(200, NULL, NULL);
+ if (resp_begin_html(200, NULL, NULL) == 0)
+ puts("<header>");
resp_searchform(req, FOCUS_QUERY);
- printf("<main>\n"
+ printf("</header>\n"
+ "<main>\n"
"<p role=\"doc-notice\" aria-label=\"usage\">\n"
"This web interface is documented in the\n"
"<a class=\"Xr\" href=\"/%s%sman.cgi.8\""
@@ -576,8 +579,10 @@ static void
pg_noresult(const struct req *req, int code, const char *http_msg,
const char *user_msg)
{
- resp_begin_html(code, http_msg, NULL);
+ if (resp_begin_html(code, http_msg, NULL) == 0)
+ puts("<header>");
resp_searchform(req, FOCUS_QUERY);
+ puts("</header>");
puts("<main>");
puts("<p role=\"doc-notice\" aria-label=\"no result\">");
puts(user_msg);
@@ -589,8 +594,8 @@ pg_noresult(const struct req *req, int code, const char *http_msg,
static void
pg_error_badrequest(const char *msg)
{
-
- resp_begin_html(400, "Bad Request", NULL);
+ if (resp_begin_html(400, "Bad Request", NULL))
+ puts("</header>");
puts("<main>\n"
"<h1>Bad Request</h1>\n"
"<p role=\"doc-notice\" aria-label=\"Bad Request\">");
@@ -598,14 +603,15 @@ pg_error_badrequest(const char *msg)
printf("Try again from the\n"
"<a href=\"/%s\">main page</a>.\n"
"</p>\n"
- "</main>", scriptname);
+ "</main>\n", scriptname);
resp_end_html();
}
static void
pg_error_internal(void)
{
- resp_begin_html(500, "Internal Server Error", NULL);
+ if (resp_begin_html(500, "Internal Server Error", NULL))
+ puts("</header>");
puts("<main><p role=\"doc-notice\">Internal Server Error</p></main>");
resp_end_html();
}
@@ -637,6 +643,7 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
size_t i, iuse;
int archprio, archpriouse;
int prio, priouse;
+ int have_header;
for (i = 0; i < sz; i++) {
if (validate_filename(r[i].file))
@@ -703,12 +710,15 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
priouse = prio;
iuse = i;
}
- resp_begin_html(200, NULL, r[iuse].file);
+ have_header = resp_begin_html(200, NULL, r[iuse].file);
} else
- resp_begin_html(200, NULL, NULL);
+ have_header = resp_begin_html(200, NULL, NULL);
+ if (have_header == 0)
+ puts("<header>");
resp_searchform(req,
req->q.equal || sz == 1 ? FOCUS_NONE : FOCUS_QUERY);
+ puts("</header>");
if (sz > 1) {
puts("<nav>");
@@ -979,8 +989,10 @@ pg_show(struct req *req, const char *fullpath)
return;
}
- resp_begin_html(200, NULL, file);
+ if (resp_begin_html(200, NULL, file) == 0)
+ puts("<header>");
resp_searchform(req, FOCUS_NONE);
+ puts("</header>");
resp_show(req, file);
resp_end_html();
}