diff options
author | Stefan Fritsch <sf@apache.org> | 2011-01-20 19:37:47 +0100 |
---|---|---|
committer | Stefan Fritsch <sf@apache.org> | 2011-01-20 19:37:47 +0100 |
commit | 58f17628acc2446d1811095b38fdcbb1357d6d55 (patch) | |
tree | 98c6a49f2cb94f90ba7c282d982cc4404e48fdfc /server/core.c | |
parent | Rebuild transformations. (diff) | |
download | apache2-58f17628acc2446d1811095b38fdcbb1357d6d55.tar.xz apache2-58f17628acc2446d1811095b38fdcbb1357d6d55.zip |
Move ap_resolve_env to core.c, in preparation for adding mod_define-like
variable support.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1061444 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'server/core.c')
-rw-r--r-- | server/core.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/server/core.c b/server/core.c index 88cf84b7fd..a9cf7d4686 100644 --- a/server/core.c +++ b/server/core.c @@ -1087,6 +1087,95 @@ static const char *set_access_name(cmd_parms *cmd, void *dummy, return NULL; } +/* 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, leave the ${ENV} + * construct alone; it means something else. + */ +AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word) +{ +# define SMALL_EXPANSION 5 + struct sll { + struct sll *next; + const char *string; + apr_size_t len; + } *result, *current, sresult[SMALL_EXPANSION]; + char *res_buf, *cp; + const char *s, *e, *ep; + unsigned spc; + apr_size_t outlen; + + s = ap_strchr_c(word, '$'); + if (!s) { + return word; + } + + /* well, actually something to do */ + ep = word + strlen(word); + spc = 0; + result = current = &(sresult[spc++]); + current->next = NULL; + current->string = word; + current->len = s - word; + outlen = current->len; + + do { + /* prepare next entry */ + if (current->len) { + current->next = (spc < SMALL_EXPANSION) + ? &(sresult[spc++]) + : (struct sll *)apr_palloc(p, + sizeof(*current->next)); + current = current->next; + current->next = NULL; + current->len = 0; + } + + if (*s == '$') { + if (s[1] == '{' && (e = ap_strchr_c(s, '}'))) { + word = getenv(apr_pstrndup(p, s+2, e-s-2)); + if (word) { + current->string = word; + current->len = strlen(word); + outlen += current->len; + } + else { + current->string = s; + current->len = e - s + 1; + outlen += current->len; + } + s = e + 1; + } + else { + current->string = s++; + current->len = 1; + ++outlen; + } + } + else { + word = s; + s = ap_strchr_c(s, '$'); + current->string = word; + current->len = s ? s - word : ep - word; + outlen += current->len; + } + } while (s && *s); + + /* assemble result */ + res_buf = cp = apr_palloc(p, outlen + 1); + do { + if (result->len) { + memcpy(cp, result->string, result->len); + cp += result->len; + } + result = result->next; + } while (result); + res_buf[outlen] = '\0'; + + return res_buf; +} + static int reset_config_defines(void *dummy) { ap_server_config_defines = saved_server_config_defines; |