dovecot-2.0: doveadm: Code cleanup: Moved some functions to dove...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jul 23 17:55:30 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/19574f77a021
changeset: 11891:19574f77a021
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jul 23 15:55:27 2010 +0100
description:
doveadm: Code cleanup: Moved some functions to doveadm-util.[ch]

diffstat:

 src/doveadm/Makefile.am    |    2 +
 src/doveadm/doveadm-mail.h |    2 +-
 src/doveadm/doveadm-util.c |  147 ++++++++++++++++++++++++++++++++++++
 src/doveadm/doveadm-util.h |   16 ++++
 src/doveadm/doveadm.c      |  156 ++------------------------------------
 src/doveadm/doveadm.h      |    7 +-
 6 files changed, 178 insertions(+), 152 deletions(-)

diffs (truncated from 426 to 300 lines):

diff -r 43804bdf697e -r 19574f77a021 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am	Fri Jul 23 15:51:38 2010 +0100
+++ b/src/doveadm/Makefile.am	Fri Jul 23 15:55:27 2010 +0100
@@ -74,6 +74,7 @@
 	doveadm-print-table.c \
 	doveadm-pw.c \
 	doveadm-settings.c \
+	doveadm-util.c \
 	doveadm-who.c
 
 noinst_HEADERS = \
@@ -85,4 +86,5 @@
 	doveadm-print.h \
 	doveadm-print-private.h \
 	doveadm-settings.h \
+	doveadm-util.h \
 	doveadm-who.h
diff -r 43804bdf697e -r 19574f77a021 src/doveadm/doveadm-mail.h
--- a/src/doveadm/doveadm-mail.h	Fri Jul 23 15:51:38 2010 +0100
+++ b/src/doveadm/doveadm-mail.h	Fri Jul 23 15:55:27 2010 +0100
@@ -2,7 +2,7 @@
 #define DOVEADM_MAIL_H
 
 #include <stdio.h>
-#include "doveadm.h"
+#include "doveadm-util.h"
 #include "module-context.h"
 
 struct mailbox;
diff -r 43804bdf697e -r 19574f77a021 src/doveadm/doveadm-util.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-util.c	Fri Jul 23 15:55:27 2010 +0100
@@ -0,0 +1,147 @@
+/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "array.h"
+#include "network.h"
+#include "master-service.h"
+#include "module-dir.h"
+#include "doveadm-settings.h"
+#include "doveadm-mail.h"
+#include "doveadm-util.h"
+
+#include <time.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+bool doveadm_verbose = FALSE, doveadm_debug = FALSE;
+static struct module *modules = NULL;
+
+void doveadm_load_modules(void)
+{
+	struct module_dir_load_settings mod_set;
+
+	/* some doveadm plugins have dependencies to mail plugins. we can load
+	   only those whose dependencies have been loaded earlier, the rest are
+	   ignored. */
+	memset(&mod_set, 0, sizeof(mod_set));
+	mod_set.version = master_service_get_version_string(master_service);
+	mod_set.require_init_funcs = TRUE;
+	mod_set.debug = doveadm_debug;
+	mod_set.ignore_dlopen_errors = !doveadm_debug;
+
+	modules = module_dir_load_missing(modules, DOVEADM_MODULEDIR,
+					  NULL, &mod_set);
+	module_dir_init(modules);
+}
+
+void doveadm_unload_modules(void)
+{
+	module_dir_unload(&modules);
+}
+
+bool doveadm_has_unloaded_plugin(const char *name)
+{
+	struct module *module;
+	DIR *dir;
+	struct dirent *d;
+	const char *plugin_name;
+	unsigned int name_len = strlen(name);
+	bool found = FALSE;
+
+	/* first check that it's not actually loaded */
+	for (module = modules; module != NULL; module = module->next) {
+		if (strcmp(module_get_plugin_name(module), name) == 0)
+			return FALSE;
+	}
+
+	dir = opendir(DOVEADM_MODULEDIR);
+	if (dir == NULL)
+		return FALSE;
+
+	while ((d = readdir(dir)) != NULL) {
+		plugin_name = module_file_get_name(d->d_name);
+		if (strncmp(plugin_name, "doveadm_", 8) == 0)
+			plugin_name += 8;
+
+		if (strncmp(plugin_name, name, name_len) == 0 &&
+		    (plugin_name[name_len] == '\0' ||
+		     strcmp(plugin_name + name_len, "_plugin") == 0)) {
+			found = TRUE;
+			break;
+		}
+	}
+	(void)closedir(dir);
+	return found;
+}
+
+const char *unixdate2str(time_t timestamp)
+{
+	static char buf[64];
+	struct tm *tm;
+
+	tm = localtime(&timestamp);
+	strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
+	return buf;
+}
+
+const char *doveadm_plugin_getenv(const char *name)
+{
+	const char *const *envs;
+	unsigned int i, count;
+
+	if (!array_is_created(&doveadm_settings->plugin_envs))
+		return NULL;
+
+	envs = array_get(&doveadm_settings->plugin_envs, &count);
+	for (i = 0; i < count; i += 2) {
+		if (strcmp(envs[i], name) == 0)
+			return envs[i+1];
+	}
+	return NULL;
+}
+
+static bool
+parse_hostport(const char *str, const char **host_r, unsigned int *port_r)
+{
+	const char *p;
+
+	/* host:port */
+	p = strrchr(str, ':');
+	if (p == NULL || str_to_uint(p+1, port_r) < 0)
+		return FALSE;
+	*host_r = t_strdup_until(str, p);
+
+	/* there is any '/' character (unlikely to be found from host names),
+	   assume ':' is part of a file path */
+	if (strchr(str, '/') != NULL)
+		return FALSE;
+	return TRUE;
+}
+
+int doveadm_connect(const char *path)
+{
+	struct stat st;
+	const char *host;
+	struct ip_addr *ips;
+	unsigned int port, ips_count;
+	int fd, ret;
+
+	if (parse_hostport(path, &host, &port) && stat(path, &st) < 0) {
+		/* it's a host:port, connect via TCP */
+		ret = net_gethostbyname(host, &ips, &ips_count);
+		if (ret != 0) {
+			i_fatal("Lookup of host %s failed: %s",
+				host, net_gethosterror(ret));
+		}
+		fd = net_connect_ip_blocking(&ips[0], port, NULL);
+		if (fd == -1) {
+			i_fatal("connect(%s:%u) failed: %m",
+				net_ip2addr(&ips[0]), port);
+		}
+	} else {
+		fd = net_connect_unix(path);
+		if (fd == -1)
+			i_fatal("net_connect_unix(%s) failed: %m", path);
+	}
+	return fd;
+}
diff -r 43804bdf697e -r 19574f77a021 src/doveadm/doveadm-util.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-util.h	Fri Jul 23 15:55:27 2010 +0100
@@ -0,0 +1,16 @@
+#ifndef DOVEADM_UTIL_H
+#define DOVEADM_UTIL_H
+
+#define DOVEADM_SERVER_PROTOCOL_VERSION_MAJOR 1
+
+extern bool doveadm_verbose, doveadm_debug;
+
+const char *unixdate2str(time_t timestamp);
+const char *doveadm_plugin_getenv(const char *name);
+int doveadm_connect(const char *path);
+
+void doveadm_load_modules(void);
+void doveadm_unload_modules(void);
+bool doveadm_has_unloaded_plugin(const char *name);
+
+#endif
diff -r 43804bdf697e -r 19574f77a021 src/doveadm/doveadm.c
--- a/src/doveadm/doveadm.c	Fri Jul 23 15:51:38 2010 +0100
+++ b/src/doveadm/doveadm.c	Fri Jul 23 15:55:27 2010 +0100
@@ -5,25 +5,16 @@
 #include "str.h"
 #include "env-util.h"
 #include "execv-const.h"
