dovecot-2.0-sslstream: Merged single and multi mail_storage_serv...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:55:23 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/d1384c2b08e5
changeset: 10131:d1384c2b08e5
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Oct 21 19:54:00 2009 -0400
description:
Merged single and multi mail_storage_service_*() functions.

diffstat:

20 files changed, 474 insertions(+), 510 deletions(-)
src/doveadm/doveadm-mail.c             |   56 +--
src/dsync/dsync.c                      |   16 
src/imap/imap-client.c                 |    4 
src/imap/imap-client.h                 |    2 
src/imap/main.c                        |   67 ++-
src/lda/main.c                         |   18 
src/lib-storage/mail-storage-service.c |  590 +++++++++++++-------------------
src/lib-storage/mail-storage-service.h |   61 +--
src/lib-storage/mail-user.c            |   23 -
src/lib-storage/mail-user.h            |    4 
src/lmtp/client.c                      |    8 
src/lmtp/client.h                      |    2 
src/lmtp/commands.c                    |   15 
src/lmtp/main.c                        |    9 
src/lmtp/main.h                        |    2 
src/plugins/convert/convert-tool.c     |   10 
src/plugins/expire/expire-tool.c       |   27 -
src/pop3/main.c                        |   63 ++-
src/pop3/pop3-client.c                 |    5 
src/pop3/pop3-client.h                 |    2 

diffs (truncated from 1839 to 300 lines):

diff -r 3c87c0b18090 -r d1384c2b08e5 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Wed Oct 21 16:58:10 2009 -0400
+++ b/src/doveadm/doveadm-mail.c	Wed Oct 21 19:54:00 2009 -0400
@@ -79,35 +79,44 @@ doveadm_mail_single_user(doveadm_mail_co
 			 enum mail_storage_service_flags service_flags,
 			 const char *args[])
 {
+	struct mail_storage_service_ctx *storage_service;
+	struct mail_storage_service_user *service_user;
 	struct mail_storage_service_input input;
 	struct mail_user *mail_user;
+	const char *error;
 
 	if (username == NULL)
 		i_fatal("USER environment is missing and -u option not used");
 
 	memset(&input, 0, sizeof(input));
 	input.username = username;
-	mail_user = mail_storage_service_init_user(master_service, &input, NULL,
-						   service_flags);
+
+	storage_service = mail_storage_service_init(master_service, NULL,
+						    service_flags);
+	if (mail_storage_service_lookup_next(storage_service, &input,
+					     &service_user, &mail_user,
+					     &error) <= 0)
+		i_fatal("%s", error);
 	cmd(mail_user, args);
 	mail_user_unref(&mail_user);
-	mail_storage_service_deinit_user();
+	mail_storage_service_user_free(&service_user);
+	mail_storage_service_deinit(&storage_service);
 }
 
 static int
 doveadm_mail_next_user(doveadm_mail_command_t *cmd,
-		       struct mail_storage_service_multi_ctx *multi,
+		       struct mail_storage_service_ctx *storage_service,
 		       const struct mail_storage_service_input *input,
-		       pool_t pool, const char *args[])
-{
-	struct mail_storage_service_multi_user *multi_user;
+		       const char *args[])
+{
+	struct mail_storage_service_user *service_user;
 	struct mail_user *mail_user;
 	const char *error;
 	int ret;
 
 	i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username));
