httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dirk-Willem van Gulik <di...@webweaving.org>
Subject [PATCH] add simple ${ENV} substitution during config file read
Date Thu, 26 Sep 2002 00:46:42 GMT

In the department of scratching old itches - any strong objections to me
adding the following patch which allows one to do things like

	# httpd.conf
	ServerRoot ${HOME}/apache
	Port ${PORT:=80}
	ErrorDocument 500 "Please contact ${CUSTOMER}

and then

	CUSTOMER=fred@foo.com PORT=1234 ./apachectl start

as few, if any, people use ${FOO} constructs in their configuration files
today - the change is rather harmless.

But I've found this useful (since 1.3.9 :-).

Objections ?

Dw

? http_main.c-with-mtext
Index: http_core.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/http_core.c,v
retrieving revision 1.316
diff -u -r1.316 http_core.c
--- http_core.c	21 Sep 2002 17:18:34 -0000	1.316
+++ http_core.c	26 Sep 2002 00:45:53 -0000
@@ -1258,6 +1258,8 @@
 			  w, NULL);
     }

+    line = ap_resolve_env(cmd->pool,line);
+
     /* The entry should be ignored if it is a full URL for a 401 error */

     if (error_number == 401 &&
Index: util.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/util.c,v
retrieving revision 1.206
diff -u -r1.206 util.c
--- util.c	18 Jun 2002 00:59:58 -0000	1.206
+++ util.c	26 Sep 2002 00:45:55 -0000
@@ -756,6 +756,49 @@
     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. Apart from that
+ * simple ${ENV:=defaults} are also possible.
+ */
+API_EXPORT(char *) ap_resolve_env(pool *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,'}'))) {
+			char * dfault = "";
+                        *e = '\0';
+			if ((dfault = strchr(s,':')) && ((dfault[1] == '='))) {
+				*dfault = '\0';
+				dfault +=2;
+			}
+                        word = e + 1;
+                        e = getenv(s+2);
+                        strcat(tmp,e ? e : dfault);
+               } else {
+                       /* ignore invalid strings */
+                       word = s+1;
+                       strcat(tmp,"$");
+               };
+       } while ((s=strchr(word,'$')));
+       strcat(tmp,word);
+
+       return ap_pstrdup(p,tmp);
+}
+
 /* Get a word, (new) config-file style --- quoted strings and backslashes
  * all honored
  */
@@ -775,7 +818,7 @@
     }

     *resp++ = '\0';
-    return result;
+    return ap_resolve_env(p, result);
 }

 API_EXPORT(char *) ap_getword_conf_nc(pool *p, char **line)


Mime
View raw message