summaryrefslogtreecommitdiffstats
path: root/cgi.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-07-13 12:31:23 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-07-13 12:31:23 +0000
commitaabf34b70e1e4378769faad6048e6c236cf7368f (patch)
tree59b851920d417e670caab1837fa00bc22210d0d5 /cgi.c
parent047cc3791c28c9f600830c6fde3a41aa96e4f838 (diff)
downloadmandoc-aabf34b70e1e4378769faad6048e6c236cf7368f.tar.gz
By popular demand, bring man.cgi default mode closer to what man(1) does:
Even when there are multiple pages with the same name in different sections, show one of them, using the same priorities as in the default man.conf(5) file.
Diffstat (limited to 'cgi.c')
-rw-r--r--cgi.c66
1 files changed, 46 insertions, 20 deletions
diff --git a/cgi.c b/cgi.c
index 3948acb7..a95ab464 100644
--- a/cgi.c
+++ b/cgi.c
@@ -77,10 +77,12 @@ static void resp_noresult(const struct req *,
static void resp_search(const struct req *,
struct manpage *, size_t);
static void resp_searchform(const struct req *);
+static void resp_show(const struct req *, const char *);
static const char *scriptname; /* CGI script name */
static const char *httphost; /* hostname used in the URIs */
+static const int sec_prios[] = {1, 4, 5, 8, 6, 3, 7, 2, 9};
static const char *const sec_numbers[] = {
"0", "1", "2", "3", "3p", "4", "5", "6", "7", "8", "9"
};
@@ -508,7 +510,9 @@ resp_error_internal(void)
static void
resp_search(const struct req *req, struct manpage *r, size_t sz)
{
- size_t i;
+ size_t i, iuse, isec;
+ int prio, priouse;
+ char sec;
if (1 == sz) {
/*
@@ -550,6 +554,30 @@ resp_search(const struct req *req, struct manpage *r, size_t sz)
puts("</TABLE>\n"
"</DIV>");
+
+ /*
+ * In man(1) mode, show one of the pages
+ * even if more than one is found.
+ */
+
+ if (req->q.equal) {
+ puts("<HR>");
+ iuse = 0;
+ priouse = 10;
+ for (i = 0; i < sz; i++) {
+ isec = strcspn(r[i].file, "123456789");
+ sec = r[i].file[isec];
+ if ('\0' == sec)
+ continue;
+ prio = sec_prios[sec - '1'];
+ if (prio >= priouse)
+ continue;
+ priouse = prio;
+ iuse = i;
+ }
+ resp_show(req, r[iuse].file);
+ }
+
resp_end_html();
}
@@ -563,13 +591,10 @@ catman(const struct req *req, const char *file)
int italic, bold;
if (NULL == (f = fopen(file, "r"))) {
- resp_error_badrequest(
- "You specified an invalid manual file.");
+ puts("<P>You specified an invalid manual file.</P>");
return;
}
- resp_begin_html(200, NULL);
- resp_searchform(req);
puts("<DIV CLASS=\"catman\">\n"
"<PRE>");
@@ -683,9 +708,7 @@ catman(const struct req *req, const char *file)
}
puts("</PRE>\n"
- "</DIV>\n"
- "</BODY>\n"
- "</HTML>");
+ "</DIV>");
fclose(f);
}
@@ -702,8 +725,7 @@ format(const struct req *req, const char *file)
char opts[PATH_MAX + 128];
if (-1 == (fd = open(file, O_RDONLY, 0))) {
- resp_error_badrequest(
- "You specified an invalid manual file.");
+ puts("<P>You specified an invalid manual file.</P>");
return;
}
@@ -732,9 +754,6 @@ format(const struct req *req, const char *file)
return;
}
- resp_begin_html(200, NULL);
- resp_searchform(req);
-
vp = html_alloc(opts);
if (NULL != mdoc)
@@ -742,14 +761,21 @@ format(const struct req *req, const char *file)
else
html_man(vp, man);
- puts("</BODY>\n"
- "</HTML>");
-
html_free(vp);
mparse_free(mp);
}
static void
+resp_show(const struct req *req, const char *file)
+{
+
+ if ('c' == *file)
+ catman(req, file);
+ else
+ format(req, file);
+}
+
+static void
pg_show(const struct req *req, const char *path)
{
char *sub;
@@ -773,10 +799,10 @@ pg_show(const struct req *req, const char *path)
return;
}
- if ('c' == *sub)
- catman(req, sub);
- else
- format(req, sub);
+ resp_begin_html(200, NULL);
+ resp_searchform(req);
+ resp_show(req, sub);
+ resp_end_html();
}
static void