version 1.6, 2011/11/23 10:01:04 |
version 1.8, 2011/11/27 11:46:44 |
|
|
|
|
#include "apropos_db.h" |
#include "apropos_db.h" |
#include "mandoc.h" |
#include "mandoc.h" |
|
#include "mdoc.h" |
|
#include "man.h" |
|
#include "main.h" |
#include "manpath.h" |
#include "manpath.h" |
|
|
#ifdef __linux__ |
#ifdef __linux__ |
|
|
}; |
}; |
|
|
static int atou(const char *, unsigned *); |
static int atou(const char *, unsigned *); |
|
static void format(const char *); |
static void html_print(const char *); |
static void html_print(const char *); |
static int kval_decode(char *); |
static int kval_decode(char *); |
static void kval_parse(struct kval **, size_t *, char *); |
static void kval_parse(struct kval **, size_t *, char *); |
Line 73 static void pg_search(const struct manpaths *, |
|
Line 77 static void pg_search(const struct manpaths *, |
|
const struct req *, char *); |
const struct req *, char *); |
static void pg_show(const struct manpaths *, |
static void pg_show(const struct manpaths *, |
const struct req *, char *); |
const struct req *, char *); |
|
static void resp_bad(void); |
static void resp_baddb(void); |
static void resp_baddb(void); |
static void resp_badexpr(const struct req *); |
static void resp_badexpr(const struct req *); |
static void resp_badmanual(void); |
static void resp_badmanual(void); |
Line 84 static void resp_search(struct res *, size_t, void * |
|
Line 89 static void resp_search(struct res *, size_t, void * |
|
static void resp_searchform(const struct req *); |
static void resp_searchform(const struct req *); |
|
|
static const char *progname; |
static const char *progname; |
|
static const char *cache; |
static const char *host; |
static const char *host; |
|
|
static const char * const pages[PAGE__MAX] = { |
static const char * const pages[PAGE__MAX] = { |
Line 361 resp_badexpr(const struct req *req) |
|
Line 367 resp_badexpr(const struct req *req) |
|
} |
} |
|
|
static void |
static void |
|
resp_bad(void) |
|
{ |
|
resp_begin_html(500, "Internal Server Error"); |
|
puts("<P>Generic badness happened.</P>"); |
|
resp_end_html(); |
|
} |
|
|
|
static void |
resp_baddb(void) |
resp_baddb(void) |
{ |
{ |
|
|
Line 421 pg_index(const struct manpaths *ps, const struct req * |
|
Line 435 pg_index(const struct manpaths *ps, const struct req * |
|
} |
} |
|
|
static void |
static void |
|
format(const char *file) |
|
{ |
|
struct mparse *mp; |
|
int fd; |
|
struct mdoc *mdoc; |
|
struct man *man; |
|
void *vp; |
|
enum mandoclevel rc; |
|
|
|
if (-1 == (fd = open(file, O_RDONLY, 0))) { |
|
resp_baddb(); |
|
return; |
|
} |
|
|
|
mp = mparse_alloc(MPARSE_AUTO, MANDOCLEVEL_FATAL, NULL, NULL); |
|
rc = mparse_readfd(mp, fd, file); |
|
close(fd); |
|
|
|
if (rc >= MANDOCLEVEL_FATAL) { |
|
resp_baddb(); |
|
return; |
|
} |
|
|
|
mparse_result(mp, &mdoc, &man); |
|
vp = html_alloc(NULL); |
|
|
|
if (NULL != mdoc) { |
|
resp_begin_http(200, NULL); |
|
html_mdoc(vp, mdoc); |
|
} else if (NULL != man) { |
|
resp_begin_http(200, NULL); |
|
html_man(vp, man); |
|
} else |
|
resp_baddb(); |
|
|
|
html_free(vp); |
|
mparse_free(mp); |
|
} |
|
|
|
static void |
pg_show(const struct manpaths *ps, const struct req *req, char *path) |
pg_show(const struct manpaths *ps, const struct req *req, char *path) |
{ |
{ |
pid_t pid; |
|
char *sub; |
char *sub; |
char file[MAXPATHLEN], cmd[MAXPATHLEN]; |
char file[MAXPATHLEN]; |
int rc; |
int rc; |
unsigned int vol, rec; |
unsigned int vol, rec; |
DB *db; |
DB *db; |
Line 476 pg_show(const struct manpaths *ps, const struct req *r |
|
Line 529 pg_show(const struct manpaths *ps, const struct req *r |
|
|
|
(*db->close)(db); |
(*db->close)(db); |
|
|
strlcpy(cmd, "man=", MAXPATHLEN); |
format(file); |
strlcat(cmd, progname, MAXPATHLEN); |
|
strlcat(cmd, "/search?expr=%N&sec=%S", MAXPATHLEN); |
|
|
|
/* Get ready to call the child mandoc(1) process. */ |
|
|
|
if (-1 == (pid = fork())) |
|
exit(EXIT_FAILURE); |
|
|
|
if (pid > 0) { |
|
waitpid(pid, NULL, 0); |
|
return; |
|
} |
|
|
|
dup2(STDOUT_FILENO, STDERR_FILENO); |
|
|
|
puts("Content-Type: text/html; charset=utf-8\n"); |
|
|
|
fflush(stdout); |
|
|
|
execlp("mandoc", "mandoc", "-T", |
|
"html", "-O", cmd, file, (char *)NULL); |
|
} |
} |
|
|
static void |
static void |
|
|
if (NULL == progname) |
if (NULL == progname) |
progname = ""; |
progname = ""; |
|
|
|
cache = getenv("CACHE_DIR"); |
|
if (NULL == cache) |
|
cache = "/cache/man.cgi"; |
|
|
|
if (-1 == chdir(cache)) { |
|
resp_bad(); |
|
return(EXIT_FAILURE); |
|
} |
|
|
host = getenv("HTTP_HOST"); |
host = getenv("HTTP_HOST"); |
if (NULL == host) |
if (NULL == host) |
host = "localhost"; |
host = "localhost"; |
|
|
/* Initialise MANPATH. */ |
/* Initialise MANPATH. */ |
|
|
memset(&paths, 0, sizeof(struct manpaths)); |
memset(&paths, 0, sizeof(struct manpaths)); |
manpath_parse(&paths, NULL, NULL); |
manpath_manconf("etc/man.conf", &paths); |
|
|
/* Route pages. */ |
/* Route pages. */ |
|
|