dovecot-2.0: Split doveconf and libexec/dovecot/config binaries.

dovecot at dovecot.org dovecot at dovecot.org
Tue May 5 22:28:32 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/f155917f1615
changeset: 9227:f155917f1615
user:      Timo Sirainen <tss at iki.fi>
date:      Tue May 05 15:28:16 2009 -0400
description:
Split doveconf and libexec/dovecot/config binaries.

diffstat:

6 files changed, 246 insertions(+), 200 deletions(-)
src/config/Makefile.am         |   20 +++
src/config/config-connection.c |  179 --------------------------------
src/config/config-connection.h |    1 
src/config/config-request.h    |    3 
src/config/doveconf.c          |  223 ++++++++++++++++++++++++++++++++++++++++
src/config/main.c              |   20 ---

diffs (truncated from 552 to 300 lines):

diff -r 0ca7ed260f1e -r f155917f1615 src/config/Makefile.am
--- a/src/config/Makefile.am	Tue May 05 14:55:05 2009 -0400
+++ b/src/config/Makefile.am	Tue May 05 15:28:16 2009 -0400
@@ -1,6 +1,7 @@ pkglibexecdir = $(libexecdir)/dovecot
 pkglibexecdir = $(libexecdir)/dovecot
 
 bin_PROGRAMS = doveconf
+pkglibexec_PROGRAMS = config
 
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib \
@@ -12,18 +13,31 @@ AM_CPPFLAGS = \
 	-DMODULEDIR=\""$(moduledir)"\" \
 	-DSSLDIR=\""$(ssldir)\""
 
+config_LDADD = \
+	$(LIBDOVECOT) \
+	$(MODULE_LIBS) \
+	$(RAND_LIBS)
+config_DEPENDENCIES = $(LIBDOVECOT)
+
 doveconf_LDADD = \
 	$(LIBDOVECOT) \
 	$(MODULE_LIBS) \
 	$(RAND_LIBS)
 doveconf_DEPENDENCIES = $(LIBDOVECOT)
 
-doveconf_SOURCES = \
+common = \
 	all-settings.c \
 	config-connection.c \
 	config-parser.c \
-	config-request.c \
-	main.c
+	config-request.c
+
+config_SOURCES = \
+	main.c \
+	$(common)
+
+doveconf_SOURCES = \
+	doveconf.c \
+	$(common)
 
 noinst_HEADERS = \
 	all-settings.h \
diff -r 0ca7ed260f1e -r f155917f1615 src/config/config-connection.c
--- a/src/config/config-connection.c	Tue May 05 14:55:05 2009 -0400
+++ b/src/config/config-connection.c	Tue May 05 15:28:16 2009 -0400
@@ -57,149 +57,8 @@ config_request_output(const char *key, c
 	o_stream_send_str(output, "\n");
 }
 
