dovecot-2.0: var_expand(): Added support for built-in host, pid ...

dovecot at dovecot.org dovecot at dovecot.org
Wed Dec 23 01:19:17 EET 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/e1b725d02c30
changeset: 10526:e1b725d02c30
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Dec 22 18:18:55 2009 -0500
description:
var_expand(): Added support for built-in host, pid and env:* variables.

diffstat:

5 files changed, 86 insertions(+), 12 deletions(-)
src/lib/Makefile.am       |    3 +-
src/lib/test-lib.c        |    1 
src/lib/test-lib.h        |    1 
src/lib/test-var-expand.c |   43 ++++++++++++++++++++++++++++++++++++++
src/lib/var-expand.c      |   50 +++++++++++++++++++++++++++++++++++----------

diffs (155 lines):

diff -r c3d85a07888c -r e1b725d02c30 src/lib/Makefile.am
--- a/src/lib/Makefile.am	Tue Dec 22 18:12:33 2009 -0500
+++ b/src/lib/Makefile.am	Tue Dec 22 18:18:55 2009 -0500
@@ -238,7 +238,8 @@ test_lib_SOURCES = \
 	test-str-find.c \
 	test-str-sanitize.c \
 	test-time-util.c \
-	test-utc-mktime.c
+	test-utc-mktime.c \
+	test-var-expand.c
 
 test_headers = \
 	test-lib.h
diff -r c3d85a07888c -r e1b725d02c30 src/lib/test-lib.c
--- a/src/lib/test-lib.c	Tue Dec 22 18:12:33 2009 -0500
+++ b/src/lib/test-lib.c	Tue Dec 22 18:18:55 2009 -0500
@@ -27,6 +27,7 @@ int main(void)
 		test_str_sanitize,
 		test_time_util,
 		test_utc_mktime,
+		test_var_expand,
 		NULL
 	};
 	return test_run(test_functions);
diff -r c3d85a07888c -r e1b725d02c30 src/lib/test-lib.h
--- a/src/lib/test-lib.h	Tue Dec 22 18:12:33 2009 -0500
+++ b/src/lib/test-lib.h	Tue Dec 22 18:18:55 2009 -0500
@@ -26,5 +26,6 @@ void test_str_sanitize(void);
 void test_str_sanitize(void);
 void test_time_util(void);
 void test_utc_mktime(void);
+void test_var_expand(void);
 
 #endif
diff -r c3d85a07888c -r e1b725d02c30 src/lib/test-var-expand.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/test-var-expand.c	Tue Dec 22 18:18:55 2009 -0500
@@ -0,0 +1,43 @@
+/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
+
+#include "test-lib.h"
+#include "str.h"
+#include "env-util.h"
+#include "hostpid.h"
+#include "var-expand.h"
+
+struct var_expand_test {
+	const char *in;
+	const char *out;
+};
+
+static void test_var_expand_builtin(void)
+{
+	static struct var_expand_test tests[] = {
+		{ "%{hostname}", NULL },
+		{ "%{pid}", NULL },
+		{ "a%{env:FOO}b", "abaRb" }
+	};
+	static struct var_expand_table table[] = {
+		{ '\0', NULL, NULL }
+	};
+	string_t *str = t_str_new(128);
+	unsigned int i;
+
+	tests[0].out = my_hostname;
+	tests[1].out = my_pid;
+	env_put("FOO=baR");
+
+	test_begin("var_expand");
+	for (i = 0; i < N_ELEMENTS(tests); i++) {
+		str_truncate(str, 0);
+		var_expand(str, tests[i].in, table);
+		test_assert(strcmp(tests[i].out, str_c(str)) == 0);
+	}
+	test_end();
+}
+
+void test_var_expand(void)
+{
+	test_var_expand_builtin();
+}
diff -r c3d85a07888c -r e1b725d02c30 src/lib/var-expand.c
--- a/src/lib/var-expand.c	Tue Dec 22 18:12:33 2009 -0500
+++ b/src/lib/var-expand.c	Tue Dec 22 18:18:55 2009 -0500
@@ -5,6 +5,7 @@
 #include "md5.h"
 #include "hash.h"
 #include "hex-binary.h"
+#include "hostpid.h"
 #include "str.h"
 #include "strescape.h"
 #include "var-expand.h"
@@ -136,6 +137,41 @@ static const struct var_expand_modifier 
 	{ '\0', NULL }
 };
 
+static const char *
+var_expand_long(const struct var_expand_table *table,
+		const void *key_start, unsigned int key_len)
+{
+        const struct var_expand_table *t;
+	const char *value = NULL;
+
+	for (t = table; !TABLE_LAST(t); t++) {
+		if (t->long_key != NULL &&
+		    strncmp(t->long_key, key_start, key_len) == 0 &&
+		    t->long_key[key_len] == '\0') {
+			return t->value != NULL ? t->value : "";
+		}
+	}
+
+	/* built-in variables: */
+	T_BEGIN {
+		const char *key = t_strndup(key_start, key_len);
+
+		switch (key_len) {
+		case 3:
+			if (strcmp(key, "pid") == 0)
+				value = my_pid;
+			break;
+		case 8:
+			if (strcmp(key, "hostname") == 0)
+				value = my_hostname;
+			break;
+		}
+		if (strncmp(key, "env:", 4) == 0)
+			value = getenv(key + 4);
+	} T_END;
+	return value;
+}
+
 void var_expand(string_t *dest, const char *str,
 		const struct var_expand_table *table)
 {
@@ -216,17 +252,9 @@ void var_expand(string_t *dest, const ch
 			if (*str == '{' && (end = strchr(str, '}')) != NULL) {
 				/* %{long_key} */
 				len = end - (str + 1);
-				for (t = table; !TABLE_LAST(t); t++) {
-					if (t->long_key != NULL &&
-					    strncmp(t->long_key, str+1,
-						    len) == 0 &&
-					    t->long_key[len] == '\0') {
-						var = t->value != NULL ?
-							t->value : "";
-						str = end;
-						break;
-					}
-				}
+				var = var_expand_long(table, str+1, len);
+				if (var != NULL)
+					str = end;
 			} else {
 				for (t = table; !TABLE_LAST(t); t++) {
 					if (t->key == *str) {


More information about the dovecot-cvs mailing list