From 99a9d6e3e02dcd0d996097e8c4d23a39c5dbbf44 Mon Sep 17 00:00:00 2001 From: Dirk-Willem van Gulik Date: Tue, 14 Mar 2000 14:09:52 +0000 Subject: [PATCH] Another one in the department of fairly useless patches which are best described as feature creep. Allows ${ENV} constructs in the config file. This avoids the need for mod_perl or m4 cleverness whilst mainting some of the usefullness. It does not do (of course) multiline things or anything that clever. Feel free to flame me. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@84765 13f79535-47bb-0310-9956-ffa450edef68 --- include/httpd.h | 1 + server/config.c | 8 ++++++++ server/util.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/include/httpd.h b/include/httpd.h index 3c33893dd4..23eef47205 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -918,6 +918,7 @@ API_EXPORT(char *) ap_getword_nulls(ap_context_t *p, const char **line, char sto API_EXPORT(char *) ap_getword_nulls_nc(ap_context_t *p, char **line, char stop); API_EXPORT(char *) ap_getword_conf(ap_context_t *p, const char **line); API_EXPORT(char *) ap_getword_conf_nc(ap_context_t *p, char **line); +API_EXPORT(char *) ap_resolve_env(ap_context_t *p, const char * word); API_EXPORT(const char *) ap_size_list_item(const char **field, int *len); API_EXPORT(char *) ap_get_list_item(ap_context_t *p, const char **field); diff --git a/server/config.c b/server/config.c index 4ab6437671..cc1d0f244b 100644 --- a/server/config.c +++ b/server/config.c @@ -636,6 +636,9 @@ static const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms, switch (cmd->args_how) { case RAW_ARGS: +#ifdef RESOLVE_ENV_PER_TOKEN + args = ap_resolve_env(parms->pool,args); +#endif return ((const char *(*)(cmd_parms *, void *, const char *)) (cmd->func)) (parms, mconfig, args); @@ -829,6 +832,7 @@ CORE_EXPORT(void *) ap_set_config_vectors(cmd_parms *parms, void *config, module return mconfig; } + CORE_EXPORT(const char *) ap_handle_command(cmd_parms *parms, void *config, const char *l) { void *oldconfig; @@ -839,7 +843,11 @@ CORE_EXPORT(const char *) ap_handle_command(cmd_parms *parms, void *config, cons if ((l[0] == '#') || (!l[0])) return NULL; +#if RESOLVE_ENV_PER_TOKEN args = l; +#else + args = ap_resolve_env(parms->temp_pool,l); +#endif cmd_name = ap_getword_conf(parms->temp_pool, &args); if (*cmd_name == '\0') return NULL; diff --git a/server/util.c b/server/util.c index 063359f01d..2260af249c 100644 --- a/server/util.c +++ b/server/util.c @@ -706,7 +706,11 @@ static char *substring_conf(ap_context_t *p, const char *start, int len, char qu } *resp++ = '\0'; +#if RESOLVE_ENV_PER_TOKEN + return ap_resolve_env(p,result); +#else return result; +#endif } API_EXPORT(char *) ap_getword_conf_nc(ap_context_t *p, char **line) @@ -755,6 +759,41 @@ API_EXPORT(char *) ap_getword_conf(ap_context_t *p, const char **line) return res; } +/* Check a string for any ${ENV} environment variable + * construct and replace each them by the value of + * that environment variable, if it exists. If the + * environment value does not exist, replace by an + * empty string. Any unrecognized construct is not + * replaced and silently ignored. + */ +API_EXPORT(char *) ap_resolve_env(ap_context_t *p, const char * word) +{ + char tmp[ MAX_STRING_LEN ]; + char * s, * e; + tmp[0] = '\0'; + + if (!(s=strchr(word,'$'))) + return (char *)word; + + do { + /* XXX - relies on strncat() to add '\0' + */ + strncat(tmp,word,s - word); + if ((s[1] == '{') && (e=strchr(s,'}'))) { + *e = '\0'; + word = e + 1; + e = getenv(s+2); + strcat(tmp,e ? e : ""); + } else { + /* ignore invalid strings */ + word = s+1; + strcat(tmp,"$"); + }; + } while ((s=strchr(word,'$'))); + strcat(tmp,word); + + return ap_pstrdup(p,tmp); +} API_EXPORT(int) ap_cfg_closefile(configfile_t *cfp) { #ifdef DEBUG -- 2.40.0