version 1.25, 2011/12/10 22:20:59 |
version 1.27, 2011/12/10 23:04:31 |
|
|
const char *arch; /* architecture */ |
const char *arch; /* architecture */ |
const char *sec; /* manual section */ |
const char *sec; /* manual section */ |
const char *expr; /* unparsed expression string */ |
const char *expr; /* unparsed expression string */ |
|
int manroot; /* manroot index (or -1)*/ |
int whatis; /* whether whatis mode */ |
int whatis; /* whether whatis mode */ |
int legacy; /* whether legacy mode */ |
int legacy; /* whether legacy mode */ |
}; |
}; |
Line 85 static void format(const char *); |
|
Line 86 static void format(const char *); |
|
static void html_print(const char *); |
static void html_print(const char *); |
static void html_putchar(char); |
static void html_putchar(char); |
static int http_decode(char *); |
static int http_decode(char *); |
static void http_parse(struct query *, char *); |
static void http_parse(struct req *, char *); |
static int pathstop(DIR *); |
static int pathstop(DIR *); |
static void pathgen(DIR *, char *, struct req *); |
static void pathgen(DIR *, char *, struct req *); |
static void pg_index(const struct req *, char *); |
static void pg_index(const struct req *, char *); |
Line 182 html_print(const char *p) |
|
Line 183 html_print(const char *p) |
|
* uses only GET for simplicity. |
* uses only GET for simplicity. |
*/ |
*/ |
static void |
static void |
http_parse(struct query *q, char *p) |
http_parse(struct req *req, char *p) |
{ |
{ |
char *key, *val; |
char *key, *val, *manroot; |
size_t sz; |
size_t sz; |
int legacy; |
int i, legacy; |
|
|
memset(q, 0, sizeof(struct query)); |
memset(&req->q, 0, sizeof(struct query)); |
|
|
q->whatis = 1; |
req->q.whatis = 1; |
legacy = -1; |
legacy = -1; |
|
manroot = NULL; |
|
|
while (p && '\0' != *p) { |
while (p && '\0' != *p) { |
while (' ' == *p) |
while (' ' == *p) |
Line 232 http_parse(struct query *q, char *p) |
|
Line 234 http_parse(struct query *q, char *p) |
|
break; |
break; |
|
|
if (0 == strcmp(key, "expr")) |
if (0 == strcmp(key, "expr")) |
q->expr = val; |
req->q.expr = val; |
else if (0 == strcmp(key, "query")) |
else if (0 == strcmp(key, "query")) |
q->expr = val; |
req->q.expr = val; |
else if (0 == strcmp(key, "sec")) |
else if (0 == strcmp(key, "sec")) |
q->sec = val; |
req->q.sec = val; |
else if (0 == strcmp(key, "sektion")) |
else if (0 == strcmp(key, "sektion")) |
q->sec = val; |
req->q.sec = val; |
else if (0 == strcmp(key, "arch")) |
else if (0 == strcmp(key, "arch")) |
q->arch = val; |
req->q.arch = val; |
|
else if (0 == strcmp(key, "manpath")) |
|
manroot = val; |
else if (0 == strcmp(key, "apropos")) |
else if (0 == strcmp(key, "apropos")) |
legacy = 0 == strcmp(val, "0"); |
legacy = 0 == strcmp(val, "0"); |
else if (0 == strcmp(key, "op")) |
else if (0 == strcmp(key, "op")) |
q->whatis = 0 == strcasecmp(val, "whatis"); |
req->q.whatis = 0 == strcasecmp(val, "whatis"); |
} |
} |
|
|
/* Test for old man.cgi compatibility mode. */ |
/* Test for old man.cgi compatibility mode. */ |
|
|
if (legacy == 0) { |
if (legacy == 0) { |
q->whatis = 0; |
req->q.whatis = 0; |
q->legacy = 1; |
req->q.legacy = 1; |
} else if (legacy > 0) { |
} else if (legacy > 0) { |
q->legacy = 1; |
req->q.legacy = 1; |
q->whatis = 1; |
req->q.whatis = 1; |
} |
} |
|
|
/* |
/* |
Line 262 http_parse(struct query *q, char *p) |
|
Line 266 http_parse(struct query *q, char *p) |
|
* For some man.cgi scripts, "default" arch is none. |
* For some man.cgi scripts, "default" arch is none. |
*/ |
*/ |
|
|
if (q->legacy && NULL != q->sec) |
if (req->q.legacy && NULL != req->q.sec) |
if (0 == strcmp(q->sec, "0")) |
if (0 == strcmp(req->q.sec, "0")) |
q->sec = NULL; |
req->q.sec = NULL; |
if (q->legacy && NULL != q->arch) |
if (req->q.legacy && NULL != req->q.arch) |
if (0 == strcmp(q->arch, "default")) |
if (0 == strcmp(req->q.arch, "default")) |
q->arch = NULL; |
req->q.arch = NULL; |
|
|
|
/* Default to first manroot. */ |
|
|
|
if (NULL != manroot) { |
|
for (i = 0; i < (int)req->psz; i++) |
|
if (0 == strcmp(req->p[i].name, manroot)) |
|
break; |
|
req->q.manroot = i < (int)req->psz ? i : -1; |
|
} |
} |
} |
|
|
/* |
/* |
Line 351 resp_end_html(void) |
|
Line 364 resp_end_html(void) |
|
static void |
static void |
resp_searchform(const struct req *req) |
resp_searchform(const struct req *req) |
{ |
{ |
|
int i; |
|
|
puts("<!-- Begin search form. //-->"); |
puts("<!-- Begin search form. //-->"); |
printf("<FORM ACTION=\""); |
printf("<FORM ACTION=\""); |
Line 372 resp_searchform(const struct req *req) |
|
Line 386 resp_searchform(const struct req *req) |
|
"<INPUT TYPE=\"text\"" |
"<INPUT TYPE=\"text\"" |
" SIZE=\"8\" NAME=\"arch\" VALUE=\""); |
" SIZE=\"8\" NAME=\"arch\" VALUE=\""); |
html_print(req->q.arch ? req->q.arch : ""); |
html_print(req->q.arch ? req->q.arch : ""); |
puts("\">.\n" |
printf("\">"); |
|
if (req->psz > 1) { |
|
puts(", <SELECT NAME=\"manpath\">"); |
|
for (i = 0; i < (int)req->psz; i++) { |
|
printf("<OPTION %s VALUE=\"", |
|
(i == req->q.manroot) || |
|
(0 == i && -1 == req->q.manroot) ? |
|
"SELECTED=\"selected\"" : ""); |
|
html_print(req->p[i].name); |
|
printf("\">"); |
|
html_print(req->p[i].name); |
|
puts("</OPTION>"); |
|
} |
|
puts("</SELECT>"); |
|
} |
|
puts(".\n" |
"<INPUT TYPE=\"reset\" VALUE=\"Reset\">\n" |
"<INPUT TYPE=\"reset\" VALUE=\"Reset\">\n" |
"</FIELDSET>\n" |
"</FIELDSET>\n" |
"</FORM>"); |
"</FORM>"); |
Line 486 resp_search(struct res *r, size_t sz, void *arg) |
|
Line 515 resp_search(struct res *r, size_t sz, void *arg) |
|
puts("<P></P>\n" |
puts("<P></P>\n" |
"<TABLE>"); |
"<TABLE>"); |
|
|
|
assert(req->q.manroot >= 0); |
for (i = 0; i < (int)sz; i++) { |
for (i = 0; i < (int)sz; i++) { |
printf("<TR>\n" |
printf("<TR>\n" |
"<TD CLASS=\"title\">\n" |
"<TD CLASS=\"title\">\n" |
"<A HREF=\""); |
"<A HREF=\""); |
html_print(progname); |
html_print(progname); |
printf("/show/0/%u/%u.html\">", r[i].volume, r[i].rec); |
printf("/show/%d/%u/%u.html\">", |
|
req->q.manroot, |
|
r[i].volume, r[i].rec); |
html_print(r[i].title); |
html_print(r[i].title); |
putchar('('); |
putchar('('); |
html_print(r[i].cat); |
html_print(r[i].cat); |
Line 751 pg_show(const struct req *req, char *path) |
|
Line 783 pg_show(const struct req *req, char *path) |
|
} |
} |
|
|
/* |
/* |
* Begin by chdir()ing into the root of the manpath. |
* Begin by chdir()ing into the manroot. |
* This way we can pick up the database files, which are |
* This way we can pick up the database files, which are |
* relative to the manpath root. |
* relative to the manpath root. |
*/ |
*/ |
Line 821 pg_search(const struct req *req, char *path) |
|
Line 853 pg_search(const struct req *req, char *path) |
|
struct opts opt; |
struct opts opt; |
struct expr *expr; |
struct expr *expr; |
|
|
if (0 == req->psz) { |
if (req->q.manroot < 0) { |
resp_search(NULL, 0, (void *)req); |
resp_search(NULL, 0, (void *)req); |
return; |
return; |
} |
} |
Line 841 pg_search(const struct req *req, char *path) |
|
Line 873 pg_search(const struct req *req, char *path) |
|
* relative to the manpath root. |
* relative to the manpath root. |
*/ |
*/ |
|
|
if (-1 == (chdir(req->p[0].path))) { |
assert(req->q.manroot < (int)req->psz); |
perror(req->p[0].path); |
if (-1 == (chdir(req->p[req->q.manroot].path))) { |
|
perror(req->p[req->q.manroot].path); |
resp_search(NULL, 0, (void *)req); |
resp_search(NULL, 0, (void *)req); |
return; |
return; |
} |
} |
|
|
/* Next parse out the query string. */ |
/* Next parse out the query string. */ |
|
|
if (NULL != (p = getenv("QUERY_STRING"))) |
if (NULL != (p = getenv("QUERY_STRING"))) |
http_parse(&req.q, p); |
http_parse(&req, p); |
|
|
/* |
/* |
* Now juggle paths to extract information. |
* Now juggle paths to extract information. |
Line 1083 pathgen(DIR *dir, char *path, struct req *req) |
|
Line 1116 pathgen(DIR *dir, char *path, struct req *req) |
|
|
|
if (rc > 0) { |
if (rc > 0) { |
/* This also strips the trailing slash. */ |
/* This also strips the trailing slash. */ |
path[(int)sz - 1] = '\0'; |
path[(int)--sz] = '\0'; |
req->p = mandoc_realloc |
req->p = mandoc_realloc |
(req->p, |
(req->p, |
(req->psz + 1) * sizeof(struct paths)); |
(req->psz + 1) * sizeof(struct paths)); |
|
/* |
|
* Strip out the leading "./" unless we're just a ".", |
|
* in which case use an empty string as our name. |
|
*/ |
req->p[(int)req->psz].path = mandoc_strdup(path); |
req->p[(int)req->psz].path = mandoc_strdup(path); |
/* And this strips out the leading "./". */ |
|
req->p[(int)req->psz].name = |
req->p[(int)req->psz].name = |
cp = mandoc_strdup(path + 2); |
cp = mandoc_strdup(path + (1 == sz ? 1 : 2)); |
req->psz++; |
req->psz++; |
/* |
/* |
* The name is just the path with all the slashes taken |
* The name is just the path with all the slashes taken |