]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
pop3: Added support for verbose_proctitle=yes
authorTimo Sirainen <tss@iki.fi>
Mon, 26 Oct 2009 23:53:48 +0000 (19:53 -0400)
committerTimo Sirainen <tss@iki.fi>
Mon, 26 Oct 2009 23:53:48 +0000 (19:53 -0400)
--HG--
branch : HEAD

src/pop3/main.c
src/pop3/pop3-client.c
src/pop3/pop3-client.h
src/pop3/pop3-common.h
src/pop3/pop3-settings.c
src/pop3/pop3-settings.h

index 689c452ccc27b085ece324ed0da11d3c5f31b47f..ef977043e2dab756fa71f1ceea05f80afb5137db 100644 (file)
@@ -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 <stdio.h>
 #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);
index 0fd8e2796370436748a45f9989d13740f849b609..9158d71bb30d97dc3e5a001d7bf2d41f2d95a668 100644 (file)
@@ -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)
index b875ada42112dc24a5d24a344f39e731d2e1a55b..97bb57cd2ca9e63849bb2fc22079c9907dce3e2b 100644 (file)
@@ -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. */
index e4b0fd496efa5ed195ed2889d111968fe6cdab98..ea16b5eb5983c233b73909c9a1ee286fb37731f6 100644 (file)
@@ -14,4 +14,6 @@ enum uidl_keys {
 
 extern void (*hook_client_created)(struct client **client);
 
+void pop3_refresh_proctitle(void);
+
 #endif
index 77ce051642f7e2d54cd873830f0ed1b3f9fc96c9..71027cad8e1c6a89b5cb0fc00168c5391f5d2169 100644 (file)
@@ -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,
index 50b05f2028db3408a2bf1c3987839c6602a200d2..43c148b58686a0554373ec524805cd1c6874207a 100644 (file)
@@ -12,6 +12,7 @@ enum pop3_client_workarounds {
 
 struct pop3_settings {
        bool mail_debug;
+       bool verbose_proctitle;
 
        /* pop3: */
        bool pop3_no_flag_updates;