-struct config_request_get_string_ctx {
-	pool_t pool;
-	ARRAY_TYPE(const_string) strings;
-};
-
-static void
-config_request_get_strings(const char *key, const char *value,
-			   bool list, void *context)
-{
-	struct config_request_get_string_ctx *ctx = context;
-
-	value = p_strdup_printf(ctx->pool, list ? "-%s=%s" : "%s=%s",
-				key, value);
-	array_append(&ctx->strings, &value, 1);
-}
-
-static int config_string_cmp(const void *p1, const void *p2)
-{
-	const char *s1 = *(const char *const *)p1;
-	const char *s2 = *(const char *const *)p2;
-	unsigned int i = 0;
-
-	while (s1[i] == s2[i]) {
-		if (s1[i] == '\0' || s1[i] == '=')
-			return 0;
-		i++;
-	}
-
-	if (s1[i] == '=')
-		return -1;
-	if (s2[i] == '=')
-		return 1;
-	return s1[i] - s2[i];
-}
-
-static unsigned int prefix_stack_pop(ARRAY_TYPE(uint) *stack)
-{
-	const unsigned int *indexes;
-	unsigned int idx, count;
-
-	indexes = array_get(stack, &count);
-	idx = count <= 1 ? -1U : indexes[count-2];
-	array_delete(stack, count-1, 1);
-	return idx;
-}
-
-static void config_connection_request_human(struct ostream *output,
-					    const char *service,
-					    enum config_dump_flags flags)
-{
-	static const char *ident_str = "               ";
-	ARRAY_TYPE(const_string) prefixes_arr;
-	ARRAY_TYPE(uint) prefix_idx_stack;
-	struct config_request_get_string_ctx ctx;
-	const char **strings, *const *args, *p, *str, *const *prefixes;
-	const char *key, *value;
-	unsigned int i, j, count, len, prefix_count, skip_len;
-	unsigned int indent = 0, prefix_idx = -1U;
-
-	ctx.pool = pool_alloconly_create("config human strings", 10240);
-	i_array_init(&ctx.strings, 256);
-	config_request_handle(service, flags, config_request_get_strings, &ctx);
-
-	strings = array_get_modifiable(&ctx.strings, &count);
-	qsort(strings, count, sizeof(*strings), config_string_cmp);
-
-	p_array_init(&prefixes_arr, ctx.pool, 32);
-	for (i = 0; i < count && strings[i][0] == '-'; i++) T_BEGIN {
-		p = strchr(strings[i], '=');
-		i_assert(p != NULL);
-		for (args = t_strsplit(p + 1, " "); *args != NULL; args++) {
-			str = p_strdup_printf(ctx.pool, "%s/%s/",
-					      t_strcut(strings[i]+1, '='),
-					      *args);
-			array_append(&prefixes_arr, &str, 1);
-		}
-	} T_END;
-	prefixes = array_get(&prefixes_arr, &prefix_count);
-
-	p_array_init(&prefix_idx_stack, ctx.pool, 8);
-	for (; i < count; i++) T_BEGIN {
-		value = strchr(strings[i], '=');
-		i_assert(value != NULL);
-		key = t_strdup_until(strings[i], value);
-		value++;
-
-		j = 0;
-		while (prefix_idx != -1U) {
-			len = strlen(prefixes[prefix_idx]);
-			if (strncmp(prefixes[prefix_idx], key, len) != 0) {
-				prefix_idx = prefix_stack_pop(&prefix_idx_stack);
-				indent--;
-				o_stream_send(output, ident_str, indent*2);
-				o_stream_send_str(output, "}\n");
-			} else if (strchr(key + len, '/') == NULL) {
-				/* keep the prefix */
-				j = prefix_count;
-				break;
-			} else {
-				/* subprefix */
-				break;
-			}
-		}
-		for (; j < prefix_count; j++) {
-			len = strlen(prefixes[j]);
-			if (strncmp(prefixes[j], key, len) == 0 &&
-			    strchr(key + len, '/') == NULL) {
-				key += prefix_idx == -1U ? 0 :
-					strlen(prefixes[prefix_idx]);
-				o_stream_send(output, ident_str, indent*2);
-				o_stream_send_str(output, t_strcut(key, '/'));
-				o_stream_send_str(output, " {\n");
-				indent++;
-				prefix_idx = j;
-				array_append(&prefix_idx_stack, &prefix_idx, 1);
-				break;
-			}
-		}
-		skip_len = prefix_idx == -1U ? 0 : strlen(prefixes[prefix_idx]);
-		i_assert(strncmp(prefixes[prefix_idx], strings[i], skip_len) == 0);
-		o_stream_send(output, ident_str, indent*2);
-		key = strings[i] + skip_len;
-		value = strchr(key, '=');
-		o_stream_send(output, key, value-key);
-		o_stream_send_str(output, " = ");
-		o_stream_send_str(output, value+1);
-		o_stream_send(output, "\n", 1);
-	} T_END;
-
-	while (prefix_idx != -1U) {
-		prefix_idx = prefix_stack_pop(&prefix_idx_stack);
-		indent--;
-		o_stream_send(output, ident_str, indent*2);
-		o_stream_send_str(output, "}\n");
-	}
-
-	array_free(&ctx.strings);
-	pool_unref(&ctx.pool);
-}
-
 static void config_connection_request(struct config_connection *conn,
-				      const char *const *args,
-				      enum config_dump_flags flags)
+				      const char *const *args)
 {
 	const char *service = "";
 
@@ -210,13 +69,8 @@ static void config_connection_request(st
 	}
 
 	o_stream_cork(conn->output);
-	if ((flags & CONFIG_DUMP_FLAG_HUMAN) == 0) {
-		config_request_handle(service, flags, config_request_output,
-				      conn->output);
-		o_stream_send_str(conn->output, "\n");
-	} else {
-		config_connection_request_human(conn->output, service, flags);
-	}
+	config_request_handle(service, 0, config_request_output, conn->output);
+	o_stream_send_str(conn->output, "\n");
 	o_stream_uncork(conn->output);
 }
 
