HELPOPT("[--scan,--load] keep real atimes on directories") \
NOVAL(NODIRATIME) LONG(no_dir_atime) LONG(no_dir_atimes) \
HELPOPT("[--scan,--load] fake atimes on directories") \
+ NOVAL(NOEOF) LONG(no_eof) LONG(noeof) \
+ HELPOPT("[--web] do not close web server on EOF") \
NOVAL(MTIME) LONG(mtime) \
HELPOPT("[--scan] use mtime instead of atime") \
NOVAL(SHOWFILES) LONG(files) \
HELPARG("filename") HELPOPT("[--web] read HTTP Basic user/pass from file") \
VAL(AUTHFD) LONG(auth_fd) \
HELPARG("fd") HELPOPT("[--web] read HTTP Basic user/pass from fd") \
+ VAL(HTMLTITLE) LONG(title) \
+ HELPARG("title") HELPOPT("[--web,--html] title prefix for web pages") \
VAL(DEPTH) SHORT(d) LONG(depth) LONG(max_depth) LONG(maximum_depth) \
HELPARG("levels") HELPOPT("[--text,--html] recurse to this many levels") \
VAL(MINAGE) SHORT(a) LONG(age) LONG(min_age) LONG(minimum_age) \
int httpserverport = 0;
const char *httpauthdata = NULL;
const char *outfile = NULL;
+ const char *html_title = PNAME;
int auth = HTTPD_AUTH_MAGIC | HTTPD_AUTH_BASIC;
int progress = 1;
struct inclusion_exclusion *inex = NULL;
int depth = -1, gotdepth = 0;
int fakediratimes = 1;
int mtime = 0;
+ int closeoneof = 1;
int showfiles = 0;
#ifdef DEBUG_MAD_OPTION_PARSING_MACROS
case OPT_MTIME:
mtime = 1;
break;
+ case OPT_NOEOF:
+ closeoneof = 0;
+ break;
case OPT_DATAFILE:
filename = optval;
break;
case OPT_OUTFILE:
outfile = optval;
break;
+ case OPT_HTMLTITLE:
+ html_title = optval;
+ break;
case OPT_MINAGE:
textcutoff = parse_age(now, optval);
break;
maxpathlen = trie_maxpathlen(mappedfile);
pathbuf = snewn(maxpathlen, char);
+ if (!querydir || !gotdepth) {
+ /*
+ * Single output file.
+ */
+ if (!querydir) {
+ cfg.uriformat = "/%|/%p/%|%|/%p";
+ } else {
+ cfg.uriformat = NULL;
+ }
+ cfg.autoage = htmlautoagerange;
+ cfg.oldest = htmloldest;
+ cfg.newest = htmlnewest;
+ cfg.showfiles = showfiles;
+ } else {
+ cfg.uriformat = "/index.html%|/%/p.html";
+ cfg.fileformat = "/index.html%|/%/p.html";
+ cfg.autoage = htmlautoagerange;
+ cfg.oldest = htmloldest;
+ cfg.newest = htmlnewest;
+ cfg.showfiles = showfiles;
+ }
+ cfg.html_title = html_title;
+
if (!querydir) {
/*
* If we're run in --cgi mode, read PATH_INFO to get
if (!path_info)
path_info = "";
+ /*
+ * Parse the path.
+ */
+ if (!html_parse_path(mappedfile, path_info, &cfg, &xi)) {
+ printf("Status: 404\nContent-type: text/html\n\n"
+ "<html><head>"
+ "<title>404 Not Found</title>"
+ "</head><body>"
+ "<h1>400 Not Found</h1>"
+ "<p>Invalid <code>agedu</code> pathname."
+ "</body></html>\n");
+ return 0;
+ }
+
/*
- * Because we need relative links to go to the
- * right place, it's important that our
- * PATH_INFO should contain a slash right at the
- * start, and no slashes anywhere else.
+ * If the path was parseable but not canonically
+ * expressed, return a redirect to the canonical
+ * version.
*/
- if (path_info[0] != '/') {
+ char *canonpath = html_format_path(mappedfile, &cfg, xi);
+ if (strcmp(canonpath, path_info)) {
char *servername = getenv("SERVER_NAME");
char *scriptname = getenv("SCRIPT_NAME");
if (!servername || !scriptname) {
return 0;
}
printf("Status: 301\n"
- "Location: http://%s/%s/\n"
+ "Location: http://%s/%s%s\n"
"Content-type: text/html\n\n"
"<html><head>"
"<title>301 Moved</title>"
"<h1>301 Moved</h1>"
"<p>Moved."
"</body></html>\n",
- servername, scriptname);
- return 0;
- } else if (strchr(path_info+1, '/')) {
- printf("Status: 404\nContent-type: text/html\n\n"
- "<html><head>"
- "<title>404 Not Found</title>"
- "</head><body>"
- "<h1>400 Not Found</h1>"
- "<p>Invalid <code>agedu</code> pathname."
- "</body></html>\n");
+ servername, scriptname, canonpath);
return 0;
}
- xi = atoi(path_info + 1);
- if (xi >= trie_count(mappedfile)) {
- printf("Status: 404\nContent-type: text/html\n\n"
- "<html><head>"
- "<title>404 Not Found</title>"
- "</head><body>"
- "<h1>404 Not Found</h1>"
- "<p>This is not a valid pathname index."
- "</body></html>\n");
- return 0;
- } else if (!index_has_root(mappedfile, xi)) {
- printf("Status: 404\nContent-type: text/html\n\n"
- "<html><head>"
- "<title>404 Not Found</title>"
- "</head><body>"
- "<h1>404 Not Found</h1>"
- "<p>Pathname index out of range."
- "</body></html>\n");
- return 0;
- }
} else {
/*
* In ordinary --html mode, process a query
/*
* Single output file.
*/
- if (!querydir) {
- cfg.format = "%.0lu"; /* use crosslinks in --cgi mode */
- } else {
- cfg.format = NULL;
- }
- cfg.rootpage = NULL;
- cfg.autoage = htmlautoagerange;
- cfg.oldest = htmloldest;
- cfg.newest = htmlnewest;
- cfg.showfiles = showfiles;
html = html_query(mappedfile, xi, &cfg, 1);
if (querydir && outfile != NULL) {
FILE *fp = fopen(outfile, "w");
make_successor(pathbuf);
xi2 = trie_before(mappedfile, pathbuf);
- cfg.format = "%lu.html";
- cfg.rootpage = "index.html";
- cfg.autoage = htmlautoagerange;
- cfg.oldest = htmloldest;
- cfg.newest = htmlnewest;
- cfg.showfiles = showfiles;
if (html_dump(mappedfile, xi, xi2, depth, &cfg, prefix))
return 1;
}
dcfg.address = httpserveraddr;
dcfg.port = httpserverport;
+ dcfg.closeoneof = closeoneof;
dcfg.basicauthdata = httpauthdata;
- pcfg.format = NULL;
- pcfg.rootpage = NULL;
+ pcfg.uriformat = "/%|/%p/%|%|/%p";
pcfg.autoage = htmlautoagerange;
pcfg.oldest = htmloldest;
pcfg.newest = htmlnewest;
pcfg.showfiles = showfiles;
+ pcfg.html_title = html_title;
run_httpd(mappedfile, auth, &dcfg, &pcfg);
munmap(mappedfile, totalsize);
} else if (mode == REMOVE) {