Upon thinking, the variable names may not be descriptive enough as `host` is a bit ambiguous and `deleted_count` may refer to a different command than expunge in imap and may be valid to track at some point so I have changed `host` to `client_ip` and `deleted_count` in imap to `expunged_count`, below is the modified diff for version 1.2.11.
diff -crB dovecot-1.2.11.orig/src/imap/client.c dovecot-1.2.11/src/imap/client.c *** dovecot-1.2.11.orig/src/imap/client.c 2010-01-24 16:14:17.000000000 -0700 --- dovecot-1.2.11/src/imap/client.c 2010-05-20 09:30:47.170407921 -0600 *************** *** 42,47 **** --- 42,48 ---- client->fd_out = fd_out; client->input = i_stream_create_fd(fd_in, imap_max_line_length, FALSE); client->output = o_stream_create_fd(fd_out, (size_t)-1, FALSE); + client->expunged = 0; o_stream_set_flush_callback(client->output, client_output, client); *************** *** 105,110 **** --- 106,113 ---- static struct var_expand_table static_tab[] = { { 'i', NULL, "input" }, { 'o', NULL, "output" }, + { 'c', NULL, "client_ip" }, + { 'e', NULL, "expunged_count" }, { '\0', NULL, NULL } }; struct var_expand_table *tab; *************** *** 115,120 **** --- 118,125 ---- tab[0].value = dec2str(client->input->v_offset); tab[1].value = dec2str(client->output->offset); + tab[2].value = getenv("IP") ? getenv("IP") : "Unknown"; + tab[3].value = dec2str(client->expunged); str = t_str_new(128); var_expand(str, logout_format, tab); diff -crB dovecot-1.2.11.orig/src/imap/client.h dovecot-1.2.11/src/imap/client.h *** dovecot-1.2.11.orig/src/imap/client.h 2009-06-26 22:49:34.000000000 -0600 --- dovecot-1.2.11/src/imap/client.h 2010-05-19 16:26:31.529833893 -0600 *************** *** 133,138 **** --- 133,139 ---- unsigned int destroyed:1; unsigned int handling_input:1; unsigned int syncing:1; + unsigned int expunged; unsigned int id_logged:1; unsigned int mailbox_examined:1; unsigned int input_skip_line:1; /* skip all the data until we've diff -crB dovecot-1.2.11.orig/src/imap/cmd-close.c dovecot-1.2.11/src/imap/cmd-close.c *** dovecot-1.2.11.orig/src/imap/cmd-close.c 2010-01-24 16:14:17.000000000 -0700 --- dovecot-1.2.11/src/imap/cmd-close.c 2010-05-19 16:26:31.529833893 -0600 *************** *** 18,24 **** client->mailbox = NULL; storage = mailbox_get_storage(mailbox); ! if ((ret = imap_expunge(mailbox, NULL)) < 0) client_send_untagged_storage_error(client, storage); if (mailbox_sync(mailbox, 0, 0, NULL) < 0) client_send_untagged_storage_error(client, storage); --- 18,24 ---- client->mailbox = NULL; storage = mailbox_get_storage(mailbox); ! if ((ret = imap_expunge(client, NULL)) < 0) client_send_untagged_storage_error(client, storage); if (mailbox_sync(mailbox, 0, 0, NULL) < 0) client_send_untagged_storage_error(client, storage); diff -crB dovecot-1.2.11.orig/src/imap/cmd-expunge.c dovecot-1.2.11/src/imap/cmd-expunge.c *** dovecot-1.2.11.orig/src/imap/cmd-expunge.c 2010-01-24 16:14:17.000000000 -0700 --- dovecot-1.2.11/src/imap/cmd-expunge.c 2010-05-19 16:26:31.529833893 -0600 *************** *** 24,30 **** { struct client *client = cmd->client; ! if (imap_expunge(client->mailbox, search_args == NULL ? NULL : search_args->args) < 0) { client_send_storage_error(cmd, mailbox_get_storage(client->mailbox)); --- 24,30 ---- { struct client *client = cmd->client; ! if (imap_expunge(client, search_args == NULL ? NULL : search_args->args) < 0) { client_send_storage_error(cmd, mailbox_get_storage(client->mailbox)); diff -crB dovecot-1.2.11.orig/src/imap/imap-expunge.c dovecot-1.2.11/src/imap/imap-expunge.c *** dovecot-1.2.11.orig/src/imap/imap-expunge.c 2010-01-24 16:14:17.000000000 -0700 --- dovecot-1.2.11/src/imap/imap-expunge.c 2010-05-19 16:26:31.529833893 -0600 *************** *** 5,18 **** #include "mail-search-build.h" #include "imap-expunge.h" ! int imap_expunge(struct mailbox *box, struct mail_search_arg *next_search_arg) { struct mail_search_context *ctx; struct mailbox_transaction_context *t; struct mail *mail; struct mail_search_args *search_args; bool expunges = FALSE; if (mailbox_is_readonly(box)) { /* silently ignore */ return 0; --- 5,21 ---- #include "mail-search-build.h" #include "imap-expunge.h" ! int imap_expunge(struct client *client, struct mail_search_arg *next_search_arg) { struct mail_search_context *ctx; struct mailbox_transaction_context *t; struct mail *mail; + struct mailbox *box; struct mail_search_args *search_args; bool expunges = FALSE; + box = client->mailbox; + if (mailbox_is_readonly(box)) { /* silently ignore */ return 0; diff -crB dovecot-1.2.11.orig/src/imap/imap-expunge.h dovecot-1.2.11/src/imap/imap-expunge.h *** dovecot-1.2.11.orig/src/imap/imap-expunge.h 2008-06-08 21:14:46.000000000 -0600 --- dovecot-1.2.11/src/imap/imap-expunge.h 2010-05-19 16:26:31.529833893 -0600 *************** *** 3,8 **** struct mail_search_arg; ! int imap_expunge(struct mailbox *box, struct mail_search_arg *next_search_arg); #endif --- 3,8 ---- struct mail_search_arg; ! int imap_expunge(struct client *client, struct mail_search_arg *next_search_arg); #endif Only in dovecot-1.2.11.orig/src/lib-sql: sql-drivers-register.c diff -crB dovecot-1.2.11.orig/src/pop3/client.c dovecot-1.2.11/src/pop3/client.c *** dovecot-1.2.11.orig/src/pop3/client.c 2010-01-24 16:14:17.000000000 -0700 --- dovecot-1.2.11/src/pop3/client.c 2010-05-20 09:31:01.400409195 -0600 *************** *** 238,243 **** --- 238,244 ---- { 's', NULL, "message_bytes" }, { 'i', NULL, "input" }, { 'o', NULL, "output" }, + { 'c', NULL, "client_ip" }, { '\0', NULL, NULL } }; struct var_expand_table *tab; *************** *** 255,260 **** --- 256,262 ---- tab[6].value = dec2str(client->total_size); tab[7].value = dec2str(client->input->v_offset); tab[8].value = dec2str(client->output->offset); + tab[9].value = getenv("IP") ? getenv("IP") : "Unknown"; str = t_str_new(128); var_expand(str, logout_format, tab);