@@ -255,7 +109,7 @@ static void config_connection_input(void
 		if (args[0] == NULL)
 			continue;
 		if (strcmp(args[0], "REQ") == 0)
-			config_connection_request(conn, args + 1, 0);
+			config_connection_request(conn, args + 1);
 	}
 }
 
@@ -284,31 +138,6 @@ void config_connection_destroy(struct co
 	i_free(conn);
 }
 
-void config_connection_dump_request(int fd, const char *service,
-				    enum config_dump_flags flags)
-{
-	struct config_connection *conn;
-	const char *args[2] = { service, NULL };
-
-	conn = config_connection_create(fd);
-	config_connection_request(conn, args, flags);
-	config_connection_destroy(conn);
-}
-
-static void config_request_putenv(const char *key, const char *value,
-				  bool list ATTR_UNUSED,
-				  void *context ATTR_UNUSED)
-{
-	T_BEGIN {
-		env_put(t_strconcat(t_str_ucase(key), "=", value, NULL));
-	} T_END;
-}
-
-void config_connection_putenv(const char *service)
-{
-	config_request_handle(service, 0, config_request_putenv, NULL);
-}
-
 void config_connections_destroy_all(void)
 {
 	while (config_connections != NULL)
diff -r 0ca7ed260f1e -r f155917f1615 src/config/config-connection.h
--- a/src/config/config-connection.h	Tue May 05 14:55:05 2009 -0400
+++ b/src/config/config-connection.h	Tue May 05 15:28:16 2009 -0400
@@ -8,7 +8,6 @@ void config_connection_destroy(struct co
 
 void config_connection_dump_request(int fd, const char *service,
 				    enum config_dump_flags flags);
-void config_connection_putenv(const char *service);
 
 void config_connections_destroy_all(void);
 
diff -r 0ca7ed260f1e -r f155917f1615 src/config/config-request.h
--- a/src/config/config-request.h	Tue May 05 14:55:05 2009 -0400
+++ b/src/config/config-request.h	Tue May 05 15:28:16 2009 -0400
@@ -2,8 +2,7 @@
 #define CONFIG_REQUEST_H
 
 enum config_dump_flags {
-	CONFIG_DUMP_FLAG_HUMAN		= 0x01,
-	CONFIG_DUMP_FLAG_DEFAULTS	= 0x02
+	CONFIG_DUMP_FLAG_DEFAULTS	= 0x01
 };
 
 typedef void config_request_callback_t(const char *key, const char *value,
diff -r 0ca7ed260f1e -r f155917f1615 src/config/doveconf.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/config/doveconf.c	Tue May 05 15:28:16 2009 -0400
@@ -0,0 +1,223 @@
+/* Copyright (C) 2005-2009 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "array.h"
+#include "env-util.h"
+#include "master-service.h"
+#include "ostream.h"
+#include "config-connection.h"
+#include "config-parser.h"
+#include "config-request.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+struct config_request_get_string_ctx {


More information about the dovecot-cvs mailing list