-	ret = mail_storage_service_multi_lookup(multi, input, pool,
-						&multi_user, &error);
+	ret = mail_storage_service_lookup(storage_service, input,
+					  &service_user, &error);
 	if (ret <= 0) {
 		if (ret == 0) {
 			i_info("User no longer exists, skipping");
@@ -117,14 +126,14 @@ doveadm_mail_next_user(doveadm_mail_comm
 			return -1;
 		}
 	}
-	if (mail_storage_service_multi_next(multi, multi_user,
-					    &mail_user, &error) < 0) {
+	if (mail_storage_service_next(storage_service, service_user,
+				      &mail_user, &error) < 0) {
 		i_error("User init failed: %s", error);
-		mail_storage_service_multi_user_free(multi_user);
+		mail_storage_service_user_free(&service_user);
 		return -1;
 	}
-	mail_storage_service_multi_user_free(multi_user);
 	cmd(mail_user, args);
+	mail_storage_service_user_free(&service_user);
 	mail_user_unref(&mail_user);
 	return 0;
 }
@@ -140,10 +149,9 @@ doveadm_mail_all_users(doveadm_mail_comm
 		       const char *args[])
 {
 	struct mail_storage_service_input input;
-	struct mail_storage_service_multi_ctx *multi;
+	struct mail_storage_service_ctx *storage_service;
 	unsigned int user_idx, user_count, interval, n;
 	const char *user;
-	pool_t pool;
 	int ret;
 
 	service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
@@ -151,25 +159,24 @@ doveadm_mail_all_users(doveadm_mail_comm
 	memset(&input, 0, sizeof(input));
 	input.service = "doveadm";
 
-	multi = mail_storage_service_multi_init(master_service, NULL,
-						service_flags);
-	pool = pool_alloconly_create("multi user", 8192);
+	storage_service = mail_storage_service_init(master_service, NULL,
+						    service_flags);
 
         lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL);
 	lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL);
 
-	user_count = mail_storage_service_multi_all_init(multi);
+	user_count = mail_storage_service_all_init(storage_service);
 	n = user_count / 10000;
 	for (interval = 10; n > 0 && interval < 1000; interval *= 10)
 		n /= 10;
 	
 	user_idx = 0;
-	while ((ret = mail_storage_service_multi_all_next(multi, &user)) > 0) {
-		p_clear(pool);
+	while ((ret = mail_storage_service_all_next(storage_service,
+						    &user)) > 0) {
 		input.username = user;
 		T_BEGIN {
-			ret = doveadm_mail_next_user(cmd, multi, &input,
-						     pool, args);
+			ret = doveadm_mail_next_user(cmd, storage_service,
+						     &input, args);
 		} T_END;
 		if (ret < 0)
 			break;
@@ -190,8 +197,7 @@ doveadm_mail_all_users(doveadm_mail_comm
 	i_set_failure_prefix("doveadm: ");
 	if (ret < 0)
 		i_error("Failed to iterate through some users");
-	mail_storage_service_multi_deinit(&multi);
-	pool_unref(&pool);
+	mail_storage_service_deinit(&storage_service);
 }
 
 static void
diff -r 3c87c0b18090 -r d1384c2b08e5 src/dsync/dsync.c
--- a/src/dsync/dsync.c	Wed Oct 21 16:58:10 2009 -0400
+++ b/src/dsync/dsync.c	Wed Oct 21 19:54:00 2009 -0400
@@ -69,10 +69,12 @@ int main(int argc, char *argv[])
 	enum mail_storage_service_flags ssflags =
 		MAIL_STORAGE_SERVICE_FLAG_NO_CHDIR;
 	enum dsync_brain_flags brain_flags = 0;
+	struct mail_storage_service_ctx *storage_service;
+	struct mail_storage_service_user *service_user;
 	struct mail_storage_service_input input;
 	struct mail_user *mail_user;
 	struct dsync_worker *worker1, *worker2;
-	const char *username, *mailbox = NULL, *cmd = NULL;
+	const char *error, *username, *mailbox = NULL, *cmd = NULL;
 	bool dest = TRUE;
 	int c, ret, fd_in = STDIN_FILENO, fd_out = STDOUT_FILENO;
 
@@ -112,8 +114,13 @@ int main(int argc, char *argv[])
 
 	memset(&input, 0, sizeof(input));
 	input.username = username;
-	mail_user = mail_storage_service_init_user(master_service,
-						   &input, NULL, ssflags);
+
+	storage_service = mail_storage_service_init(master_service, NULL,
+						    ssflags);
+	if (mail_storage_service_lookup_next(storage_service, &input,
+					     &service_user, &mail_user,
+					     &error) <= 0)
+		i_fatal("%s", error);
 
 	if (cmd != NULL) {
 		/* user initialization may exec doveconf, so do our forking
@@ -152,7 +159,8 @@ int main(int argc, char *argv[])
 		dsync_worker_deinit(&worker2);
 
 	mail_user_unref(&mail_user);
-	mail_storage_service_deinit_user();
+	mail_storage_service_user_free(&service_user);
+	mail_storage_service_deinit(&storage_service);
 	master_service_deinit(&master_service);
 	return ret < 0 ? 1 : 0;
 }
diff -r 3c87c0b18090 -r d1384c2b08e5 src/imap/imap-client.c
--- a/src/imap/imap-client.c	Wed Oct 21 16:58:10 2009 -0400
+++ b/src/imap/imap-client.c	Wed Oct 21 19:54:00 2009 -0400
@@ -13,6 +13,7 @@
 #include "imap-resp-code.h"
 #include "imap-util.h"
 #include "mail-namespace.h"
+#include "mail-storage-service.h"
 #include "imap-commands.h"
 
 #include <stdlib.h>
@@ -31,6 +32,7 @@ static void client_idle_timeout(struct c
 }
 
 struct client *client_create(int fd_in, int fd_out, struct mail_user *user,
+			     struct mail_storage_service_user *service_user,
 			     const struct imap_settings *set)
 {
 	struct client *client;
@@ -42,6 +44,7 @@ struct client *client_create(int fd_in, 
 
 	client = i_new(struct client, 1);
 	client->set = set;
+	client->service_user = service_user;
 	client->fd_in = fd_in;
 	client->fd_out = fd_out;
 	client->input = i_stream_create_fd(fd_in,
@@ -212,6 +215,7 @@ void client_destroy(struct client *clien
 		array_free(&client->search_updates);
 	str_free(&client->capability_string);
 	pool_unref(&client->command_pool);
+	mail_storage_service_user_free(&client->service_user);
 	i_free(client);
 
 	master_service_client_connection_destroyed(master_service);
diff -r 3c87c0b18090 -r d1384c2b08e5 src/imap/imap-client.h
--- a/src/imap/imap-client.h	Wed Oct 21 16:58:10 2009 -0400
+++ b/src/imap/imap-client.h	Wed Oct 21 19:54:00 2009 -0400
@@ -94,6 +94,7 @@ struct client {
 	struct ostream *output;
 	struct timeout *to_idle, *to_idle_output;
 
+	struct mail_storage_service_user *service_user;
         const struct imap_settings *set;
 	string_t *capability_string;
 
@@ -151,6 +152,7 @@ extern struct client *imap_clients;
 /* Create new client with specified input/output handles. socket specifies
    if the handle is a socket. */
 struct client *client_create(int fd_in, int fd_out, struct mail_user *user,
+			     struct mail_storage_service_user *service_user,
 			     const struct imap_settings *set);
 void client_destroy(struct client *client, const char *reason);
 
diff -r 3c87c0b18090 -r d1384c2b08e5 src/imap/main.c
--- a/src/imap/main.c	Wed Oct 21 16:58:10 2009 -0400
+++ b/src/imap/main.c	Wed Oct 21 19:54:00 2009 -0400
@@ -23,13 +23,8 @@
 #define IS_STANDALONE() \
         (getenv(MASTER_UID_ENV) == NULL)
 
-static const struct setting_parser_info *set_roots[] = {
-	&imap_setting_parser_info,
-	NULL
-};
+static struct mail_storage_service_ctx *storage_service;
 static struct master_login *master_login = NULL;
-static enum mail_storage_service_flags storage_service_flags = 0;
-static bool user_initialized = FALSE;
 
 void (*hook_client_created)(struct client **client) = NULL;
 
@@ -87,7 +82,9 @@ static void client_add_input(struct clie
 }
 
 static void
-main_stdio_init_user(const struct imap_settings *set, struct mail_user *user)
+main_stdio_init_user(const struct imap_settings *set,
+		     struct mail_user *mail_user,
+		     struct mail_storage_service_user *user)
 {
 	struct client *client;
 	buffer_t *input_buf;
@@ -97,7 +94,8 @@ main_stdio_init_user(const struct imap_s
 	input_buf = input_base64 == NULL ? NULL :
 		t_base64_decode_str(input_base64);
 
-	client = client_create(STDIN_FILENO, STDOUT_FILENO, user, set);
+	client = client_create(STDIN_FILENO, STDOUT_FILENO,
+			       mail_user, user, set);
 	client_add_input(client, input_buf);
 }
 
@@ -107,6 +105,10 @@ static void main_stdio_run(void)
 	struct mail_user *mail_user;
 	const struct imap_settings *set;
 	const char *value;
+	struct mail_storage_service_user *user;
+	const char *error;
+	pool_t user_pool;
+	int ret;
 
 	memset(&input, 0, sizeof(input));
 	input.module = input.service = "imap";
@@ -120,11 +122,17 @@ static void main_stdio_run(void)
 	if ((value = getenv("LOCAL_IP")) != NULL)
 		net_addr2ip(value, &input.local_ip);
 
-	user_initialized = TRUE;
-	mail_user = mail_storage_service_init_user(master_service,
-						   &input, set_roots,
-						   storage_service_flags);
-	set = mail_storage_service_get_settings(master_service);
+	user_pool = pool_alloconly_create("storage user pool", 512);
+	ret = mail_storage_service_lookup(storage_service, &input,
+					  &user, &error);
+	if (ret <= 0)
+		i_fatal("User lookup failed: %s", error);
+	if (mail_storage_service_next(storage_service,
+				      user, &mail_user, &error) < 0)
+		i_fatal("User init failed: %s", error);
+
+	set = mail_storage_service_user_get_set(user)[1];
+
 	restrict_access_allow_coredumps(TRUE);
 	if (set->shutdown_clients)


More information about the dovecot-cvs mailing list