dovecot-2.0: Merged single and multi mail_storage_service_*() fu...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Oct 22 02:54:14 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/d1384c2b08e5
changeset: 10130: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