AP_DECLARE_DATA const char *ap_server_argv0 = NULL;
AP_DECLARE_DATA const char *ap_server_root = NULL;
+AP_DECLARE_DATA const char *ap_runtime_dir = NULL;
AP_DECLARE_DATA server_rec *ap_server_conf = NULL;
AP_DECLARE_DATA apr_pool_t *ap_pglobal = NULL;
APR_HOOK_LINK(quick_handler)
APR_HOOK_LINK(optional_fn_retrieve)
APR_HOOK_LINK(test_config)
+ APR_HOOK_LINK(open_htaccess)
)
AP_IMPLEMENT_HOOK_RUN_ALL(int, header_parser,
apr_hook_debug_show("post_config", aszPre, aszSucc);
}
-AP_DECLARE(apr_array_header_t *) ap_hook_get_post_config(void) {
+AP_DECLARE(apr_array_header_t *) ap_hook_get_post_config(void)
+{
return _hooks.link_post_config;
}
ap_LINK_post_config_t *pHook;
int n;
- if(!_hooks.link_post_config)
+ if (!_hooks.link_post_config)
return;
pHook = (ap_LINK_post_config_t *)_hooks.link_post_config->elts;
AP_IMPLEMENT_HOOK_RUN_FIRST(int, quick_handler, (request_rec *r, int lookup),
(r, lookup), DECLINED)
+AP_IMPLEMENT_HOOK_RUN_FIRST(apr_status_t, open_htaccess,
+ (request_rec *r, const char *dir_name, const char *access_name,
+ ap_configfile_t **conffile, const char **full_name),
+ (r, dir_name, access_name, conffile, full_name),
+ AP_DECLINED)
+
/* hooks with no args are implemented last, after disabling APR hook probes */
#if defined(APR_HOOK_PROBES_ENABLED)
#undef APR_HOOK_PROBES_ENABLED
return OK;
}
-/*
- * TODO: Move this to an appropriate include file and possibly prefix it
- * with AP_.
- */
-#define DEFAULT_HANDLER_NAME ""
-
AP_CORE_DECLARE(int) ap_invoke_handler(request_rec *r)
{
const char *handler;
}
}
else {
- handler = DEFAULT_HANDLER_NAME;
+ handler = AP_DEFAULT_HANDLER_NAME;
}
r->handler = handler;
len -= slen;
}
- ap_module_short_names[m->module_index] = strdup(sym_name);
+ ap_module_short_names[m->module_index] = ap_malloc(len + 1);
+ memcpy(ap_module_short_names[m->module_index], sym_name, len);
ap_module_short_names[m->module_index][len] = '\0';
merger_func_cache[m->module_index] = m->merge_dir_config;
}
/* We cannot fix the string in-place, because it's const */
if (m->name[strlen(m->name)-1] == ')') {
- char *tmp = strdup(m->name); /* FIXME: memory leak, albeit a small one */
- tmp[strlen(tmp)-1] = '\0';
+ char *tmp = ap_malloc(strlen(m->name)); /* FIXME: memory leak, albeit a small one */
+ memcpy(tmp, m->name, strlen(m->name)-1);
+ tmp[strlen(m->name)-1] = '\0';
m->name = tmp;
}
#endif /*_OSD_POSIX*/
char *w, *w2, *w3;
const char *errmsg = NULL;
- /** Have we been provided a list of acceptable directives? */
- if(parms->override_list != NULL)
- if(apr_table_get(parms->override_list, cmd->name) != NULL)
+ /* Have we been provided a list of acceptable directives? */
+ if (parms->override_list != NULL) {
+ if (apr_table_get(parms->override_list, cmd->name) != NULL) {
override_list_ok = 1;
+ }
+ }
if ((parms->override & cmd->req_override) == 0 && !override_list_ok) {
if (parms->override & NONFATAL_OVERRIDE) {
return cmd->AP_TAKE3(parms, mconfig, w, w2, w3);
case ITERATE:
- while (*(w = ap_getword_conf(parms->pool, &args)) != '\0') {
+ w = ap_getword_conf(parms->pool, &args);
+
+ if (*w == '\0')
+ return apr_pstrcat(parms->pool, cmd->name,
+ " requires at least one argument",
+ cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL);
+ while (*w != '\0') {
errmsg = cmd->AP_TAKE1(parms, mconfig, w);
if (errmsg && strcmp(errmsg, DECLINE_CMD) != 0)
return errmsg;
+
+ w = ap_getword_conf(parms->pool, &args);
}
return errmsg;
return errmsg;
case FLAG:
- w = ap_getword_conf(parms->pool, &args);
+ /*
+ * This is safe to use temp_pool here, because the 'flag' itself is not
+ * forwarded as-is
+ */
+ w = ap_getword_conf(parms->temp_pool, &args);
if (*w == '\0' || (strcasecmp(w, "on") && strcasecmp(w, "off")))
return apr_pstrcat(parms->pool, cmd->name, " must be On or Off",
*/
last_ptr = &(current->last);
- if(last_ptr && *last_ptr) {
+ if (last_ptr && *last_ptr) {
current = *last_ptr;
}
current = current->next;
}
- if(last_ptr) {
+ if (last_ptr) {
/* update cached pointer to last node */
*last_ptr = current;
}
}
}
+AP_DECLARE(char *) ap_runtime_dir_relative(apr_pool_t *p, const char *file)
+{
+ char *newpath = NULL;
+ apr_status_t rv;
+ const char *runtime_dir = ap_runtime_dir ? ap_runtime_dir : ap_server_root_relative(p, DEFAULT_REL_RUNTIMEDIR);
+
+ rv = apr_filepath_merge(&newpath, runtime_dir, file,
+ APR_FILEPATH_TRUENAME, p);
+ if (newpath && (rv == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rv)
+ || APR_STATUS_IS_ENOENT(rv)
+ || APR_STATUS_IS_ENOTDIR(rv))) {
+ return newpath;
+ }
+ else {
+ return NULL;
+ }
+}
+
+
AP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive)
{
struct ap_varbuf vb;
ap_varbuf_init(cmd->temp_pool, &vb, VARBUF_INIT_LEN);
- while((rc = ap_varbuf_cfg_getline(&vb, cmd->config_file, max_len))
- == APR_SUCCESS) {
-#if RESOLVE_ENV_PER_TOKEN
+ while ((rc = ap_varbuf_cfg_getline(&vb, cmd->config_file, max_len))
+ == APR_SUCCESS) {
args = vb.buf;
-#else
- args = ap_resolve_env(cmd->temp_pool, vb.buf);
-#endif
cmd_name = ap_getword_conf(cmd->temp_pool, &args);
if (cmd_name[0] == '<') {
rv = ap_pcfg_openfile(&cfp, p, fname);
if (rv != APR_SUCCESS) {
- char errmsg[120];
- return apr_psprintf(p, "Could not open configuration file %s: %s",
- fname, apr_strerror(rv, errmsg, sizeof errmsg));
+ return apr_psprintf(p, "Could not open configuration file %s: %pm",
+ fname, &rv);
}
parms.config_file = cfp;
*/
rv = apr_dir_open(&dirp, path, ptemp);
if (rv != APR_SUCCESS) {
- char errmsg[120];
- return apr_psprintf(p, "Could not open config directory %s: %s",
- path, apr_strerror(rv, errmsg, sizeof errmsg));
+ return apr_psprintf(p, "Could not open config directory %s: %pm",
+ path, &rv);
}
candidates = apr_array_make(ptemp, 1, sizeof(fnames));
/* find the first part of the filename */
rest = ap_strchr_c(fname, '/');
if (rest) {
- fname = apr_pstrndup(ptemp, fname, rest - fname);
+ fname = apr_pstrmemdup(ptemp, fname, rest - fname);
rest++;
}
*/
rv = apr_dir_open(&dirp, path, ptemp);
if (rv != APR_SUCCESS) {
- char errmsg[120];
- return apr_psprintf(p, "Could not open config directory %s: %s",
- path, apr_strerror(rv, errmsg, sizeof errmsg));
+ return apr_psprintf(p, "Could not open config directory %s: %pm",
+ path, &rv);
}
candidates = apr_array_make(ptemp, 1, sizeof(fnames));
}
if (!apr_fnmatch_test(fname)) {
- return ap_process_resource_config(s, fname, conftree, p, ptemp);
+ return process_resource_config_nofnmatch(s, fname, conftree, p, ptemp, 0, optional);
}
else {
apr_status_t status;
return OK;
}
+apr_status_t ap_open_htaccess(request_rec *r, const char *dir_name,
+ const char *access_name,
+ ap_configfile_t **conffile,
+ const char **full_name)
+{
+ *full_name = ap_make_full_path(r->pool, dir_name, access_name);
+ return ap_pcfg_openfile(conffile, r->pool, *full_name);
+}
+
AP_CORE_DECLARE(int) ap_parse_htaccess(ap_conf_vector_t **result,
request_rec *r, int override,
int override_opts, apr_table_t *override_list,
- const char *d, const char *access_name)
+ const char *d, const char *access_names)
{
ap_configfile_t *f = NULL;
cmd_parms parms;
- char *filename = NULL;
+ const char *filename;
const struct htaccess_result *cache;
struct htaccess_result *new;
ap_conf_vector_t *dc = NULL;
parms.path = apr_pstrdup(r->pool, d);
/* loop through the access names and find the first one */
- while (access_name[0]) {
- /* AFAICT; there is no use of the actual 'filename' against
- * any canonicalization, so we will simply take the given
- * name, ignoring case sensitivity and aliases
- */
- filename = ap_make_full_path(r->pool, d,
- ap_getword_conf(r->pool, &access_name));
- status = ap_pcfg_openfile(&f, r->pool, filename);
+ while (access_names[0]) {
+ const char *access_name = ap_getword_conf(r->pool, &access_names);
+ filename = NULL;
+ status = ap_run_open_htaccess(r, d, access_name, &f, &filename);
if (status == APR_SUCCESS) {
const char *errmsg;
ap_directive_t *temptree = NULL;