Mercurial > dovecot > core-2.2
changeset 14220:771fab474b1c
pop3: Added module contexts to struct client, and made client_destroy() a virtual method.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 27 Feb 2012 10:32:03 +0200 |
parents | e20af99c6d20 |
children | 31119136ee6e |
files | src/pop3/main.c src/pop3/pop3-client.c src/pop3/pop3-client.h src/pop3/pop3-common.h |
diffstat | 4 files changed, 59 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/pop3/main.c Mon Feb 27 10:30:57 2012 +0200 +++ b/src/pop3/main.c Mon Feb 27 10:32:03 2012 +0200 @@ -29,7 +29,16 @@ static struct mail_storage_service_ctx *storage_service; static struct master_login *master_login = NULL; -void (*hook_client_created)(struct client **client) = NULL; +pop3_client_created_func_t *hook_client_created = NULL; + +pop3_client_created_func_t * +pop3_client_created_hook_set(pop3_client_created_func_t *new_hook) +{ + pop3_client_created_func_t *old_hook = hook_client_created; + + hook_client_created = new_hook; + return old_hook; +} void pop3_refresh_proctitle(void) {
--- a/src/pop3/pop3-client.c Mon Feb 27 10:30:57 2012 +0200 +++ b/src/pop3/pop3-client.c Mon Feb 27 10:32:03 2012 +0200 @@ -36,6 +36,10 @@ transaction. This allows the mailbox to become unlocked. */ #define CLIENT_COMMIT_TIMEOUT_MSECS (10*1000) +extern struct pop3_client_vfuncs pop3_client_vfuncs; + +struct pop3_module_register pop3_module_register = { 0 }; + struct client *pop3_clients; unsigned int pop3_client_count; @@ -281,13 +285,17 @@ enum mailbox_flags flags; const char *errmsg; enum mail_error error; + pool_t pool; /* always use nonblocking I/O */ net_set_nonblock(fd_in, TRUE); net_set_nonblock(fd_out, TRUE); - client = i_new(struct client, 1); + pool = pool_alloconly_create("pop3 client", 256); + client = p_new(pool, struct client, 1); + client->pool = pool; client->service_user = service_user; + client->v = pop3_client_vfuncs; client->set = set; client->fd_in = fd_in; client->fd_out = fd_out; @@ -295,6 +303,7 @@ client->output = o_stream_create_fd(fd_out, (size_t)-1, FALSE); o_stream_set_flush_callback(client->output, client_output, client); + p_array_init(&client->module_contexts, client->pool, 5); client->io = io_add(fd_in, IO_READ, client_input, client); client->last_input = ioloop_time; client->to_idle = timeout_add(CLIENT_IDLE_TIMEOUT_MSECS, @@ -458,6 +467,11 @@ void client_destroy(struct client *client, const char *reason) { + client->v.destroy(client, reason); +} + +static void client_default_destroy(struct client *client, const char *reason) +{ if (client->seen_change_count > 0) client_update_mails(client); @@ -512,7 +526,7 @@ if (client->fd_in != client->fd_out) net_disconnect(client->fd_out); mail_storage_service_user_free(&client->service_user); - i_free(client); + pool_unref(&client->pool); master_service_client_connection_destroyed(master_service); pop3_refresh_proctitle(); @@ -722,3 +736,7 @@ client_destroy(pop3_clients, "Server shutting down."); } } + +struct pop3_client_vfuncs pop3_client_vfuncs = { + client_default_destroy +};
--- a/src/pop3/pop3-client.h Mon Feb 27 10:30:57 2012 +0200 +++ b/src/pop3/pop3-client.h Mon Feb 27 10:32:03 2012 +0200 @@ -9,6 +9,11 @@ #define MSGS_BITMASK_SIZE(client) \ (((client)->messages_count + (CHAR_BIT-1)) / CHAR_BIT) +struct pop3_client_vfuncs { + void (*destroy)(struct client *client, const char *reason); + +}; + /* pop3_msn = 1..n in the POP3 protocol msgnum = 0..n-1 = pop3_msn-1 @@ -18,6 +23,8 @@ struct client { struct client *prev, *next; + struct pop3_client_vfuncs v; + int fd_in, fd_out; struct io *io; struct istream *input; @@ -27,6 +34,7 @@ command_func_t *cmd; void *cmd_context; + pool_t pool; struct mail_storage_service_user *service_user; struct mail_user *user; struct mail_namespace *inbox_ns; @@ -65,6 +73,9 @@ const struct mail_storage_settings *mail_set; enum uidl_keys uidl_keymask; + /* Module-specific contexts. */ + ARRAY_DEFINE(module_contexts, union pop3_module_context *); + unsigned int disconnected:1; unsigned int deleted:1; unsigned int waiting_input:1; @@ -72,6 +83,16 @@ unsigned int message_uidl_hashes_save:1; }; +struct pop3_module_register { + unsigned int id; +}; + +union pop3_module_context { + struct pop3_client_vfuncs super; + struct pop3_module_register *reg; +}; +extern struct pop3_module_register pop3_module_register; + extern struct client *pop3_clients; extern unsigned int pop3_client_count;
--- a/src/pop3/pop3-common.h Mon Feb 27 10:30:57 2012 +0200 +++ b/src/pop3/pop3-common.h Mon Feb 27 10:32:03 2012 +0200 @@ -13,7 +13,14 @@ #include "pop3-client.h" #include "pop3-settings.h" -extern void (*hook_client_created)(struct client **client); +typedef void pop3_client_created_func_t(struct client **client); + +extern pop3_client_created_func_t *hook_client_created; + +/* Sets the hook_client_created and returns the previous hook, + which the new_hook should call if it's non-NULL. */ +pop3_client_created_func_t * +pop3_client_created_hook_set(pop3_client_created_func_t *new_hook); void pop3_refresh_proctitle(void);