summaryrefslogtreecommitdiffstats
path: root/server/core.c
diff options
context:
space:
mode:
authorStefan Fritsch <sf@apache.org>2011-01-20 19:37:47 +0100
committerStefan Fritsch <sf@apache.org>2011-01-20 19:37:47 +0100
commit58f17628acc2446d1811095b38fdcbb1357d6d55 (patch)
tree98c6a49f2cb94f90ba7c282d982cc4404e48fdfc /server/core.c
parentRebuild transformations. (diff)
downloadapache2-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.c89
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;