-#include "network.h"
-#include "module-dir.h"
 #include "master-service.h"
 #include "master-service-settings.h"
-#include "doveadm-print.h"
+#include "doveadm-print-private.h"
 #include "doveadm-mail.h"
 #include "doveadm-settings.h"
 #include "doveadm.h"
 
-#include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <dirent.h>
-#include <time.h>
-#include <sys/stat.h>
 
-bool doveadm_verbose = FALSE, doveadm_debug = FALSE;
-
-static struct module *modules = NULL;
 static ARRAY_DEFINE(doveadm_cmds, struct doveadm_cmd);
 
 void doveadm_register_cmd(const struct doveadm_cmd *cmd)
@@ -123,126 +114,6 @@
 	help_to(cmd, stdout);
 }
 
-const char *unixdate2str(time_t timestamp)
-{
-	static char buf[64];
-	struct tm *tm;
-
-	tm = localtime(&timestamp);
-	strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
-	return buf;
-}
-
-const char *doveadm_plugin_getenv(const char *name)
-{
-	const char *const *envs;
-	unsigned int i, count;
-
-	if (!array_is_created(&doveadm_settings->plugin_envs))
-		return NULL;
-
-	envs = array_get(&doveadm_settings->plugin_envs, &count);
-	for (i = 0; i < count; i += 2) {
-		if (strcmp(envs[i], name) == 0)
-			return envs[i+1];
-	}
-	return NULL;
-}
-
-static bool
-parse_hostport(const char *str, const char **host_r, unsigned int *port_r)
-{
-	const char *p;
-
-	/* host:port */
-	p = strrchr(str, ':');
-	if (p == NULL || str_to_uint(p+1, port_r) < 0)
-		return FALSE;
-	*host_r = t_strdup_until(str, p);
-
-	/* there is any '/' character (unlikely to be found from host names),
-	   assume ':' is part of a file path */
-	if (strchr(str, '/') != NULL)
-		return FALSE;
-	return TRUE;
-}
-
-int doveadm_connect(const char *path)
-{
-	struct stat st;
-	const char *host;
-	struct ip_addr *ips;
-	unsigned int port, ips_count;
-	int fd, ret;
-
-	if (parse_hostport(path, &host, &port) && stat(path, &st) < 0) {
-		/* it's a host:port, connect via TCP */
-		ret = net_gethostbyname(host, &ips, &ips_count);
-		if (ret != 0) {
-			i_fatal("Lookup of host %s failed: %s",
-				host, net_gethosterror(ret));
-		}
-		fd = net_connect_ip_blocking(&ips[0], port, NULL);
-		if (fd == -1) {
-			i_fatal("connect(%s:%u) failed: %m",
-				net_ip2addr(&ips[0]), port);
-		}
-	} else {
-		fd = net_connect_unix(path);


More information about the dovecot-cvs mailing list