brian 97/09/18 11:49:42
Modified: src INDENT src/modules/standard mod_dld.c mod_include.c mod_mime.c Log: conformance to apache style a la .indent.pro. Revision Changes Path 1.33 +4 -4 apachen/src/INDENT Index: INDENT =================================================================== RCS file: /export/home/cvs/apachen/src/INDENT,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- INDENT 1997/09/18 18:40:45 1.32 +++ INDENT 1997/09/18 18:49:32 1.33 @@ -70,18 +70,18 @@ mod_cgi.c DONE by Dean mod_digest.c DONE by Dean mod_dir.c DONE by Brian - mod_dld.c RESERVED by Brian + mod_dld.c DONE by Brian mod_env.c DONE by Brian mod_expires.c DONE by Brian mod_headers.c DONE by Brian mod_imap.c DONE by Brian - mod_include.c RESERVED by Brian + mod_include.c DONE by Brian mod_info.c DONE by Ken mod_log_agent.c DONE by Brian mod_log_config.c DONE by Ken mod_log_referer.c DONE by Brian - mod_mime.c RESERVED by Brian - mod_mime.h RESERVED by Brian + mod_mime.c DONE by Brian + mod_mime.h DONE by Brian mod_mime_magic.c DONE by Brian mod_negotiation.c DONE by Ken mod_rewrite.c 1.12 +83 -73 apachen/src/modules/standard/mod_dld.c Index: mod_dld.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/standard/mod_dld.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- mod_dld.c 1997/08/18 13:12:11 1.11 +++ mod_dld.c 1997/09/18 18:49:37 1.12 @@ -57,7 +57,7 @@ #include "httpd.h" #include "http_config.h" -#include "http_conf_globals.h" /* server_argv0. Sigh... */ +#include "http_conf_globals.h" /* server_argv0. Sigh... */ #include <dld.h> /* @@ -66,128 +66,138 @@ * cheap way out: we only actually load the modules the first time through. */ -static int been_there_done_that = 0; /* Loaded the modules yet? */ +static int been_there_done_that = 0; /* Loaded the modules yet? */ static int have_symbol_table = 0; static char *insure_dld_sane() { int errcode; char *bin_name; - - if (have_symbol_table) return NULL; - bin_name = dld_find_executable (server_argv0); - - if ((errcode = dld_init (bin_name))) { - dld_perror (server_argv0); - return "Cannot find server binary (needed for dynamic linking)."; + if (have_symbol_table) + return NULL; + + bin_name = dld_find_executable(server_argv0); + + if ((errcode = dld_init(bin_name))) { + dld_perror(server_argv0); + return "Cannot find server binary (needed for dynamic linking)."; } have_symbol_table = 1; return NULL; } -static char *link_file (pool *p, char *filename) +static char *link_file(pool *p, char *filename) { int errcode; - - filename = server_root_relative (p, filename); - if ((errcode = dld_link (filename))) { - dld_perror (server_argv0); - return pstrcat (p, "Cannot load ", filename, " into server", NULL); + + filename = server_root_relative(p, filename); + if ((errcode = dld_link(filename))) { + dld_perror(server_argv0); + return pstrcat(p, "Cannot load ", filename, " into server", NULL); } return NULL; } -static char *load_module (cmd_parms *cmd, void *dummy, char *modname, char *filename) +static char *load_module(cmd_parms *cmd, void *dummy, char *modname, char *filename) { char *errname; module *modp; - if (been_there_done_that) return NULL; - - if ((errname = insure_dld_sane())) return errname; - if ((errname = link_file (cmd->pool, filename))) return errname; - if (!(modp = (module *)dld_get_symbol (modname))) { - return pstrcat (cmd->pool, "Can't find module ", modname, - " in file ", filename, NULL); + if (been_there_done_that) + return NULL; + + if ((errname = insure_dld_sane())) + return errname; + if ((errname = link_file(cmd->pool, filename))) + return errname; + if (!(modp = (module *) dld_get_symbol(modname))) { + return pstrcat(cmd->pool, "Can't find module ", modname, + " in file ", filename, NULL); } - add_module (modp); + add_module(modp); /* Alethea Patch (rws,djw2) - need to run configuration functions in new modules */ if (modp->create_server_config) - ((void**)cmd->server->module_config)[modp->module_index]= - (*modp->create_server_config)(cmd->pool, cmd->server); + ((void **) cmd->server->module_config)[modp->module_index] = + (*modp->create_server_config) (cmd->pool, cmd->server); if (modp->create_dir_config) - ((void**)cmd->server->lookup_defaults)[modp->module_index]= - (*modp->create_dir_config)(cmd->pool, NULL); + ((void **) cmd->server->lookup_defaults)[modp->module_index] = + (*modp->create_dir_config) (cmd->pool, NULL); return NULL; } -static char *load_file (cmd_parms *cmd, void *dummy, char *filename) +static char *load_file(cmd_parms *cmd, void *dummy, char *filename) { char *errname; - - if (been_there_done_that) return NULL; - - if ((errname = insure_dld_sane())) return errname; - if ((errname = link_file (cmd->pool, filename))) return errname; + + if (been_there_done_that) + return NULL; + + if ((errname = insure_dld_sane())) + return errname; + if ((errname = link_file(cmd->pool, filename))) + return errname; return NULL; } -static void check_loaded_modules (server_rec *dummy, pool *p) +static void check_loaded_modules(server_rec *dummy, pool *p) { - if (been_there_done_that) return; + if (been_there_done_that) + return; if (dld_undefined_sym_count > 0) { - /* Screwup. Do the best we can to inform the user, and exit */ - char **bad_syms = dld_list_undefined_sym(); - int i; - - fprintf(stderr, "Dynamic linking error --- symbols left undefined.\n"); - fprintf(stderr, "(It may help to relink libraries).\n"); - fprintf(stderr, "Undefined symbols follow:\n"); - - for (i = 0; i < dld_undefined_sym_count; ++i) - fprintf (stderr, "%s\n", bad_syms[i]); + /* Screwup. Do the best we can to inform the user, and exit */ + char **bad_syms = dld_list_undefined_sym(); + int i; + + fprintf(stderr, "Dynamic linking error --- symbols left undefined.\n"); + fprintf(stderr, "(It may help to relink libraries).\n"); + fprintf(stderr, "Undefined symbols follow:\n"); + + for (i = 0; i < dld_undefined_sym_count; ++i) + fprintf(stderr, "%s\n", bad_syms[i]); - exit (1); + exit(1); } - + been_there_done_that = 1; } -static command_rec dld_cmds[] = { -{ "LoadModule", load_module, NULL, RSRC_CONF, TAKE2, - "a module name, and the name of a file to load it from"}, -{ "LoadFile", load_file, NULL, RSRC_CONF, ITERATE, - "files or libraries to link into the server at runtime"}, -{ NULL } +static command_rec dld_cmds[] = +{ + {"LoadModule", load_module, NULL, RSRC_CONF, TAKE2, + "a module name, and the name of a file to load it from"}, + {"LoadFile", load_file, NULL, RSRC_CONF, ITERATE, + "files or libraries to link into the server at runtime"}, + {NULL} }; -module dld_module = { - STANDARD_MODULE_STUFF, - check_loaded_modules, /* initializer */ - NULL, /* create per-dir config */ - NULL, /* merge per-dir config */ - NULL, /* server config */ - NULL, /* merge server config */ - dld_cmds, /* command table */ - NULL, /* handlers */ - NULL, /* filename translation */ - NULL, /* check_user_id */ - NULL, /* check auth */ - NULL, /* check access */ - NULL, /* type_checker */ - NULL, /* logger */ - NULL, /* header parser */ - NULL, /* child_init */ - NULL, /* child_exit */ - NULL /* post read-request */ +module dld_module = +{ + STANDARD_MODULE_STUFF, + check_loaded_modules, /* initializer */ + NULL, /* create per-dir config */ + NULL, /* merge per-dir config */ + NULL, /* server config */ + NULL, /* merge server config */ + dld_cmds, /* command table */ + NULL, /* handlers */ + NULL, /* filename translation */ + NULL, /* check_user_id */ + NULL, /* check auth */ + NULL, /* check access */ + NULL, /* type_checker */ + NULL, /* logger */ + NULL, /* header parser */ + NULL, /* child_init */ + NULL, /* child_exit */ + NULL /* post read-request */ }; 1.51 +681 -640 apachen/src/modules/standard/mod_include.c Index: mod_include.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/standard/mod_include.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- mod_include.c 1997/09/12 18:56:10 1.50 +++ mod_include.c 1997/09/18 18:49:38 1.51 @@ -98,7 +98,7 @@ /* ------------------------ Environment function -------------------------- */ -static void add_include_vars (request_rec *r, char *timefmt) +static void add_include_vars(request_rec *r, char *timefmt) { #ifndef WIN32 struct passwd *pw; @@ -116,23 +116,24 @@ pw = getpwuid(r->finfo.st_uid); if (pw) { table_set(e, "USER_NAME", pw->pw_name); - } else { + } + else { char uid[16]; - ap_snprintf(uid, sizeof(uid), "user#%lu", (unsigned long)r->finfo.st_uid); + ap_snprintf(uid, sizeof(uid), "user#%lu", (unsigned long) r->finfo.st_uid); table_set(e, "USER_NAME", uid); } #endif /* ndef WIN32 */ if ((t = strrchr(r->filename, '/'))) - table_set (e, "DOCUMENT_NAME", ++t); + table_set(e, "DOCUMENT_NAME", ++t); else - table_set (e, "DOCUMENT_NAME", r->uri); + table_set(e, "DOCUMENT_NAME", r->uri); if (r->args) { - char *arg_copy = pstrdup (r->pool, r->args); + char *arg_copy = pstrdup(r->pool, r->args); - unescape_url (arg_copy); - table_set (e, "QUERY_STRING_UNESCAPED", - escape_shell_cmd (r->pool, arg_copy)); + unescape_url(arg_copy); + table_set(e, "QUERY_STRING_UNESCAPED", + escape_shell_cmd(r->pool, arg_copy)); } } @@ -152,7 +153,7 @@ if (outind == OUTBUFSIZE) { \ FLUSH_BUF(r) \ }; \ - } + } /* there SHOULD be some error checking on the return value of * rwrite, however it is unclear what the API for rwrite returning @@ -188,7 +189,8 @@ c = (char)i; \ } -static int find_string (FILE *in, char *str, request_rec *r, int printing) { +static int find_string(FILE *in, char *str, request_rec *r, int printing) +{ int x, l = strlen(str), p; char outbuf[OUTBUFSIZE]; int outind = 0; @@ -246,26 +248,27 @@ /* The following is a shrinking transformation, therefore safe. */ -static void decodehtml (char *s) +static void decodehtml(char *s) { int val, i, j; char *p = s; char *ents; - static char *entlist[MAXENTLEN+1] = { - NULL, /* 0 */ - NULL, /* 1 */ - "lt\074gt\076", /* 2 */ - "amp\046ETH\320eth\360", /* 3 */ + static char *entlist[MAXENTLEN + 1] = + { + NULL, /* 0 */ + NULL, /* 1 */ + "lt\074gt\076", /* 2 */ + "amp\046ETH\320eth\360", /* 3 */ "quot\042Auml\304Euml\313Iuml\317Ouml\326Uuml\334auml\344euml\353\ -iuml\357ouml\366uuml\374yuml\377", /* 4 */ +iuml\357ouml\366uuml\374yuml\377", /* 4 */ "Acirc\302Aring\305AElig\306Ecirc\312Icirc\316Ocirc\324Ucirc\333\ THORN\336szlig\337acirc\342aring\345aelig\346ecirc\352icirc\356ocirc\364\ -ucirc\373thorn\376", /* 5 */ +ucirc\373thorn\376", /* 5 */ "Agrave\300Aacute\301Atilde\303Ccedil\307Egrave\310Eacute\311\ Igrave\314Iacute\315Ntilde\321Ograve\322Oacute\323Otilde\325Oslash\330\ Ugrave\331Uacute\332Yacute\335agrave\340aacute\341atilde\343ccedil\347\ egrave\350eacute\351igrave\354iacute\355ntilde\361ograve\362oacute\363\ -otilde\365oslash\370ugrave\371uacute\372yacute\375" /* 6 */ +otilde\365oslash\370ugrave\371uacute\372yacute\375" /* 6 */ }; for (; *s != '\0'; s++, p++) { @@ -289,22 +292,24 @@ s += i; if (j < i || val <= 8 || (val >= 11 && val <= 31) || (val >= 127 && val <= 160) || val >= 256) - p--; /* no data to output */ + p--; /* no data to output */ else *p = val; - } else{ + } + else { j = i - 1; - if (i - 1 > MAXENTLEN || entlist[i - 1] == NULL) { /* wrong length */ + if (i - 1 > MAXENTLEN || entlist[i - 1] == NULL) { /* wrong length */ *p = '&'; - continue; /* skip it */ + continue; /* skip it */ } for (ents = entlist[i - 1]; *ents != '\0'; ents += i) - if (strncmp(s + 1, ents, i - 1) == 0) break; + if (strncmp(s + 1, ents, i - 1) == 0) + break; if (*ents == '\0') - *p = '&'; /* unknown */ + *p = '&'; /* unknown */ else { - *p = ((const unsigned char *)ents)[i - 1]; + *p = ((const unsigned char *) ents)[i - 1]; s += i; } } @@ -319,14 +324,14 @@ * the tag value is html decoded if dodecode is non-zero */ -static char *get_tag (pool *p, FILE *in, char *tag, int tagbuf_len, int dodecode) +static char *get_tag(pool *p, FILE *in, char *tag, int tagbuf_len, int dodecode) { char *t = tag, *tag_val, c, term; int n; n = 0; - do { /* skip whitespace */ + do { /* skip whitespace */ GET_CHAR(in, c, NULL, p); } while (isspace(c)); @@ -343,7 +348,7 @@ return tag; } } - return NULL; /* failed */ + return NULL; /* failed */ } /* find end of tag name */ @@ -361,18 +366,19 @@ *t++ = '\0'; tag_val = t; - while (isspace(c)) GET_CHAR(in, c, NULL, p); /* space before = */ + while (isspace(c)) + GET_CHAR(in, c, NULL, p); /* space before = */ if (c != '=') { ungetc(c, in); return NULL; } do { - GET_CHAR(in, c, NULL, p); /* space after = */ + GET_CHAR(in, c, NULL, p); /* space after = */ } while (isspace(c)); /* we should allow a 'name' as a value */ - + if (c != '"' && c != '\'') return NULL; term = c; @@ -384,21 +390,22 @@ } /* Want to accept \" as a valid character within a string. */ if (c == '\\') { - *(t++) = c; /* Add backslash */ + *(t++) = c; /* Add backslash */ GET_CHAR(in, c, NULL, p); - if (c == term) /* Only if */ - *(--t) = c; /* Replace backslash ONLY for terminator */ - } else if (c == term) + if (c == term) /* Only if */ + *(--t) = c; /* Replace backslash ONLY for terminator */ + } + else if (c == term) break; *(t++) = c; } *t = '\0'; if (dodecode) decodehtml(tag_val); - return pstrdup (p, tag_val); + return pstrdup(p, tag_val); } -static int get_directive (FILE *in, char *d, pool *p) +static int get_directive(FILE *in, char *d, pool *p) { char c; @@ -423,77 +430,79 @@ * Do variable substitution on strings */ static void parse_string(request_rec *r, char *in, char *out, int length, - int leave_name) + int leave_name) { char ch; char *next = out; int numchars = 0; while ((ch = *in++) != '\0') { - switch(ch) { - case '\\': + switch (ch) { + case '\\': if (*in == '$') *next++ = *in++; else *next++ = ch; break; - case '$': - { - char var[MAX_STRING_LEN]; - char vtext[MAX_STRING_LEN]; - char *val; - int braces = 0; - int vlen, vtlen; - /* - * Keep the $ and { around because we do no substitution - * if the variable isn't found - */ - vlen = vtlen = 0; - vtext[vtlen++] = ch; - if (*in == '{') { - braces = 1; - vtext[vtlen++] = *in++; - } - while (*in != '\0') { - if (vlen == (MAX_STRING_LEN - 1)) - continue; - if (braces == 1) { - if (*in == '}') + case '$': + { + char var[MAX_STRING_LEN]; + char vtext[MAX_STRING_LEN]; + char *val; + int braces = 0; + int vlen, vtlen; + /* + * Keep the $ and { around because we do no substitution + * if the variable isn't found + */ + vlen = vtlen = 0; + vtext[vtlen++] = ch; + if (*in == '{') { + braces = 1; + vtext[vtlen++] = *in++; + } + while (*in != '\0') { + if (vlen == (MAX_STRING_LEN - 1)) + continue; + if (braces == 1) { + if (*in == '}') + break; + } + else if (!(isalpha((int) *in) || (*in == '_') || isdigit((int) *in))) break; + if (vtlen < (MAX_STRING_LEN - 1)) + vtext[vtlen++] = *in; + var[vlen++] = *in++; } - else if (! (isalpha((int)*in) || (*in == '_') || isdigit((int)*in)) ) - break; - if (vtlen < (MAX_STRING_LEN - 1)) - vtext[vtlen++] = *in; - var[vlen++] = *in++; - } - var[vlen] = vtext[vtlen] = '\0'; - if (braces == 1) { - if (*in != '}') { - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid variable \"%s%s\"", vtext, in); - *next = '\0'; - return; - } else - in++; - } - - val = (char *)NULL; - if (var[0] == '\0') { - val = &vtext[0]; - } else { - val = table_get (r->subprocess_env, &var[0]); - if (!val && leave_name) + var[vlen] = vtext[vtlen] = '\0'; + if (braces == 1) { + if (*in != '}') { + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "Invalid variable \"%s%s\"", vtext, in); + *next = '\0'; + return; + } + else + in++; + } + + val = (char *) NULL; + if (var[0] == '\0') { val = &vtext[0]; + } + else { + val = table_get(r->subprocess_env, &var[0]); + if (!val && leave_name) + val = &vtext[0]; + } + while ((val != (char *) NULL) && (*val != '\0')) { + *next++ = *val++; + if (++numchars == (length - 1)) + break; + } + break; } - while ((val != (char *)NULL) && (*val != '\0')) { - *next++ = *val++; - if (++numchars == (length - 1)) - break; - } - break; - } - default: + default: *next++ = ch; break; } @@ -506,25 +515,25 @@ /* --------------------------- Action handlers ---------------------------- */ -static int include_cgi (char *s, request_rec *r) +static int include_cgi(char *s, request_rec *r) { - request_rec *rr = sub_req_lookup_uri (s, r); - + request_rec *rr = sub_req_lookup_uri(s, r); + if (rr->status != 200) return -1; - + /* No hardwired path info or query allowed */ - + if ((rr->path_info && rr->path_info[0]) || rr->args) return -1; if (rr->finfo.st_mode == 0) return -1; /* Script gets parameters of the *document*, for back compatibility */ - - rr->path_info = r->path_info; /* painful to get right; see mod_cgi.c */ + + rr->path_info = r->path_info; /* painful to get right; see mod_cgi.c */ rr->args = r->args; - + /* Force sub_req to be treated as a CGI request, even if ordinary * typing rules would have called it something else. */ @@ -532,20 +541,20 @@ rr->content_type = CGI_MAGIC_TYPE; /* Run it. */ - - if (run_sub_req (rr) == REDIRECT) { - char *location = table_get (rr->headers_out, "Location"); + + if (run_sub_req(rr) == REDIRECT) { + char *location = table_get(rr->headers_out, "Location"); location = escape_html(rr->pool, location); rvputs(r, "<A HREF=\"", location, "\">", location, "</A>", NULL); } - - destroy_sub_req (rr); + + destroy_sub_req(rr); chdir_file(r->filename); - + return 0; } -static int handle_include (FILE *in, request_rec *r, char *error, int noexec) +static int handle_include(FILE *in, request_rec *r, char *error, int noexec) { char tag[MAX_STRING_LEN]; char parsed_string[MAX_STRING_LEN]; @@ -553,30 +562,31 @@ while (1) { if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; - if (!strcmp(tag, "file") || !strcmp (tag, "virtual")) { + return 1; + if (!strcmp(tag, "file") || !strcmp(tag, "virtual")) { request_rec *rr = NULL; char *error_fmt = NULL; parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 0); if (tag[0] == 'f') { - /* be safe; only files in this directory or below allowed */ - char tmp[MAX_STRING_LEN+2]; + /* be safe; only files in this directory or below allowed */ + char tmp[MAX_STRING_LEN + 2]; ap_snprintf(tmp, sizeof(tmp), "/%s/", parsed_string); if (parsed_string[0] == '/' || strstr(tmp, "/../") != NULL) error_fmt = "unable to include file \"%s\" in parsed file %s"; else - rr = sub_req_lookup_file (parsed_string, r); - } else - rr = sub_req_lookup_uri (parsed_string, r); - + rr = sub_req_lookup_file(parsed_string, r); + } + else + rr = sub_req_lookup_uri(parsed_string, r); + if (!error_fmt && rr->status != 200) error_fmt = "unable to include \"%s\" in parsed file %s"; if (!error_fmt && noexec && rr->content_type - && (strncmp (rr->content_type, "text/", 5))) + && (strncmp(rr->content_type, "text/", 5))) error_fmt = - "unable to include potential exec \"%s\" in parsed file %s"; + "unable to include potential exec \"%s\" in parsed file %s"; if (error_fmt == NULL) { request_rec *p; @@ -586,26 +596,26 @@ if (p != NULL) error_fmt = "Recursive include of \"%s\" in parsed file %s"; } - - if (!error_fmt && run_sub_req (rr)) + + if (!error_fmt && run_sub_req(rr)) error_fmt = "unable to include \"%s\" in parsed file %s"; chdir_file(r->filename); - + if (error_fmt) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - error_fmt, tag_val, r->filename); + error_fmt, tag_val, r->filename); rputs(error, r); - } + } if (rr != NULL) - destroy_sub_req (rr); - } + destroy_sub_req(rr); + } else if (!strcmp(tag, "done")) return 0; else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag include in %s", - tag, r->filename); + "unknown parameter \"%s\" to tag include in %s", + tag, r->filename); rputs(error, r); } } @@ -616,33 +626,33 @@ char *s; } include_cmd_arg; -static int include_cmd_child (void *arg) +static int include_cmd_child(void *arg) { - request_rec *r = ((include_cmd_arg *)arg)->r; - char *s = ((include_cmd_arg *)arg)->s; + request_rec *r = ((include_cmd_arg *) arg)->r; + char *s = ((include_cmd_arg *) arg)->s; table *env = r->subprocess_env; int child_pid = 0; -#ifdef DEBUG_INCLUDE_CMD - FILE *dbg = fopen ("/dev/tty", "w"); +#ifdef DEBUG_INCLUDE_CMD + FILE *dbg = fopen("/dev/tty", "w"); #endif #ifndef WIN32 - char err_string [MAX_STRING_LEN]; + char err_string[MAX_STRING_LEN]; #endif -#ifdef DEBUG_INCLUDE_CMD +#ifdef DEBUG_INCLUDE_CMD #ifdef __EMX__ /* under OS/2 /dev/tty is referenced as con */ - FILE *dbg = fopen ("con", "w"); + FILE *dbg = fopen("con", "w"); #else - fprintf (dbg, "Attempting to include command '%s'\n", s); -#endif -#endif + fprintf(dbg, "Attempting to include command '%s'\n", s); +#endif +#endif if (r->path_info && r->path_info[0] != '\0') { request_rec *pa_req; - table_set (env, "PATH_INFO", escape_shell_cmd (r->pool, r->path_info)); - + table_set(env, "PATH_INFO", escape_shell_cmd(r->pool, r->path_info)); + pa_req = sub_req_lookup_uri(escape_uri(r->pool, r->path_info), r); if (pa_req->filename) table_set(env, "PATH_TRANSLATED", @@ -651,53 +661,54 @@ } if (r->args) { - char *arg_copy = pstrdup (r->pool, r->args); + char *arg_copy = pstrdup(r->pool, r->args); + + table_set(env, "QUERY_STRING", r->args); + unescape_url(arg_copy); + table_set(env, "QUERY_STRING_UNESCAPED", + escape_shell_cmd(r->pool, arg_copy)); + } - table_set (env, "QUERY_STRING", r->args); - unescape_url (arg_copy); - table_set (env, "QUERY_STRING_UNESCAPED", - escape_shell_cmd (r->pool, arg_copy)); - } - - error_log2stderr (r->server); - -#ifdef DEBUG_INCLUDE_CMD - fprintf (dbg, "Attempting to exec '%s'\n", s); -#endif + error_log2stderr(r->server); + +#ifdef DEBUG_INCLUDE_CMD + fprintf(dbg, "Attempting to exec '%s'\n", s); +#endif cleanup_for_exec(); /* set shellcmd flag to pass arg to SHELL_PATH */ - child_pid = call_exec(r, s, create_environment (r->pool, env), 1); + child_pid = call_exec(r, s, create_environment(r->pool, env), 1); #ifdef WIN32 - return(child_pid); -#else + return (child_pid); +#else /* Oh, drat. We're still here. The log file descriptors are closed, * so we have to whimper a complaint onto stderr... */ - -#ifdef DEBUG_INCLUDE_CMD - fprintf (dbg, "Exec failed\n"); -#endif + +#ifdef DEBUG_INCLUDE_CMD + fprintf(dbg, "Exec failed\n"); +#endif ap_snprintf(err_string, sizeof(err_string), - "httpd: exec of %s failed, reason: %s (errno = %d)\n", - SHELL_PATH, strerror(errno), errno); - write (STDERR_FILENO, err_string, strlen(err_string)); + "httpd: exec of %s failed, reason: %s (errno = %d)\n", + SHELL_PATH, strerror(errno), errno); + write(STDERR_FILENO, err_string, strlen(err_string)); exit(0); /* NOT REACHED */ - return(child_pid); + return (child_pid); #endif /* WIN32 */ } -static int include_cmd (char *s, request_rec *r) +static int include_cmd(char *s, request_rec *r) { include_cmd_arg arg; FILE *f; - arg.r = r; arg.s = s; + arg.r = r; + arg.s = s; + + if (!spawn_child(r->pool, include_cmd_child, &arg, + kill_after_timeout, NULL, &f)) + return -1; - if (!spawn_child (r->pool, include_cmd_child, &arg, - kill_after_timeout, NULL, &f)) - return -1; - send_fd(f, r); pfclose(r->pool, f); /* will wait for zombie when * r->pool is cleared @@ -706,7 +717,7 @@ } -static int handle_exec (FILE *in, request_rec *r, char *error) +static int handle_exec(FILE *in, request_rec *r, char *error) { char tag[MAX_STRING_LEN]; char *tag_val; @@ -714,24 +725,24 @@ char parsed_string[MAX_STRING_LEN]; while (1) { - if (!(tag_val = get_tag (r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) + return 1; if (!strcmp(tag, "cmd")) { parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 1); if (include_cmd(parsed_string, r) == -1) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "execution failure for parameter \"%s\" to tag exec in file %s", - tag, r->filename); + "execution failure for parameter \"%s\" to tag exec in file %s", + tag, r->filename); rputs(error, r); } /* just in case some stooge changed directories */ chdir_file(r->filename); - } + } else if (!strcmp(tag, "cgi")) { parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 0); if (include_cgi(parsed_string, r) == -1) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "invalid CGI ref \"%s\" in %s", tag_val, file); + "invalid CGI ref \"%s\" in %s", tag_val, file); rputs(error, r); } /* grumble groan */ @@ -741,62 +752,62 @@ return 0; else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag exec in %s", - tag, file); + "unknown parameter \"%s\" to tag exec in %s", + tag, file); rputs(error, r); } } } -static int handle_echo (FILE *in, request_rec *r, char *error) +static int handle_echo(FILE *in, request_rec *r, char *error) { char tag[MAX_STRING_LEN]; char *tag_val; while (1) { if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + return 1; if (!strcmp(tag, "var")) { char *val = table_get(r->subprocess_env, tag_val); if (val) rputs(val, r); else - rputs("(none)", r); + rputs("(none)", r); } - else if (!strcmp(tag, "done")) + else if (!strcmp(tag, "done")) return 0; else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag echo in %s", - tag, r->filename); + "unknown parameter \"%s\" to tag echo in %s", + tag, r->filename); rputs(error, r); } } } #ifdef USE_PERL_SSI -static int handle_perl (FILE *in, request_rec *r, char *error) +static int handle_perl(FILE *in, request_rec *r, char *error) { char tag[MAX_STRING_LEN]; char *tag_val; SV *sub = Nullsv; - AV *av = newAV(); + AV *av = newAV(); - if (!(allow_options (r) & OPT_INCLUDES)) { + if (!(allow_options(r) & OPT_INCLUDES)) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "httpd: #perl SSI disallowed by IncludesNoExec in %s", - r->filename); + "httpd: #perl SSI disallowed by IncludesNoExec in %s", + r->filename); return DECLINED; } while (1) { - if (!(tag_val = get_tag (r->pool, in, tag, MAX_STRING_LEN, 1))) - break; - if (strnEQ(tag, "sub", 3)) + if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) + break; + if (strnEQ(tag, "sub", 3)) sub = newSVpv(tag_val, 0); - else if (strnEQ(tag, "arg", 3)) - av_push(av, newSVpv(tag_val, 0)); + else if (strnEQ(tag, "arg", 3)) + av_push(av, newSVpv(tag_val, 0)); else if (strnEQ(tag, "done", 4)) break; } @@ -809,8 +820,8 @@ /* error and tf must point to a string with room for at * least MAX_STRING_LEN characters */ -static int handle_config (FILE *in, request_rec *r, char *error, char *tf, - int *sizefmt) +static int handle_config(FILE *in, request_rec *r, char *error, char *tf, + int *sizefmt) { char tag[MAX_STRING_LEN]; char *tag_val; @@ -819,19 +830,20 @@ while (1) { if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 0))) - return 1; + return 1; if (!strcmp(tag, "errmsg")) { parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 0); strncpy(error, parsed_string, MAX_STRING_LEN - 1); error[MAX_STRING_LEN - 1] = '\0'; - } else if (!strcmp(tag, "timefmt")) { + } + else if (!strcmp(tag, "timefmt")) { time_t date = r->request_time; parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 0); strncpy(tf, parsed_string, MAX_STRING_LEN - 1); tf[MAX_STRING_LEN - 1] = '\0'; - table_set (env, "DATE_LOCAL", ht_time(r->pool, date, tf, 0)); - table_set (env, "DATE_GMT", ht_time(r->pool, date, tf, 1)); - table_set (env, "LAST_MODIFIED", ht_time(r->pool, r->finfo.st_mtime, tf, 0)); + table_set(env, "DATE_LOCAL", ht_time(r->pool, date, tf, 0)); + table_set(env, "DATE_GMT", ht_time(r->pool, date, tf, 1)); + table_set(env, "LAST_MODIFIED", ht_time(r->pool, r->finfo.st_mtime, tf, 0)); } else if (!strcmp(tag, "sizefmt")) { parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 0); @@ -840,49 +852,49 @@ *sizefmt = SIZEFMT_BYTES; else if (!strcmp(parsed_string, "abbrev")) *sizefmt = SIZEFMT_KMG; - } + } else if (!strcmp(tag, "done")) return 0; else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag config in %s", - tag, r->filename); + "unknown parameter \"%s\" to tag config in %s", + tag, r->filename); rputs(error, r); } } } -static int find_file (request_rec *r, char *directive, char *tag, - char *tag_val, struct stat *finfo, char *error) +static int find_file(request_rec *r, char *directive, char *tag, + char *tag_val, struct stat *finfo, char *error) { char *dir = "./"; char *to_send; if (!strcmp(tag, "file")) { - getparents(tag_val); /* get rid of any nasties */ - to_send = make_full_path (r->pool, dir, tag_val); + getparents(tag_val); /* get rid of any nasties */ + to_send = make_full_path(r->pool, dir, tag_val); if (stat(to_send, finfo) == -1) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unable to get information about \"%s\" in parsed file %s", - to_send, r->filename); + "unable to get information about \"%s\" in parsed file %s", + to_send, r->filename); rputs(error, r); return -1; } return 0; } else if (!strcmp(tag, "virtual")) { - request_rec *rr = sub_req_lookup_uri (tag_val, r); - + request_rec *rr = sub_req_lookup_uri(tag_val, r); + if (rr->status == 200 && rr->finfo.st_mode != 0) { - memcpy((char*)finfo, (const char *)&rr->finfo, sizeof (struct stat)); + memcpy((char *) finfo, (const char *) &rr->finfo, sizeof(struct stat)); destroy_sub_req(rr); return 0; } - else { + else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unable to get information about \"%s\" in parsed file %s", - tag_val, r->filename); + "unable to get information about \"%s\" in parsed file %s", + tag_val, r->filename); rputs(error, r); destroy_sub_req(rr); return -1; @@ -890,15 +902,15 @@ } else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag %s in %s", - tag, directive, r->filename); + "unknown parameter \"%s\" to tag %s in %s", + tag, directive, r->filename); rputs(error, r); return -1; } } -static int handle_fsize (FILE *in, request_rec *r, char *error, int sizefmt) +static int handle_fsize(FILE *in, request_rec *r, char *error, int sizefmt) { char tag[MAX_STRING_LEN]; char *tag_val; @@ -907,7 +919,7 @@ while (1) { if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + return 1; else if (!strcmp(tag, "done")) return 0; else { @@ -924,12 +936,12 @@ #else ap_snprintf(tag, sizeof(tag), "%ld", finfo.st_size); #endif - l = strlen(tag); /* grrr */ + l = strlen(tag); /* grrr */ for (x = 0; x < l; x++) { if (x && (!((l - x) % 3))) { rputc(',', r); } - rputc (tag[x], r); + rputc(tag[x], r); } } } @@ -937,7 +949,7 @@ } } -static int handle_flastmod (FILE *in, request_rec *r, char *error, char *tf) +static int handle_flastmod(FILE *in, request_rec *r, char *error, char *tf) { char tag[MAX_STRING_LEN]; char *tag_val; @@ -946,7 +958,7 @@ while (1) { if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + return 1; else if (!strcmp(tag, "done")) return 0; else { @@ -955,25 +967,26 @@ rputs(ht_time(r->pool, finfo.st_mtime, tf, 0), r); } } -} +} -static int re_check (request_rec *r, char *string, char *rexp) +static int re_check(request_rec *r, char *string, char *rexp) { regex_t *compiled; int regex_error; - compiled = pregcomp(r->pool, rexp, REG_EXTENDED|REG_NOSUB); + compiled = pregcomp(r->pool, rexp, REG_EXTENDED | REG_NOSUB); if (compiled == NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unable to compile pattern \"%s\"", rexp); + "unable to compile pattern \"%s\"", rexp); return -1; } - regex_error = regexec(compiled, string, 0, (regmatch_t *)NULL, 0); + regex_error = regexec(compiled, string, 0, (regmatch_t *) NULL, 0); pregfree(r->pool, compiled); - return(!regex_error); + return (!regex_error); } -enum token_type { token_string, +enum token_type { + token_string, token_and, token_or, token_not, token_eq, token_ne, token_rbrace, token_lbrace, token_group, token_ge, token_le, token_gt, token_lt @@ -983,70 +996,73 @@ char value[MAX_STRING_LEN]; }; -static char *get_ptoken (request_rec *r, char *string, struct token *token) +static char *get_ptoken(request_rec *r, char *string, struct token *token) { char ch; int next = 0; int qs = 0; /* Skip leading white space */ - if (string == (char *)NULL) - return (char *)NULL; + if (string == (char *) NULL) + return (char *) NULL; while ((ch = *string++)) if (!isspace(ch)) break; if (ch == '\0') - return (char *)NULL; + return (char *) NULL; - switch(ch) { - case '(': + switch (ch) { + case '(': token->type = token_lbrace; - return(string); - case ')': + return (string); + case ')': token->type = token_rbrace; - return(string); - case '=': + return (string); + case '=': token->type = token_eq; - return(string); - case '!': + return (string); + case '!': if (*string == '=') { token->type = token_ne; - return(string+1); - } else { + return (string + 1); + } + else { token->type = token_not; - return(string); + return (string); } - case '\'': + case '\'': token->type = token_string; qs = 1; break; - case '|': + case '|': if (*string == '|') { token->type = token_or; - return(string+1); + return (string + 1); } - case '&': + case '&': if (*string == '&') { token->type = token_and; - return(string+1); + return (string + 1); } - case '>': + case '>': if (*string == '=') { token->type = token_ge; - return(string+1); - } else { + return (string + 1); + } + else { token->type = token_gt; - return(string); + return (string); } - case '<': + case '<': if (*string == '=') { token->type = token_le; - return(string+1); - } else { + return (string + 1); + } + else { token->type = token_lt; - return(string); + return (string); } - default: + default: token->type = token_string; break; } @@ -1058,11 +1074,11 @@ * Yes I know that goto's are BAD. But, c doesn't allow me to * exit a loop from a switch statement. Yes, I could use a flag, * but that is (IMHO) even less readable/maintainable than the goto. - */ + */ /* * I used the ++string throughout this section so that string * ends up pointing to the next token and I can just return it - */ + */ for (ch = *string; ch != '\0'; ch = *++string) { if (ch == '\\') { if ((ch = *++string) == '\0') @@ -1073,28 +1089,29 @@ if (!qs) { if (isspace(ch)) goto TOKEN_DONE; - switch(ch) { - case '(': + switch (ch) { + case '(': goto TOKEN_DONE; - case ')': + case ')': goto TOKEN_DONE; - case '=': + case '=': goto TOKEN_DONE; - case '!': + case '!': goto TOKEN_DONE; - case '|': - if (*(string+1) == '|') + case '|': + if (*(string + 1) == '|') goto TOKEN_DONE; - case '&': - if (*(string+1) == '&') + case '&': + if (*(string + 1) == '&') goto TOKEN_DONE; - case '<': + case '<': + goto TOKEN_DONE; + case '>': goto TOKEN_DONE; - case '>': goto - TOKEN_DONE; } token->value[next++] = ch; - } else { + } + else { if (ch == '\'') { qs = 0; ++string; @@ -1103,14 +1120,14 @@ token->value[next++] = ch; } } -TOKEN_DONE: + TOKEN_DONE: /* If qs is still set, I have an unmatched ' */ if (qs) { rputs("\nUnmatched '\n", r); next = 0; } token->value[next] = '\0'; - return(string); + return (string); } @@ -1121,126 +1138,127 @@ * cases. And, without rewriting this completely, the easiest way * is to just branch to the return code which cleans it up. */ -static int parse_expr (request_rec *r, char *expr, char *error) +static int parse_expr(request_rec *r, char *expr, char *error) { struct parse_node { struct parse_node *left, *right, *parent; struct token token; int value, done; - } *root, *current, *new; + } *root, *current, *new; char *parse; char buffer[MAX_STRING_LEN]; pool *expr_pool; int retval = 0; - if ((parse = expr) == (char *)NULL) - return(0); - root = current = (struct parse_node*)NULL; - if ((expr_pool = make_sub_pool(r->pool)) == (pool *)NULL) { + if ((parse = expr) == (char *) NULL) + return (0); + root = current = (struct parse_node *) NULL; + if ((expr_pool = make_sub_pool(r->pool)) == (pool *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "out of memory processing file %s", r->filename); + "out of memory processing file %s", r->filename); rputs(error, r); - return(0); + return (0); } /* Create Parse Tree */ while (1) { - new = (struct parse_node*)palloc(expr_pool, sizeof (struct parse_node)); - if (new == (struct parse_node*)NULL) { + new = (struct parse_node *) palloc(expr_pool, sizeof(struct parse_node)); + if (new == (struct parse_node *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "out of memory processing file %s", r->filename); + "out of memory processing file %s", r->filename); rputs(error, r); goto RETURN; } - new->parent = new->left = new->right = (struct parse_node*)NULL; + new->parent = new->left = new->right = (struct parse_node *) NULL; new->done = 0; - if ((parse = get_ptoken(r, parse, &new->token)) == (char *)NULL) + if ((parse = get_ptoken(r, parse, &new->token)) == (char *) NULL) break; - switch(new->token.type) { + switch (new->token.type) { - case token_string: + case token_string: #ifdef DEBUG_INCLUDE rvputs(r, " Token: string (", new->token.value, ")\n", NULL); #endif - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { root = current = new; break; } - switch(current->token.type) { - case token_string: + switch (current->token.type) { + case token_string: if (current->token.value[0] != '\0') - strncat(current->token.value, " ", - MAX_STRING_LEN - strlen(current->token.value) - 1); - strncat(current->token.value, new->token.value, + strncat(current->token.value, " ", + MAX_STRING_LEN - strlen(current->token.value) - 1); + strncat(current->token.value, new->token.value, MAX_STRING_LEN - strlen(current->token.value) - 1); break; - case token_eq: - case token_ne: - case token_and: - case token_or: - case token_lbrace: - case token_not: - case token_ge: - case token_gt: - case token_le: - case token_lt: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_not: + case token_ge: + case token_gt: + case token_le: + case token_lt: new->parent = current; current = current->right = new; break; - default: + default: aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } break; - case token_and: - case token_or: + case token_and: + case token_or: #ifdef DEBUG_INCLUDE -rputs (" Token: and/or\n", r); + rputs(" Token: and/or\n", r); #endif - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } /* Percolate upwards */ - while (current != (struct parse_node *)NULL) { - switch(current->token.type) { - case token_string: - case token_group: - case token_not: - case token_eq: - case token_ne: - case token_and: - case token_or: - case token_ge: - case token_gt: - case token_le: - case token_lt: + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_string: + case token_group: + case token_not: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_ge: + case token_gt: + case token_le: + case token_lt: current = current->parent; continue; - case token_lbrace: + case token_lbrace: break; - default: + default: aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } break; } - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { new->left = root; new->left->parent = new; - new->parent = (struct parse_node*)NULL; + new->parent = (struct parse_node *) NULL; root = new; - } else { + } + else { new->left = current->right; current->right = new; new->parent = current; @@ -1248,43 +1266,44 @@ current = new; break; - case token_not: + case token_not: #ifdef DEBUG_INCLUDE -rputs(" Token: not\n", r); + rputs(" Token: not\n", r); #endif - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { root = current = new; break; } /* Percolate upwards */ - while (current != (struct parse_node *)NULL) { - switch(current->token.type) { - case token_not: - case token_eq: - case token_ne: - case token_and: - case token_or: - case token_lbrace: - case token_ge: - case token_gt: - case token_le: - case token_lt: + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_not: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_ge: + case token_gt: + case token_le: + case token_lt: break; - default: + default: aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } break; } - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { new->left = root; new->left->parent = new; - new->parent = (struct parse_node*)NULL; + new->parent = (struct parse_node *) NULL; root = new; - } else { + } + else { new->left = current->right; current->right = new; new->parent = current; @@ -1292,55 +1311,56 @@ current = new; break; - case token_eq: - case token_ne: - case token_ge: - case token_gt: - case token_le: - case token_lt: + case token_eq: + case token_ne: + case token_ge: + case token_gt: + case token_le: + case token_lt: #ifdef DEBUG_INCLUDE -rputs(" Token: eq/ne/ge/gt/le/lt\n", r); + rputs(" Token: eq/ne/ge/gt/le/lt\n", r); #endif - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } /* Percolate upwards */ - while (current != (struct parse_node *)NULL) { - switch(current->token.type) { - case token_string: - case token_group: + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_string: + case token_group: current = current->parent; continue; - case token_lbrace: - case token_and: - case token_or: + case token_lbrace: + case token_and: + case token_or: break; - case token_not: - case token_eq: - case token_ne: - case token_ge: - case token_gt: - case token_le: - case token_lt: - default: - aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + case token_not: + case token_eq: + case token_ne: + case token_ge: + case token_gt: + case token_le: + case token_lt: + default: + aplog_error(APLOG_MARK, APLOG_ERR, r->server, + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } break; } - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { new->left = root; new->left->parent = new; - new->parent = (struct parse_node*)NULL; + new->parent = (struct parse_node *) NULL; root = new; - } else { + } + else { new->left = current->right; current->right = new; new->parent = current; @@ -1348,82 +1368,83 @@ current = new; break; - case token_rbrace: + case token_rbrace: #ifdef DEBUG_INCLUDE -rputs(" Token: rbrace\n", r); + rputs(" Token: rbrace\n", r); #endif - while (current != (struct parse_node*)NULL) { + while (current != (struct parse_node *) NULL) { if (current->token.type == token_lbrace) { current->token.type = token_group; break; } current = current->parent; } - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Unmatched ')' in %s", expr, r->filename); + "Unmatched ')' in %s", expr, r->filename); rputs(error, r); goto RETURN; } break; - case token_lbrace: + case token_lbrace: #ifdef DEBUG_INCLUDE -rputs(" Token: lbrace\n", r); + rputs(" Token: lbrace\n", r); #endif - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { root = current = new; break; } /* Percolate upwards */ - while (current != (struct parse_node *)NULL) { - switch(current->token.type) { - case token_not: - case token_eq: - case token_ne: - case token_and: - case token_or: - case token_lbrace: - case token_ge: - case token_gt: - case token_le: - case token_lt: + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_not: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_ge: + case token_gt: + case token_le: + case token_lt: break; - case token_string: - case token_group: - default: + case token_string: + case token_group: + default: aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } break; } - if (current == (struct parse_node*)NULL) { + if (current == (struct parse_node *) NULL) { new->left = root; new->left->parent = new; - new->parent = (struct parse_node*)NULL; + new->parent = (struct parse_node *) NULL; root = new; - } else { + } + else { new->left = current->right; current->right = new; new->parent = current; } current = new; break; - default: + default: break; } } /* Evaluate Parse Tree */ current = root; - while (current != (struct parse_node *)NULL) { - switch(current->token.type) { - case token_string: + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_string: #ifdef DEBUG_INCLUDE -rputs(" Evaluate string\n", r); + rputs(" Evaluate string\n", r); #endif parse_string(r, current->token.value, buffer, MAX_STRING_LEN, 0); strncpy(current->token.value, buffer, MAX_STRING_LEN - 1); @@ -1433,52 +1454,52 @@ current = current->parent; break; - case token_and: - case token_or: + case token_and: + case token_or: #ifdef DEBUG_INCLUDE -rputs(" Evaluate and/or\n", r); + rputs(" Evaluate and/or\n", r); #endif - if (current->left == (struct parse_node*)NULL || - current->right == (struct parse_node*)NULL) { + if (current->left == (struct parse_node *) NULL || + current->right == (struct parse_node *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } if (!current->left->done) { - switch(current->left->token.type) { - case token_string: + switch (current->left->token.type) { + case token_string: parse_string(r, current->left->token.value, - buffer, MAX_STRING_LEN, 0); + buffer, MAX_STRING_LEN, 0); strncpy(current->left->token.value, buffer, MAX_STRING_LEN - 1); current->left->token.value[MAX_STRING_LEN - 1] = '\0'; current->left->done = 1; break; - default: + default: current = current->left; continue; } } if (!current->right->done) { - switch(current->right->token.type) { - case token_string: + switch (current->right->token.type) { + case token_string: parse_string(r, current->right->token.value, - buffer, MAX_STRING_LEN, 0); + buffer, MAX_STRING_LEN, 0); strncpy(current->right->token.value, buffer, MAX_STRING_LEN - 1); current->right->token.value[MAX_STRING_LEN - 1] = '\0'; current->right->done = 1; break; - default: + default: current = current->right; continue; } } #ifdef DEBUG_INCLUDE -rvputs(r, " Left: ", current->left->value ? "1" : "0", "\n", NULL); -rvputs(r, " Right: ", current->right->value ? "1" : "0", "\n", NULL); + rvputs(r, " Left: ", current->left->value ? "1" : "0", "\n", NULL); + rvputs(r, " Right: ", current->right->value ? "1" : "0", "\n", NULL); #endif if (current->token.type == token_and) current->value = @@ -1487,24 +1508,24 @@ current->value = current->left->value || current->right->value; #ifdef DEBUG_INCLUDE -rvputs(r, " Returning ", current->value ? "1" : "0", "\n", NULL); + rvputs(r, " Returning ", current->value ? "1" : "0", "\n", NULL); #endif current->done = 1; current = current->parent; break; - case token_eq: - case token_ne: + case token_eq: + case token_ne: #ifdef DEBUG_INCLUDE -rputs(" Evaluate eq/ne\n", r); + rputs(" Evaluate eq/ne\n", r); #endif - if ((current->left == (struct parse_node*)NULL) || - (current->right == (struct parse_node*)NULL) || - (current->left->token.type != token_string) || - (current->right->token.type != token_string)) { + if ((current->left == (struct parse_node *) NULL) || + (current->right == (struct parse_node *) NULL) || + (current->left->token.type != token_string) || + (current->right->token.type != token_string)) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } @@ -1522,52 +1543,52 @@ if (current->right->token.value[len - 1] == '/') { current->right->token.value[len - 1] = '\0'; } - else { + else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid rexp \"%s\" in file %s", - current->right->token.value, r->filename); + "Invalid rexp \"%s\" in file %s", + current->right->token.value, r->filename); rputs(error, r); goto RETURN; } #ifdef DEBUG_INCLUDE -rvputs(r, " Re Compare (", current->left->token.value, - ") with /", ¤t->right->token.value[1], "/\n", NULL); + rvputs(r, " Re Compare (", current->left->token.value, + ") with /", ¤t->right->token.value[1], "/\n", NULL); #endif current->value = re_check(r, current->left->token.value, - ¤t->right->token.value[1]); + ¤t->right->token.value[1]); } - else { + else { #ifdef DEBUG_INCLUDE -rvputs(r, " Compare (", current->left->token.value, - ") with (", current->right->token.value, ")\n", NULL); + rvputs(r, " Compare (", current->left->token.value, + ") with (", current->right->token.value, ")\n", NULL); #endif current->value = - (strcmp(current->left->token.value, - current->right->token.value) == 0); + (strcmp(current->left->token.value, + current->right->token.value) == 0); } if (current->token.type == token_ne) current->value = !current->value; #ifdef DEBUG_INCLUDE -rvputs(r, " Returning ", current->value ? "1" : "0", "\n", NULL); + rvputs(r, " Returning ", current->value ? "1" : "0", "\n", NULL); #endif current->done = 1; current = current->parent; break; - case token_ge: - case token_gt: - case token_le: - case token_lt: -#ifdef DEBUG_INCLUDE -rputs(" Evaluate ge/gt/le/lt\n", r); -#endif - if ((current->left == (struct parse_node*)NULL) || - (current->right == (struct parse_node*)NULL) || - (current->left->token.type != token_string) || - (current->right->token.type != token_string)) { + case token_ge: + case token_gt: + case token_le: + case token_lt: +#ifdef DEBUG_INCLUDE + rputs(" Evaluate ge/gt/le/lt\n", r); +#endif + if ((current->left == (struct parse_node *) NULL) || + (current->right == (struct parse_node *) NULL) || + (current->left->token.type != token_string) || + (current->right->token.type != token_string)) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Invalid expression \"%s\" in file %s", - expr, r->filename); + "Invalid expression \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; } @@ -1578,12 +1599,12 @@ buffer, MAX_STRING_LEN, 0); strncpy(current->right->token.value, buffer, MAX_STRING_LEN - 1); #ifdef DEBUG_INCLUDE -rvputs(r, " Compare (", current->left->token.value, - ") with (", current->right->token.value, ")\n", NULL); + rvputs(r, " Compare (", current->left->token.value, + ") with (", current->right->token.value, ")\n", NULL); #endif current->value = - strcmp(current->left->token.value, - current->right->token.value); + strcmp(current->left->token.value, + current->right->token.value); if (current->token.type == token_ge) current->value = current->value >= 0; else if (current->token.type == token_gt) @@ -1592,79 +1613,80 @@ current->value = current->value <= 0; else if (current->token.type == token_lt) current->value = current->value < 0; - else current->value = 0; /* Don't return -1 if unknown token */ + else + current->value = 0; /* Don't return -1 if unknown token */ #ifdef DEBUG_INCLUDE -rvputs(r, " Returning ", current->value ? "1" : "0", "\n", NULL); + rvputs(r, " Returning ", current->value ? "1" : "0", "\n", NULL); #endif current->done = 1; current = current->parent; break; - case token_not: - if (current->right != (struct parse_node *)NULL) { + case token_not: + if (current->right != (struct parse_node *) NULL) { if (!current->right->done) { current = current->right; continue; } current->value = !current->right->value; } - else { + else { current->value = 0; } #ifdef DEBUG_INCLUDE -rvputs(r, " Evaluate !: ", current->value ? "1" : "0", "\n", NULL); + rvputs(r, " Evaluate !: ", current->value ? "1" : "0", "\n", NULL); #endif current->done = 1; current = current->parent; break; - case token_group: - if (current->right != (struct parse_node *)NULL) { + case token_group: + if (current->right != (struct parse_node *) NULL) { if (!current->right->done) { current = current->right; continue; } current->value = current->right->value; } - else { + else { current->value = 1; } #ifdef DEBUG_INCLUDE -rvputs(r, " Evaluate (): ", current->value ? "1" : "0", "\n", NULL); + rvputs(r, " Evaluate (): ", current->value ? "1" : "0", "\n", NULL); #endif current->done = 1; current = current->parent; break; - case token_lbrace: + case token_lbrace: aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Unmatched '(' in \"%s\" in file %s", - expr, r->filename); + "Unmatched '(' in \"%s\" in file %s", + expr, r->filename); rputs(error, r); goto RETURN; - case token_rbrace: + case token_rbrace: aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "Unmatched ')' in \"%s\" in file %s\n", - expr, r->filename); + "Unmatched ')' in \"%s\" in file %s\n", + expr, r->filename); rputs(error, r); goto RETURN; - default: + default: aplog_error(APLOG_MARK, APLOG_ERR, r->server, "bad token type"); rputs(error, r); goto RETURN; } } - retval = (root == (struct parse_node *)NULL) ? 0 : root->value; -RETURN: + retval = (root == (struct parse_node *) NULL) ? 0 : root->value; + RETURN: destroy_pool(expr_pool); return (retval); -} +} -static int handle_if (FILE *in, request_rec *r, char *error, - int *conditional_status, int *printing) +static int handle_if(FILE *in, request_rec *r, char *error, + int *conditional_status, int *printing) { char tag[MAX_STRING_LEN]; char *tag_val = '\0'; @@ -1677,27 +1699,28 @@ else if (!strcmp(tag, "done")) { *printing = *conditional_status = parse_expr(r, expr, error); #ifdef DEBUG_INCLUDE - rvputs(r, "**** if conditional_status=\"", - *conditional_status ? "1" : "0", "\"\n", NULL); + rvputs(r, "**** if conditional_status=\"", + *conditional_status ? "1" : "0", "\"\n", NULL); #endif return 0; - } else if (!strcmp(tag, "expr")) { + } + else if (!strcmp(tag, "expr")) { expr = tag_val; #ifdef DEBUG_INCLUDE - rvputs(r, "**** if expr=\"", expr, "\"\n", NULL); + rvputs(r, "**** if expr=\"", expr, "\"\n", NULL); #endif } - else { + else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag if in %s", - tag, r->filename); + "unknown parameter \"%s\" to tag if in %s", + tag, r->filename); rputs(error, r); } } -} +} -static int handle_elif (FILE *in, request_rec *r, char *error, - int *conditional_status, int *printing) +static int handle_elif(FILE *in, request_rec *r, char *error, + int *conditional_status, int *printing) { char tag[MAX_STRING_LEN]; char *tag_val = '\0'; @@ -1709,43 +1732,44 @@ return 1; else if (!strcmp(tag, "done")) { #ifdef DEBUG_INCLUDE -rvputs(r, "**** elif conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); + rvputs(r, "**** elif conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); #endif if (*conditional_status) { *printing = 0; - return(0); + return (0); } *printing = *conditional_status = parse_expr(r, expr, error); #ifdef DEBUG_INCLUDE -rvputs(r, "**** elif conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); + rvputs(r, "**** elif conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); #endif return 0; - } else if (!strcmp(tag, "expr")) { + } + else if (!strcmp(tag, "expr")) { expr = tag_val; #ifdef DEBUG_INCLUDE -rvputs(r, "**** if expr=\"", expr, "\"\n", NULL); + rvputs(r, "**** if expr=\"", expr, "\"\n", NULL); #endif } - else { + else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "unknown parameter \"%s\" to tag if in %s", - tag, r->filename); + "unknown parameter \"%s\" to tag if in %s", + tag, r->filename); rputs(error, r); } } } -static int handle_else (FILE *in, request_rec *r, char *error, - int *conditional_status, int *printing) +static int handle_else(FILE *in, request_rec *r, char *error, + int *conditional_status, int *printing) { char tag[MAX_STRING_LEN]; char *tag_val; if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + return 1; else if (!strcmp(tag, "done")) { #ifdef DEBUG_INCLUDE -rvputs(r, "**** else conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); + rvputs(r, "**** else conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); #endif *printing = !(*conditional_status); *conditional_status = 1; @@ -1753,24 +1777,25 @@ } else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "else directive does not take tags"); + "else directive does not take tags"); if (*printing) rputs(error, r); return -1; } -} +} -static int handle_endif (FILE *in, request_rec *r, char *error, - int *conditional_status, int *printing) +static int handle_endif(FILE *in, request_rec *r, char *error, + int *conditional_status, int *printing) { char tag[MAX_STRING_LEN]; char *tag_val; if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) { return 1; - } else if (!strcmp(tag, "done")) { + } + else if (!strcmp(tag, "done")) { #ifdef DEBUG_INCLUDE -rvputs(r, "**** endif conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); + rvputs(r, "**** endif conditional_status=\"", *conditional_status ? "1" : "0", "\"\n", NULL); #endif *printing = 1; *conditional_status = 1; @@ -1778,41 +1803,42 @@ } else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "endif directive does not take tags"); + "endif directive does not take tags"); rputs(error, r); return -1; } -} +} -static int handle_set (FILE *in, request_rec *r, char *error) +static int handle_set(FILE *in, request_rec *r, char *error) { char tag[MAX_STRING_LEN]; char parsed_string[MAX_STRING_LEN]; char *tag_val; char *var; - var = (char *)NULL; + var = (char *) NULL; while (1) { if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + return 1; else if (!strcmp(tag, "done")) return 0; else if (!strcmp(tag, "var")) { var = tag_val; - } else if (!strcmp(tag, "value")) { - if (var == (char *)NULL) { + } + else if (!strcmp(tag, "value")) { + if (var == (char *) NULL) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "variable must precede value in set directive"); + "variable must precede value in set directive"); rputs(error, r); return -1; - } + } parse_string(r, tag_val, parsed_string, MAX_STRING_LEN, 0); - table_set (r->subprocess_env, var, parsed_string); + table_set(r->subprocess_env, var, parsed_string); } } -} +} -static int handle_printenv (FILE *in, request_rec *r, char *error) +static int handle_printenv(FILE *in, request_rec *r, char *error) { char tag[MAX_STRING_LEN]; char *tag_val; @@ -1820,19 +1846,19 @@ int i; if (!(tag_val = get_tag(r->pool, in, tag, MAX_STRING_LEN, 1))) - return 1; + return 1; else if (!strcmp(tag, "done")) { - for (i = 0; i < r->subprocess_env->nelts; ++i) - rvputs(r, elts[i].key, "=", elts[i].val, "\n", NULL); - return 0; + for (i = 0; i < r->subprocess_env->nelts; ++i) + rvputs(r, elts[i].key, "=", elts[i].val, "\n", NULL); + return 0; } else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "printenv directive does not take tags"); + "printenv directive does not take tags"); rputs(error, r); return -1; } -} +} @@ -1840,11 +1866,11 @@ /* This is a stub which parses a file descriptor. */ -static void send_parsed_content (FILE *f, request_rec *r) +static void send_parsed_content(FILE *f, request_rec *r) { char directive[MAX_STRING_LEN], error[MAX_STRING_LEN]; char timefmt[MAX_STRING_LEN]; - int noexec = allow_options (r) & OPT_INCNOEXEC; + int noexec = allow_options(r) & OPT_INCNOEXEC; int ret, sizefmt; int if_nesting; int printing; @@ -1860,57 +1886,64 @@ printing = conditional_status = 1; if_nesting = 0; - chdir_file (r->filename); - if (r->args) { /* add QUERY stuff to env cause it ain't yet */ - char *arg_copy = pstrdup (r->pool, r->args); - - table_set (r->subprocess_env, "QUERY_STRING", r->args); - unescape_url (arg_copy); - table_set (r->subprocess_env, "QUERY_STRING_UNESCAPED", - escape_shell_cmd (r->pool, arg_copy)); + chdir_file(r->filename); + if (r->args) { /* add QUERY stuff to env cause it ain't yet */ + char *arg_copy = pstrdup(r->pool, r->args); + + table_set(r->subprocess_env, "QUERY_STRING", r->args); + unescape_url(arg_copy); + table_set(r->subprocess_env, "QUERY_STRING_UNESCAPED", + escape_shell_cmd(r->pool, arg_copy)); } while (1) { if (!find_string(f, STARTING_SEQUENCE, r, printing)) { if (get_directive(f, directive, r->pool)) - return; + return; if (!strcmp(directive, "if")) { if (!printing) { if_nesting++; - } else { + } + else { ret = handle_if(f, r, error, &conditional_status, &printing); if_nesting = 0; } continue; - } else if (!strcmp(directive, "else")) { + } + else if (!strcmp(directive, "else")) { if (!if_nesting) ret = handle_else(f, r, error, &conditional_status, &printing); continue; - } else if (!strcmp(directive, "elif")) { + } + else if (!strcmp(directive, "elif")) { if (!if_nesting) ret = handle_elif(f, r, error, &conditional_status, &printing); continue; - } else if (!strcmp(directive, "endif")) { + } + else if (!strcmp(directive, "endif")) { if (!if_nesting) { ret = handle_endif(f, r, error, &conditional_status, &printing); - } else { + } + else { if_nesting--; } continue; - } + } if (!printing) continue; if (!strcmp(directive, "exec")) { if (noexec) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "httpd: exec used but not allowed in %s", - r->filename); + "httpd: exec used but not allowed in %s", + r->filename); if (printing) rputs(error, r); ret = find_string(f, ENDING_SEQUENCE, r, 0); - } else + } + else ret = handle_exec(f, r, error); - } else if (!strcmp(directive, "config")) + } + else if (!strcmp(directive, "config")) ret = handle_config(f, r, error, timefmt, &sizefmt); else if (!strcmp(directive, "set")) ret = handle_set(f, r, error); @@ -1925,24 +1958,25 @@ else if (!strcmp(directive, "printenv")) ret = handle_printenv(f, r, error); #ifdef USE_PERL_SSI - else if (!strcmp(directive, "perl")) + else if (!strcmp(directive, "perl")) ret = handle_perl(f, r, error); #endif else { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "httpd: unknown directive \"%s\" in parsed doc %s", - directive, r->filename); + "httpd: unknown directive \"%s\" in parsed doc %s", + directive, r->filename); if (printing) rputs(error, r); ret = find_string(f, ENDING_SEQUENCE, r, 0); } if (ret) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "httpd: premature EOF in parsed file %s", - r->filename); + "httpd: premature EOF in parsed file %s", + r->filename); return; } - } else + } + else return; } } @@ -1954,57 +1988,60 @@ */ module includes_module; -enum xbithack { xbithack_off, xbithack_on, xbithack_full }; +enum xbithack { + xbithack_off, xbithack_on, xbithack_full +}; -#ifdef XBITHACK +#ifdef XBITHACK #define DEFAULT_XBITHACK xbithack_full #else #define DEFAULT_XBITHACK xbithack_off #endif -static void *create_includes_dir_config (pool *p, char *dummy) +static void *create_includes_dir_config(pool *p, char *dummy) { - enum xbithack *result = (enum xbithack*)palloc(p, sizeof (enum xbithack)); + enum xbithack *result = (enum xbithack *) palloc(p, sizeof(enum xbithack)); *result = DEFAULT_XBITHACK; return result; } -static const char *set_xbithack (cmd_parms *cmd, void *xbp, char *arg) +static const char *set_xbithack(cmd_parms *cmd, void *xbp, char *arg) { - enum xbithack *state = (enum xbithack *)xbp; + enum xbithack *state = (enum xbithack *) xbp; - if (!strcasecmp (arg, "off")) + if (!strcasecmp(arg, "off")) *state = xbithack_off; - else if (!strcasecmp (arg, "on")) + else if (!strcasecmp(arg, "on")) *state = xbithack_on; - else if (!strcasecmp (arg, "full")) + else if (!strcasecmp(arg, "full")) *state = xbithack_full; - else return "XBitHack must be set to Off, On, or Full"; + else + return "XBitHack must be set to Off, On, or Full"; - return NULL; + return NULL; } -static int send_parsed_file (request_rec *r) +static int send_parsed_file(request_rec *r) { FILE *f; enum xbithack *state = - (enum xbithack *)get_module_config(r->per_dir_config, &includes_module); + (enum xbithack *) get_module_config(r->per_dir_config, &includes_module); int errstatus; - if (!(allow_options (r) & OPT_INCLUDES)) + if (!(allow_options(r) & OPT_INCLUDES)) return DECLINED; if (r->method_number != M_GET) return DECLINED; if (r->finfo.st_mode == 0) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, "File does not exist: %s", - r->path_info ? - pstrcat(r->pool, r->filename, r->path_info, NULL) : r->filename); + r->path_info ? + pstrcat(r->pool, r->filename, r->path_info, NULL) : r->filename); return NOT_FOUND; } if (!(f = pfopen(r->pool, r->filename, "r"))) { aplog_error(APLOG_MARK, APLOG_ERR, r->server, - "file permissions deny server access: %s", r->filename); + "file permissions deny server access: %s", r->filename); return FORBIDDEN; } @@ -2013,21 +2050,21 @@ /* OS/2 dosen't support Groups. */ && (r->finfo.st_mode & S_IXGRP) #endif - ) { - update_mtime(r, r->finfo.st_mtime); - set_last_modified(r); + ) { + update_mtime(r, r->finfo.st_mtime); + set_last_modified(r); } if ((errstatus = meets_conditions(r)) != OK) { - return errstatus; + return errstatus; } send_http_header(r); if (r->header_only) { - pfclose (r->pool, f); + pfclose(r->pool, f); return OK; } - + if (r->main) { /* Kludge --- for nested includes, we want to keep the * subprocess environment of the base document (for compatibility); @@ -2037,76 +2074,80 @@ */ r->subprocess_env = r->main->subprocess_env; r->finfo.st_mtime = r->main->finfo.st_mtime; - } else { - add_common_vars (r); + } + else { + add_common_vars(r); add_cgi_vars(r); - add_include_vars (r, DEFAULT_TIME_FORMAT); + add_include_vars(r, DEFAULT_TIME_FORMAT); } hard_timeout("send SSI", r); - send_parsed_content (f, r); - - kill_timeout (r); + send_parsed_content(f, r); + + kill_timeout(r); return OK; } -static int send_shtml_file (request_rec *r) +static int send_shtml_file(request_rec *r) { r->content_type = "text/html"; return send_parsed_file(r); } -static int xbithack_handler (request_rec *r) +static int xbithack_handler(request_rec *r) { #if defined(__EMX__) || defined(WIN32) /* OS/2 dosen't currently support the xbithack. This is being worked on. */ return DECLINED; #else enum xbithack *state; - + if (!(r->finfo.st_mode & S_IXUSR)) return DECLINED; - state = (enum xbithack *)get_module_config(r->per_dir_config, - &includes_module); - + state = (enum xbithack *) get_module_config(r->per_dir_config, + &includes_module); + if (*state == xbithack_off) return DECLINED; - return send_parsed_file (r); + return send_parsed_file(r); #endif } -static command_rec includes_cmds[] = { - { "XBitHack", set_xbithack, NULL, OR_OPTIONS, TAKE1, "Off, On, or Full" }, - { NULL } +static command_rec includes_cmds[] = +{ + {"XBitHack", set_xbithack, NULL, OR_OPTIONS, TAKE1, "Off, On, or Full"}, + {NULL} }; -static handler_rec includes_handlers[] = { - { INCLUDES_MAGIC_TYPE, send_shtml_file }, - { INCLUDES_MAGIC_TYPE3, send_shtml_file }, - { "server-parsed", send_parsed_file }, - { "text/html", xbithack_handler }, - { NULL } +static handler_rec includes_handlers[] = +{ + {INCLUDES_MAGIC_TYPE, send_shtml_file}, + {INCLUDES_MAGIC_TYPE3, send_shtml_file}, + {"server-parsed", send_parsed_file}, + {"text/html", xbithack_handler}, + {NULL} }; -module includes_module = { - STANDARD_MODULE_STUFF, - NULL, /* initializer */ - create_includes_dir_config, /* dir config creater */ - NULL, /* dir merger --- default is to override */ - NULL, /* server config */ - NULL, /* merge server config */ - includes_cmds, /* command table */ - includes_handlers, /* handlers */ - NULL, /* filename translation */ - NULL, /* check_user_id */ - NULL, /* check auth */ - NULL, /* check access */ - NULL, /* type_checker */ - NULL, /* fixups */ - NULL, /* logger */ - NULL, /* header parser */ - NULL, /* child_init */ - NULL, /* child_exit */ - NULL /* post read-request */ +module includes_module = +{ + STANDARD_MODULE_STUFF, + NULL, /* initializer */ + create_includes_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + includes_cmds, /* command table */ + includes_handlers, /* handlers */ + NULL, /* filename translation */ + NULL, /* check_user_id */ + NULL, /* check auth */ + NULL, /* check access */ + NULL, /* type_checker */ + NULL, /* fixups */ + NULL, /* logger */ + NULL, /* header parser */ + NULL, /* child_init */ + NULL, /* child_exit */ + NULL /* post read-request */ }; 1.24 +162 -150 apachen/src/modules/standard/mod_mime.c Index: mod_mime.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/standard/mod_mime.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- mod_mime.c 1997/08/18 13:12:15 1.23 +++ mod_mime.c 1997/09/18 18:49:39 1.24 @@ -64,48 +64,48 @@ #include "mod_mime.h" typedef struct { - table *forced_types; /* Additional AddTyped stuff */ - table *encoding_types; /* Added with AddEncoding... */ - table *language_types; /* Added with AddLanguage... */ - table *handlers; /* Added with AddHandler... */ + table *forced_types; /* Additional AddTyped stuff */ + table *encoding_types; /* Added with AddEncoding... */ + table *language_types; /* Added with AddLanguage... */ + table *handlers; /* Added with AddHandler... */ - char *type; /* Type forced with ForceType */ - char *handler; /* Handler forced with SetHandler */ + char *type; /* Type forced with ForceType */ + char *handler; /* Handler forced with SetHandler */ } mime_dir_config; module MODULE_VAR_EXPORT mime_module; -static void *create_mime_dir_config (pool *p, char *dummy) +static void *create_mime_dir_config(pool *p, char *dummy) { mime_dir_config *new = - (mime_dir_config *) palloc (p, sizeof(mime_dir_config)); + (mime_dir_config *) palloc(p, sizeof(mime_dir_config)); - new->forced_types = make_table (p, 4); - new->encoding_types = make_table (p, 4); - new->language_types = make_table (p, 4); - new->handlers = make_table (p, 4); + new->forced_types = make_table(p, 4); + new->encoding_types = make_table(p, 4); + new->language_types = make_table(p, 4); + new->handlers = make_table(p, 4); new->type = NULL; new->handler = NULL; - + return new; } -static void *merge_mime_dir_configs (pool *p, void *basev, void *addv) +static void *merge_mime_dir_configs(pool *p, void *basev, void *addv) { - mime_dir_config *base = (mime_dir_config *)basev; - mime_dir_config *add = (mime_dir_config *)addv; + mime_dir_config *base = (mime_dir_config *) basev; + mime_dir_config *add = (mime_dir_config *) addv; mime_dir_config *new = - (mime_dir_config *)palloc (p, sizeof(mime_dir_config)); + (mime_dir_config *) palloc(p, sizeof(mime_dir_config)); - new->forced_types = overlay_tables (p, add->forced_types, - base->forced_types); - new->encoding_types = overlay_tables (p, add->encoding_types, - base->encoding_types); - new->language_types = overlay_tables (p, add->language_types, - base->language_types); - new->handlers = overlay_tables (p, add->handlers, - base->handlers); + new->forced_types = overlay_tables(p, add->forced_types, + base->forced_types); + new->encoding_types = overlay_tables(p, add->encoding_types, + base->encoding_types); + new->language_types = overlay_tables(p, add->language_types, + base->language_types); + new->handlers = overlay_tables(p, add->handlers, + base->handlers); new->type = add->type ? add->type : base->type; new->handler = add->handler ? add->handler : base->handler; @@ -113,34 +113,38 @@ return new; } -static const char *add_type(cmd_parms *cmd, mime_dir_config *m, char *ct, char *ext) +static const char *add_type(cmd_parms *cmd, mime_dir_config * m, char *ct, char *ext) { - if (*ext == '.') ++ext; - table_set (m->forced_types, ext, ct); + if (*ext == '.') + ++ext; + table_set(m->forced_types, ext, ct); return NULL; } -static const char *add_encoding(cmd_parms *cmd, mime_dir_config *m, char *enc, - char *ext) +static const char *add_encoding(cmd_parms *cmd, mime_dir_config * m, char *enc, + char *ext) { - if (*ext == '.') ++ext; - table_set (m->encoding_types, ext, enc); + if (*ext == '.') + ++ext; + table_set(m->encoding_types, ext, enc); return NULL; } -static const char *add_language(cmd_parms *cmd, mime_dir_config *m, char *lang, - char *ext) +static const char *add_language(cmd_parms *cmd, mime_dir_config * m, char *lang, + char *ext) { - if (*ext == '.') ++ext; - table_set (m->language_types, ext, lang); + if (*ext == '.') + ++ext; + table_set(m->language_types, ext, lang); return NULL; } -static const char *add_handler(cmd_parms *cmd, mime_dir_config *m, char *hdlr, - char *ext) +static const char *add_handler(cmd_parms *cmd, mime_dir_config * m, char *hdlr, + char *ext) { - if (*ext == '.') ++ext; - table_set (m->handlers, ext, hdlr); + if (*ext == '.') + ++ext; + table_set(m->handlers, ext, hdlr); return NULL; } @@ -148,29 +152,30 @@ * the name of its config file, so... */ -static const char *set_types_config (cmd_parms *cmd, void *dummy, char *arg) +static const char *set_types_config(cmd_parms *cmd, void *dummy, char *arg) { - set_module_config (cmd->server->module_config, &mime_module, - pstrdup (cmd->pool, arg)); + set_module_config(cmd->server->module_config, &mime_module, + pstrdup(cmd->pool, arg)); return NULL; } -static command_rec mime_cmds[] = { -{ "AddType", add_type, NULL, OR_FILEINFO, ITERATE2, - "a mime type followed by one or more file extensions" }, -{ "AddEncoding", add_encoding, NULL, OR_FILEINFO, ITERATE2, - "an encoding (e.g., gzip), followed by one or more file extensions" }, -{ "AddLanguage", add_language, NULL, OR_FILEINFO, ITERATE2, - "a language (e.g., fr), followed by one or more file extensions" }, -{ "AddHandler", add_handler, NULL, OR_FILEINFO, ITERATE2, - "a handler name followed by one or more file extensions" }, -{ "ForceType", set_string_slot, (void*)XtOffsetOf(mime_dir_config, type), - OR_FILEINFO, TAKE1, "a media type" }, -{ "SetHandler", set_string_slot, (void*)XtOffsetOf(mime_dir_config, handler), - OR_FILEINFO, TAKE1, "a handler name" }, -{ "TypesConfig", set_types_config, NULL, RSRC_CONF, TAKE1, - "the MIME types config file" }, -{ NULL } +static command_rec mime_cmds[] = +{ + {"AddType", add_type, NULL, OR_FILEINFO, ITERATE2, + "a mime type followed by one or more file extensions"}, + {"AddEncoding", add_encoding, NULL, OR_FILEINFO, ITERATE2, + "an encoding (e.g., gzip), followed by one or more file extensions"}, + {"AddLanguage", add_language, NULL, OR_FILEINFO, ITERATE2, + "a language (e.g., fr), followed by one or more file extensions"}, + {"AddHandler", add_handler, NULL, OR_FILEINFO, ITERATE2, + "a handler name followed by one or more file extensions"}, + {"ForceType", set_string_slot, (void *) XtOffsetOf(mime_dir_config, type), + OR_FILEINFO, TAKE1, "a media type"}, + {"SetHandler", set_string_slot, (void *) XtOffsetOf(mime_dir_config, handler), + OR_FILEINFO, TAKE1, "a handler name"}, + {"TypesConfig", set_types_config, NULL, RSRC_CONF, TAKE1, + "the MIME types config file"}, + {NULL} }; /* Hash table --- only one of these per daemon; virtual hosts can @@ -182,37 +187,39 @@ static table *hash_buckets[MIME_HASHSIZE]; -static void init_mime (server_rec *s, pool *p) +static void init_mime(server_rec *s, pool *p) { FILE *f; char l[MAX_STRING_LEN]; int x; - char *types_confname = get_module_config (s->module_config, &mime_module); + char *types_confname = get_module_config(s->module_config, &mime_module); - if (!types_confname) types_confname = TYPES_CONFIG_FILE; + if (!types_confname) + types_confname = TYPES_CONFIG_FILE; - types_confname = server_root_relative (p, types_confname); + types_confname = server_root_relative(p, types_confname); - if(!(f = fopen(types_confname,"r"))) { + if (!(f = fopen(types_confname, "r"))) { perror("fopen"); - fprintf(stderr,"httpd: could not open mime types file %s\n", + fprintf(stderr, "httpd: could not open mime types file %s\n", types_confname); exit(1); } - for(x=0;x<27;x++) - hash_buckets[x] = make_table (p, 10); + for (x = 0; x < 27; x++) + hash_buckets[x] = make_table(p, 10); - while(!(cfg_getline(l,MAX_STRING_LEN,f))) { + while (!(cfg_getline(l, MAX_STRING_LEN, f))) { const char *ll = l, *ct; - - if(l[0] == '#') continue; - ct = getword_conf (p, &ll); - - while(ll[0]) { - char *ext = getword_conf (p, &ll); - str_tolower (ext); /* ??? */ - table_set (hash_buckets[hash(ext[0])], ext, ct); + + if (l[0] == '#') + continue; + ct = getword_conf(p, &ll); + + while (ll[0]) { + char *ext = getword_conf(p, &ll); + str_tolower(ext); /* ??? */ + table_set(hash_buckets[hash(ext[0])], ext, ct); } } fclose(f); @@ -223,73 +230,74 @@ { const char *fn = strrchr(r->filename, '/'); mime_dir_config *conf = - (mime_dir_config *)get_module_config(r->per_dir_config, &mime_module); + (mime_dir_config *) get_module_config(r->per_dir_config, &mime_module); char *ext, *type, *orighandler = r->handler; if (S_ISDIR(r->finfo.st_mode)) { r->content_type = DIR_MAGIC_TYPE; - return OK; + return OK; } /* TM -- FIXME - * + * if r->filename does not contain a '/', the following passes a null * pointer to getword, causing a SEGV .. */ - if(fn == NULL) fn = r->filename; + if (fn == NULL) + fn = r->filename; /* Parse filename extensions, which can be in any order */ while ((ext = getword(r->pool, &fn, '.')) && *ext) { - int found = 0; + int found = 0; + + /* Check for Content-Type */ + if ((type = table_get(conf->forced_types, ext)) + || (type = table_get(hash_buckets[hash(*ext)], ext))) { + r->content_type = type; + found = 1; + } + + /* Check for Content-Language */ + if ((type = table_get(conf->language_types, ext))) { + char **new; + + r->content_language = type; /* back compat. only */ + if (!r->content_languages) + r->content_languages = make_array(r->pool, 2, sizeof(char *)); + new = (char **) push_array(r->content_languages); + *new = type; + found = 1; + } - /* Check for Content-Type */ - if ((type = table_get (conf->forced_types, ext)) - || (type = table_get (hash_buckets[hash(*ext)], ext))) { - r->content_type = type; - found = 1; - } - - /* Check for Content-Language */ - if ((type = table_get (conf->language_types, ext))) { - char **new; - - r->content_language = type; /* back compat. only */ - if (!r->content_languages) - r->content_languages = make_array (r->pool, 2, sizeof(char*)); - new = (char **)push_array (r->content_languages); - *new = type; - found = 1; - } - - /* Check for Content-Encoding */ - if ((type = table_get (conf->encoding_types, ext))) { - if (!r->content_encoding) - r->content_encoding = type; - else - r->content_encoding = pstrcat(r->pool, r->content_encoding, - ", ", type, NULL); - found = 1; - } - - /* Check for a special handler, but not for proxy request */ - if ((type = table_get (conf->handlers, ext)) && !r->proxyreq) { - r->handler = type; - found = 1; - } - - /* This is to deal with cases such as foo.gif.bak, which we want - * to not have a type. So if we find an unknown extension, we - * zap the type/language/encoding and reset the handler - */ - - if (!found) { - r->content_type = NULL; - r->content_language = NULL; - r->content_languages = NULL; - r->content_encoding = NULL; - r->handler = orighandler; - } + /* Check for Content-Encoding */ + if ((type = table_get(conf->encoding_types, ext))) { + if (!r->content_encoding) + r->content_encoding = type; + else + r->content_encoding = pstrcat(r->pool, r->content_encoding, + ", ", type, NULL); + found = 1; + } + + /* Check for a special handler, but not for proxy request */ + if ((type = table_get(conf->handlers, ext)) && !r->proxyreq) { + r->handler = type; + found = 1; + } + + /* This is to deal with cases such as foo.gif.bak, which we want + * to not have a type. So if we find an unknown extension, we + * zap the type/language/encoding and reset the handler + */ + + if (!found) { + r->content_type = NULL; + r->content_language = NULL; + r->content_languages = NULL; + r->content_encoding = NULL; + r->handler = orighandler; + } } @@ -300,32 +308,36 @@ if (conf->handler && strcmp(conf->handler, "none")) r->handler = pstrdup(r->pool, conf->handler); - if (!r->content_type) return DECLINED; + if (!r->content_type) + return DECLINED; return OK; } API_EXPORT(int) mime_find_ct(request_rec *r) - { return find_ct(r); } +{ + return find_ct(r); +} -module MODULE_VAR_EXPORT mime_module = { - STANDARD_MODULE_STUFF, - init_mime, /* initializer */ - create_mime_dir_config, - merge_mime_dir_configs, - NULL, /* server config */ - NULL, /* merge server config */ - mime_cmds, - NULL, /* handlers */ - NULL, /* filename translation */ - NULL, /* check_user_id */ - NULL, /* check auth */ - NULL, /* check access */ - find_ct, /* type_checker */ - NULL, /* fixups */ - NULL, /* logger */ - NULL, /* header parser */ - NULL, /* child_init */ - NULL, /* child_exit */ - NULL /* post read-request */ +module MODULE_VAR_EXPORT mime_module = +{ + STANDARD_MODULE_STUFF, + init_mime, /* initializer */ + create_mime_dir_config, + merge_mime_dir_configs, + NULL, /* server config */ + NULL, /* merge server config */ + mime_cmds, + NULL, /* handlers */ + NULL, /* filename translation */ + NULL, /* check_user_id */ + NULL, /* check auth */ + NULL, /* check access */ + find_ct, /* type_checker */ + NULL, /* fixups */ + NULL, /* logger */ + NULL, /* header parser */ + NULL, /* child_init */ + NULL, /* child_exit */ + NULL /* post read-request */ };