From: Timo Sirainen Date: Mon, 26 Oct 2009 23:53:48 +0000 (-0400) Subject: pop3: Added support for verbose_proctitle=yes X-Git-Tag: 2.0.alpha3~102 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8846e6eed6177a39b662f4f1ebf9b84ad1f0b7ec;p=thirdparty%2Fdovecot%2Fcore.git pop3: Added support for verbose_proctitle=yes --HG-- branch : HEAD --- diff --git a/src/pop3/main.c b/src/pop3/main.c index 689c452ccc..ef977043e2 100644 --- a/src/pop3/main.c +++ b/src/pop3/main.c @@ -6,11 +6,14 @@ #include "istream.h" #include "ostream.h" #include "base64.h" +#include "str.h" +#include "process-title.h" #include "restrict-access.h" #include "master-service.h" #include "master-login.h" #include "master-interface.h" #include "var-expand.h" +#include "mail-user.h" #include "mail-storage-service.h" #include @@ -20,11 +23,41 @@ #define IS_STANDALONE() \ (getenv(MASTER_UID_ENV) == NULL) +static bool verbose_proctitle = FALSE; static struct mail_storage_service_ctx *storage_service; static struct master_login *master_login = NULL; void (*hook_client_created)(struct client **client) = NULL; +void pop3_refresh_proctitle(void) +{ + struct client *client; + string_t *title = t_str_new(128); + + if (!verbose_proctitle) + return; + + str_append_c(title, '['); + switch (pop3_client_count) { + case 0: + str_append(title, "idling"); + break; + case 1: + client = pop3_clients; + str_append(title, client->user->username); + if (client->user->remote_ip != NULL) { + str_append_c(title, ' '); + str_append(title, net_ip2addr(client->user->remote_ip)); + } + break; + default: + str_printfa(title, "%u connections", pop3_client_count); + break; + } + str_append_c(title, ']'); + process_title_set(str_c(title)); +} + static void pop3_die(void) { /* do nothing. pop3 connections typically die pretty quick anyway. */ @@ -65,6 +98,9 @@ client_create_from_input(const struct mail_storage_service_input *input, restrict_access_allow_coredumps(TRUE); set = mail_storage_service_user_get_set(user)[1]; + if (set->verbose_proctitle) + verbose_proctitle = TRUE; + client = client_create(fd_in, fd_out, mail_user, user, set); T_BEGIN { client_add_input(client, input_buf); diff --git a/src/pop3/pop3-client.c b/src/pop3/pop3-client.c index 0fd8e27963..9158d71bb3 100644 --- a/src/pop3/pop3-client.c +++ b/src/pop3/pop3-client.c @@ -37,6 +37,7 @@ #define CLIENT_COMMIT_TIMEOUT_MSECS (10*1000) struct client *pop3_clients; +unsigned int pop3_client_count; static void client_input(struct client *client); static int client_output(struct client *client); @@ -266,9 +267,12 @@ struct client *client_create(int fd_in, int fd_out, struct mail_user *user, client->anvil_sent = TRUE; } + pop3_client_count++; DLLIST_PREPEND(&pop3_clients, client); if (hook_client_created != NULL) hook_client_created(&client); + + pop3_refresh_proctitle(); return client; } @@ -334,6 +338,7 @@ void client_destroy(struct client *client, const char *reason) client->cmd(client); i_assert(client->cmd == NULL); } + pop3_client_count--; DLLIST_REMOVE(&pop3_clients, client); if (client->trans != NULL) { @@ -375,6 +380,7 @@ void client_destroy(struct client *client, const char *reason) i_free(client); master_service_client_connection_destroyed(master_service); + pop3_refresh_proctitle(); } void client_disconnect(struct client *client, const char *reason) diff --git a/src/pop3/pop3-client.h b/src/pop3/pop3-client.h index b875ada421..97bb57cd2c 100644 --- a/src/pop3/pop3-client.h +++ b/src/pop3/pop3-client.h @@ -62,6 +62,7 @@ struct client { }; extern struct client *pop3_clients; +extern unsigned int pop3_client_count; /* Create new client with specified input/output handles. socket specifies if the handle is a socket. */ diff --git a/src/pop3/pop3-common.h b/src/pop3/pop3-common.h index e4b0fd496e..ea16b5eb59 100644 --- a/src/pop3/pop3-common.h +++ b/src/pop3/pop3-common.h @@ -14,4 +14,6 @@ enum uidl_keys { extern void (*hook_client_created)(struct client **client); +void pop3_refresh_proctitle(void); + #endif diff --git a/src/pop3/pop3-settings.c b/src/pop3/pop3-settings.c index 77ce051642..71027cad8e 100644 --- a/src/pop3/pop3-settings.c +++ b/src/pop3/pop3-settings.c @@ -60,6 +60,7 @@ struct service_settings pop3_service_settings = { static const struct setting_define pop3_setting_defines[] = { DEF(SET_BOOL, mail_debug), + DEF(SET_BOOL, verbose_proctitle), DEF(SET_BOOL, pop3_no_flag_updates), DEF(SET_BOOL, pop3_enable_last), @@ -74,6 +75,7 @@ static const struct setting_define pop3_setting_defines[] = { static const struct pop3_settings pop3_default_settings = { MEMBER(mail_debug) FALSE, + MEMBER(verbose_proctitle) FALSE, MEMBER(pop3_no_flag_updates) FALSE, MEMBER(pop3_enable_last) FALSE, diff --git a/src/pop3/pop3-settings.h b/src/pop3/pop3-settings.h index 50b05f2028..43c148b586 100644 --- a/src/pop3/pop3-settings.h +++ b/src/pop3/pop3-settings.h @@ -12,6 +12,7 @@ enum pop3_client_workarounds { struct pop3_settings { bool mail_debug; + bool verbose_proctitle; /* pop3: */ bool pop3_no_flag_updates;