version 1.25, 2011/12/10 22:20:59 |
version 1.26, 2011/12/10 22:45:47 |
|
|
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 486 resp_search(struct res *r, size_t sz, void *arg) |
|
Line 499 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 767 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 837 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 857 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. |