old_end_token = cmd->end_token;
cmd->end_token = thiscmd->cmd_data ? end_directorymatch_section : end_directory_section;
- ap_walk_config(NULL, cmd, new_dir_conf, 1);
+ errmsg = ap_walk_config(NULL, cmd, new_dir_conf, 1);
cmd->end_token = old_end_token;
+ if (errmsg != NULL)
+ return errmsg;
conf = (core_dir_config *)ap_get_module_config(new_dir_conf, &core_module);
conf->r = r;
cmd->end_token = thiscmd->cmd_data ? end_locationmatch_section
: end_location_section;
- ap_walk_config(NULL, cmd, new_url_conf, 1);
- cmd->end_token = old_end_token;
+ errmsg = ap_walk_config(NULL, cmd, new_url_conf, 1);
+ cmd->end_token = old_end_token;
+ if (errmsg != NULL)
+ return errmsg;
conf = (core_dir_config *)ap_get_module_config(new_url_conf, &core_module);
conf->d = ap_pstrdup(cmd->pool, cmd->path); /* No mangling, please */
old_end_token = cmd->end_token;
cmd->end_token = thiscmd->cmd_data ? end_filesmatch_section : end_files_section;
- ap_walk_config(NULL, cmd, new_file_conf, 1);
+ errmsg = ap_walk_config(NULL, cmd, new_file_conf, 1);
cmd->end_token = old_end_token;
+ if (errmsg != NULL)
+ return errmsg;
conf = (core_dir_config *)ap_get_module_config(new_file_conf,
&core_module);
static const char *start_ifmod(cmd_parms *cmd, void *dummy, char *arg)
{
char *endp = strrchr(arg, '>');
- char l[MAX_STRING_LEN];
int not = (arg[0] == '!');
module *found;
- int nest = 1;
if (endp == NULL) {
return unclosed_directive(cmd);
found = ap_find_linked_module(arg);
if ((!not && found) || (not && !found)) {
- ap_walk_config(NULL, cmd, cmd->server->lookup_defaults, 1);
- return NULL;
+ return ap_walk_config(NULL, cmd, cmd->server->lookup_defaults, 1);
}
+
+ return NULL;
}
API_EXPORT(int) ap_exists_config_define(char *name)
static const char *start_ifdefine(cmd_parms *cmd, void *dummy, char *arg)
{
char *endp;
- char l[MAX_STRING_LEN];
int defined;
int not = 0;
- int nest = 1;
endp = strrchr(arg, '>');
if (endp == NULL) {
defined = ap_exists_config_define(arg);
if ((!not && defined) || (not && !defined)) {
- ap_walk_config(NULL, cmd, dummy, 1);
- return NULL;
+ return ap_walk_config(NULL, cmd, dummy, 1);
}
+
+ return NULL;
}
/* httpd.conf commands... beginning with the <VirtualHost> business */
cmd->end_token = end_virtualhost_section;
cmd->server = s;
- ap_walk_config(NULL, cmd, s->lookup_defaults, 1);
+ errmsg = ap_walk_config(NULL, cmd, s->lookup_defaults, 1);
cmd->end_token = old_end_token;
cmd->server = main_server;
- if (errmsg == end_virtualhost_section) {
- return NULL;
- }
return errmsg;
}
return mconfig;
}
-CORE_EXPORT(void) ap_build_config_sub(cmd_parms *parms, const char *l, ap_directive_t **current, ap_directive_t **curr_parent)
+static const char * ap_build_config_sub(cmd_parms *parms, const char *l,
+ ap_directive_t **current,
+ ap_directive_t **curr_parent)
{
const char *args, *cmd_name;
ap_directive_t *newdir;
if ((l[0] == '#') || (!l[0]))
- return;
+ return NULL;
#if RESOLVE_ENV_PER_TOKEN
args = l;
#endif
cmd_name = ap_getword_conf(parms->temp_pool, &args);
if (*cmd_name == '\0')
- return;
+ return NULL;
newdir = ap_pcalloc(parms->pool, sizeof(ap_directive_t));
newdir->line_num = parms->config_file->line_number;
else {
*current = ap_add_node(curr_parent, *current, newdir, 0);
}
+
+ return NULL;
}
-API_EXPORT(const char *)ap_walk_config_sub(ap_directive_t *current, cmd_parms *parms, void *config)
+static const char *ap_walk_config_sub(ap_directive_t *current,
+ cmd_parms *parms, void *config)
{
void *oldconfig;
const command_rec *cmd;
} while (retval && !strcmp(retval, DECLINE_CMD));
parms->context = oldconfig;
- if (retval) {
- ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
- "Syntax error on line %d of %s:",
- parms->config_file->line_number, parms->config_file->name);
- ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
- "%s", retval);
- exit(1);
- }
+ return retval;
}
-API_EXPORT(const char *)ap_walk_config(ap_directive_t *conftree, cmd_parms *parms, void *config, int container)
+API_EXPORT(const char *) ap_walk_config(ap_directive_t *conftree,
+ cmd_parms *parms, void *config,
+ int container)
{
static ap_directive_t *current;
}
while (current != NULL) {
+ const char *errmsg;
+
/* actually parse the command and execute the correct function */
- ap_walk_config_sub(current, parms, config);
+ errmsg = ap_walk_config_sub(current, parms, config);
+ if (errmsg != NULL)
+ return errmsg;
if (current->next == NULL) {
current = current->parent;
continue;
}
}
+
+ return NULL;
}
-API_EXPORT(ap_directive_t *) ap_build_config(cmd_parms *parms, ap_directive_t *current)
+API_EXPORT(const char *) ap_build_config(cmd_parms *parms,
+ ap_directive_t **conftree)
{
+ ap_directive_t *current = NULL;
ap_directive_t *curr_parent = NULL;
- ap_directive_t *cfg_root = NULL;
char l[MAX_STRING_LEN];
+ *conftree = NULL;
+
while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) {
- ap_build_config_sub(parms, l, ¤t, &curr_parent);
- if (cfg_root == NULL && current != NULL) {
- cfg_root = current;
+ const char *errmsg;
+
+ errmsg = ap_build_config_sub(parms, l, ¤t, &curr_parent);
+ if (errmsg != NULL)
+ return errmsg;
+
+ if (*conftree == NULL && current != NULL) {
+ *conftree = current;
}
}
- return cfg_root;
+ return NULL;
}
/*
const char *errmsg;
cmd_parms parms;
arr_elts_param_t arr_parms;
+ ap_directive_t *conftree;
arr_parms.curr_idx = 0;
arr_parms.array = arr;
parms.config_file = ap_pcfg_open_custom(p, "-c/-C directives",
&arr_parms, NULL,
arr_elts_getstr, arr_elts_close);
-/*
- errmsg = ap_build_config(&parms, s->lookup_defaults);
+ errmsg = ap_build_config(&parms, &conftree);
+ if (errmsg == NULL)
+ errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults, 0);
if (errmsg) {
ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
"Syntax error in -C/-c directive:\n%s", errmsg);
}
ap_cfg_closefile(parms.config_file);
-*/
}
void ap_process_resource_config(server_rec *s, const char *fname, ap_pool_t *p, ap_pool_t *ptemp)
{
cmd_parms parms;
ap_finfo_t finfo;
- ap_directive_t *current = NULL;
+ ap_directive_t *conftree;
+ const char *errmsg;
fname = ap_server_root_relative(p, fname);
exit(1);
}
- current = ap_build_config(&parms, NULL);
- ap_walk_config(current, &parms, s->lookup_defaults, 0);
+ errmsg = ap_build_config(&parms, &conftree);
+ if (errmsg == NULL)
+ errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults, 0);
+
+ if (errmsg != NULL) {
+ /* ### wrong line number. need to pull from ap_directive_t */
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+ "Syntax error on line %d of %s:",
+ parms.config_file->line_number, parms.config_file->name);
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL,
+ "%s", errmsg);
+ exit(1);
+ }
ap_cfg_closefile(parms.config_file);
}
{
configfile_t *f = NULL;
cmd_parms parms;
- const char *errmsg = NULL;
char *filename = NULL;
const struct htaccess_result *cache;
struct htaccess_result *new;
void *dc = NULL;
ap_status_t status;
- ap_directive_t *htaccess_tree = NULL;
/* firstly, search cache */
for (cache = r->htaccess; cache != NULL; cache = cache->next)
status = ap_pcfg_openfile(&f, r->pool, filename);
if (status == APR_SUCCESS) {
+ const char *errmsg;
+ ap_directive_t *conftree;
dc = ap_create_per_dir_config(r->pool);
parms.config_file = f;
- htaccess_tree = ap_build_config(&parms, NULL);
- ap_walk_config(htaccess_tree, &parms, dc, 0);
+ errmsg = ap_build_config(&parms, &conftree);
+ if (errmsg == NULL)
+ errmsg = ap_walk_config(conftree, &parms, dc, 0);
ap_cfg_closefile(f);
}
*result = dc;
break;
- }
- else if (status != APR_ENOENT && status != APR_ENOTDIR) {
- ap_log_rerror(APLOG_MARK, APLOG_CRIT, errno, r,
- "%s pcfg_openfile: unable to check htaccess file, "
- "ensure it is readable",
- filename);
- ap_table_setn(r->notes, "error-notes",
- "Server unable to read htaccess file, denying "
- "access to be safe");
- return HTTP_FORBIDDEN;
+ } else {
+ ap_status_t cerr = ap_canonical_error(status);
+
+ if (cerr != APR_ENOENT && cerr != APR_ENOTDIR) {
+ ap_log_rerror(APLOG_MARK, APLOG_CRIT, status, r,
+ "%s pcfg_openfile: unable to check htaccess file, "
+ "ensure it is readable",
+ filename);
+ ap_table_setn(r->notes, "error-notes",
+ "Server unable to read htaccess file, denying "
+ "access to be safe");
+ return HTTP_FORBIDDEN;
+ }
}
}