r14079: I just found the setproctitle library from alt linux:-)
authorStefan Metzmacher <metze@samba.org>
Thu, 9 Mar 2006 17:48:41 +0000 (17:48 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:56:49 +0000 (13:56 -0500)
- add set_title hook to the process models
- use setproctitle library in process_model standard if available
- the the title for the task servers and on connections

metze
(This used to be commit 526f20bbecc9bbd607595637c15fc4001d3f0c70)

16 files changed:
source4/cldap_server/cldap_server.c
source4/kdc/kdc.c
source4/ldap_server/ldap_server.c
source4/nbt_server/nbt_server.c
source4/smb_server/smb_server.c
source4/smbd/process_model.h
source4/smbd/process_model.m4
source4/smbd/process_model.mk
source4/smbd/process_single.c
source4/smbd/process_standard.c
source4/smbd/process_thread.c
source4/smbd/service_stream.c
source4/smbd/service_task.c
source4/web_server/web_server.c
source4/winbind/wb_server.c
source4/wrepl_server/wrepl_server.c

index ef2487cc9d57608226e2f34caf0a66e868ece7e6..3687eb52188a0087c7b5ef605c9cba4b781b3e1f 100644 (file)
@@ -137,6 +137,8 @@ static void cldapd_task_init(struct task_server *task)
                return;
        }
 
+       task_server_set_title(task, "task[cldapd]");
+
        cldapd = talloc(task, struct cldapd_server);
        if (cldapd == NULL) {
                task_server_terminate(task, "cldapd: out of memory");
index 97f82460024880c981baea572d345efef37f936d..2fd5674f79456bcc0d2441b4001ce58a3e94f428 100644 (file)
@@ -544,6 +544,8 @@ static void kdc_task_init(struct task_server *task)
                return;
        }
 
+       task_server_set_title(task, "task[kdc]");
+
        kdc = talloc(task, struct kdc_server);
        if (kdc == NULL) {
                task_server_terminate(task, "kdc: out of memory");
index 867f576827a3fc4e70b997a3a64f80df6fe33613..ee203abc7969b226aa3c2bf07a1858e9ccf244b5 100644 (file)
@@ -548,6 +548,8 @@ static void ldapsrv_task_init(struct task_server *task)
        struct ldapsrv_service *ldap_service;
        NTSTATUS status;
 
+       task_server_set_title(task, "task[ldapsrv]");
+
        ldap_service = talloc_zero(task, struct ldapsrv_service);
        if (ldap_service == NULL) goto failed;
 
index f5a7934dc3a56fa8f2b86a4bfe93089ef6bda805..43772eee07bbefe5a117da4a5b4ad54274d0df0c 100644 (file)
@@ -41,6 +41,8 @@ static void nbtd_task_init(struct task_server *task)
                return;
        }
 
+       task_server_set_title(task, "task[nbtd]");
+
        nbtsrv = talloc(task, struct nbtd_server);
        if (nbtsrv == NULL) {
                task_server_terminate(task, "nbtd: out of memory");
index 2b12e9fda213df1385f2c80695a3a2eef62033cb..ac87cc14e0d113b00e49f46121e3b7d2a33455a9 100644 (file)
@@ -154,7 +154,7 @@ static void smbsrv_accept(struct stream_connection *conn)
 }
 
 static const struct stream_server_ops smb_stream_ops = {
-       .name                   = "smb",
+       .name                   = "smbsrv",
        .accept_connection      = smbsrv_accept,
        .recv_handler           = smbsrv_recv,
        .send_handler           = smbsrv_send,
index 4080d2d4b6e47da76a296ff759d9701965a172b1..d525ce9cdd71a99c298d430003b51743bf390e67 100644 (file)
@@ -51,9 +51,11 @@ struct model_ops {
                         void (*)(struct event_context *, uint32_t, void *),
                         void *);
 
-       /* function to terminate a task */
+       /* function to terminate a connection or task */
        void (*terminate)(struct event_context *, const char *reason);
 
+       /* function to set a title for the connection or task */
+       void (*set_title)(struct event_context *, const char *title);
 };
 
 /* this structure is used by modules to determine the size of some critical types */
index 673d5e5e2b1d09a1f18e9c3132103bf974ce8a85..ea7373e4f71ebdb6169ef4fd03825c67fc4d50a2 100644 (file)
@@ -24,3 +24,20 @@ AC_MSG_RESULT(no)
 )
 
 SMB_EXT_LIB(PTHREAD,[-lpthread])
+
+AC_CHECK_HEADERS(setproctitle.h)
+AC_CHECK_LIB_EXT(setproctitle, SETPROCTITLE_LIBS, setproctitle)
+AC_MSG_CHECKING(whether to use setproctitle)
+if test x"$ac_cv_header_setproctitle_h" = x"yes" -a x"$ac_cv_lib_ext_setproctitle_setproctitle" = x"yes"; then
+       AC_MSG_RESULT(yes)
+       SMB_EXT_LIB_ENABLE(SETPROCTITLE,YES)
+       AC_DEFINE(HAVE_SETPROCTITLE,1,[Whether setproctitle() is available])
+else 
+       AC_MSG_RESULT(no)
+fi
+
+SMB_EXT_LIB(SETPROCTITLE,
+       [${SETPROCTITLE_LIBS}],
+       [${SETPROCTITLE_CFLAGS}],
+       [${SETPROCTITLE_CPPFLAGS}],
+       [${SETPROCTITLE_LDFLAGS}])
index 22083a7a870d36a17f9b88c563bb518ef604af20..e09db012fbdd775458cc926e637dec293f4db79f 100644 (file)
@@ -17,6 +17,7 @@ INIT_FUNCTION = process_model_standard_init
 SUBSYSTEM = PROCESS_MODEL
 OBJ_FILES = \
                process_standard.o
+REQUIRED_SUBSYSTEMS = EXT_LIB_SETPROCTITLE
 # End MODULE process_model_standard
 ################################################
 
index 3e60b6bd5be4504b42db94d8deee3c346178c296..1ca2718454312f5af2cee41046f06ea03d9a295d 100644 (file)
@@ -88,12 +88,18 @@ static void single_terminate(struct event_context *ev, const char *reason)
        DEBUG(2,("single_terminate: reason[%s]\n",reason));
 }
 
+/* called to set a title of a task or connection */
+static void single_set_title(struct event_context *ev, const char *title) 
+{
+}
+
 static const struct model_ops single_ops = {
        .name                   = "single",
        .model_init             = single_model_init,
        .new_task               = single_new_task,
        .accept_connection      = single_accept_connection,
        .terminate              = single_terminate,
+       .set_title              = single_set_title,
 };
 
 /*
index dadbe5bf804eec7f4124935ef6a791847992c143..798d0883c8ef97038afd33ef2db72a995c057617 100644 (file)
@@ -26,6 +26,7 @@
 #include "lib/events/events.h"
 #include "lib/tdb/include/tdb.h"
 #include "smb_server/smb_server.h"
+#include "lib/socket/socket.h"
 
 /* For specifiying event context to GSSAPI below */
 #include "system/kerberos.h"
 
 #include "passdb/secrets.h"
 
+#ifdef HAVE_SETPROCTITLE
+#include <setproctitle.h>
+#define SETPROCTITLE(x) setproctitle x
+#else
+#define SETPROCTITLE(x)
+#endif
+
 /*
   called when the process model is selected
 */
@@ -54,6 +62,7 @@ static void standard_accept_connection(struct event_context *ev,
        struct socket_context *sock2;
        pid_t pid;
        struct event_context *ev2;
+       struct socket_address *c, *s;
 
        /* accept an incoming connection. */
        status = socket_accept(sock, &sock2);
@@ -75,6 +84,8 @@ static void standard_accept_connection(struct event_context *ev,
                return;
        }
 
+       pid = getpid();
+
        /* This is now the child code. We need a completely new event_context to work with */
        ev2 = event_context_init(NULL);
 
@@ -104,8 +115,18 @@ static void standard_accept_connection(struct event_context *ev,
        /* Ensure that the forked children do not expose identical random streams */
        set_need_random_reseed();
 
+       /* setup the process title */
+       c = socket_get_peer_addr(sock2, ev2);
+       s = socket_get_my_addr(sock2, ev2);
+       if (s && c) {
+               SETPROCTITLE(("conn c[%s:%u] s[%s:%u] server_id[%d]",
+                             c->addr, c->port, s->addr, s->port, pid));
+       }
+       talloc_free(c);
+       talloc_free(s);
+
        /* setup this new connection */
-       new_conn(ev2, sock2, getpid(), private);
+       new_conn(ev2, sock2, pid, private);
 
        /* we can't return to the top level here, as that event context is gone,
           so we now process events in the new event context until there are no
@@ -133,6 +154,8 @@ static void standard_new_task(struct event_context *ev,
                return;
        }
 
+       pid = getpid();
+
        /* This is now the child code. We need a completely new event_context to work with */
        ev2 = event_context_init(NULL);
 
@@ -153,8 +176,10 @@ static void standard_new_task(struct event_context *ev,
        /* Ensure that the forked children do not expose identical random streams */
        set_need_random_reseed();
 
+       SETPROCTITLE(("task server_id[%d]", pid));
+
        /* setup this new connection */
-       new_task(ev2, getpid(), private);
+       new_task(ev2, pid, private);
 
        /* we can't return to the top level here, as that event context is gone,
           so we now process events in the new event context until there are no
@@ -184,6 +209,15 @@ static void standard_terminate(struct event_context *ev, const char *reason)
        exit(0);
 }
 
+/* called to set a title of a task or connection */
+static void standard_set_title(struct event_context *ev, const char *title) 
+{
+       if (title) {
+               SETPROCTITLE(("%s", title));
+       } else {
+               SETPROCTITLE((NULL));
+       }
+}
 
 static const struct model_ops standard_ops = {
        .name                   = "standard",
@@ -191,6 +225,7 @@ static const struct model_ops standard_ops = {
        .accept_connection      = standard_accept_connection,
        .new_task               = standard_new_task,
        .terminate              = standard_terminate,
+       .set_title              = standard_set_title,
 };
 
 /*
index 10b7051356f19b41b4336e788cb32c7b8e8acba1..bab630ef225ed62c4dbacd6a302705bbdec528c4 100644 (file)
@@ -188,6 +188,11 @@ static void thread_terminate(struct event_context *event_ctx, const char *reason
        pthread_exit(NULL);  /* thread cleanup routine will do actual cleanup */
 }
 
+/* called to set a title of a task or connection */
+static void thread_set_title(struct event_context *ev, const char *title) 
+{
+}
+
 /*
   mutex init function for thread model
 */
@@ -520,6 +525,7 @@ static const struct model_ops thread_ops = {
        .accept_connection      = thread_accept_connection,
        .new_task               = thread_new_task,
        .terminate              = thread_terminate,
+       .set_title              = thread_set_title,
 };
 
 /*
index 13cb570e0c97ae21f27f794a2eff8743508f6860..59e87304d3ae433c53b5de1b53be5cee7689ba76 100644 (file)
@@ -25,6 +25,7 @@
 #include "process_model.h"
 #include "lib/events/events.h"
 #include "lib/socket/socket.h"
+#include "smbd/service.h"
 #include "smbd/service_stream.h"
 #include "lib/messaging/irpc.h"
 
@@ -143,6 +144,7 @@ static void stream_new_connection(struct event_context *ev,
 {
        struct stream_socket *stream_socket = talloc_get_type(private, struct stream_socket);
        struct stream_connection *srv_conn;
+       struct socket_address *c, *s;
 
        srv_conn = talloc_zero(ev, struct stream_connection);
        if (!srv_conn) {
@@ -174,6 +176,21 @@ static void stream_new_connection(struct event_context *ev,
                return;
        }
 
+       c = socket_get_peer_addr(sock, ev);
+       s = socket_get_my_addr(sock, ev);
+       if (s && c) {
+               const char *title;
+               title = talloc_asprintf(s, "conn[%s] c[%s:%u] s[%s:%u] server_id[%d]",
+                                       stream_socket->ops->name, 
+                                       c->addr, c->port, s->addr, s->port,
+                                       server_id);
+               if (title) {
+                       stream_connection_set_title(srv_conn, title);
+               }
+       }
+       talloc_free(c);
+       talloc_free(s);
+
        /* call the server specific accept code */
        stream_socket->ops->accept_connection(srv_conn);
 }
@@ -271,3 +288,11 @@ NTSTATUS stream_setup_socket(struct event_context *event_context,
 
        return NT_STATUS_OK;
 }
+
+/*
+  setup a connection title 
+*/
+void stream_connection_set_title(struct stream_connection *conn, const char *title)
+{
+       conn->model_ops->set_title(conn->event.ctx, title);
+}
index c6784e7132179382e6523fd3eafc7158bf9838fd..2963bac425451e46efaab9f9184163f8d299c061 100644 (file)
@@ -23,6 +23,7 @@
 #include "includes.h"
 #include "process_model.h"
 #include "lib/events/events.h"
+#include "smbd/service.h"
 #include "smbd/service_task.h"
 #include "lib/messaging/irpc.h"
 
@@ -90,3 +91,10 @@ NTSTATUS task_server_startup(struct event_context *event_ctx,
        return NT_STATUS_OK;
 }
 
+/*
+  setup a task title 
+*/
+void task_server_set_title(struct task_server *task, const char *title)
+{
+       task->model_ops->set_title(task->event_ctx, title);
+}
index d8e41a1ff1e768d17f0ad47e60d374765bf18324..05c315e4fa3c270b398c2ed02f9da0586be7d079 100644 (file)
@@ -238,6 +238,8 @@ static void websrv_task_init(struct task_server *task)
        uint16_t port = lp_web_port();
        const struct model_ops *model_ops;
 
+       task_server_set_title(task, "task[websrv]");
+
        /* run the web server as a single process */
        model_ops = process_model_byname("single");
        if (!model_ops) goto failed;
index 8cd578216861c3fcc3a6711ccb5806ea2f48d170..16663f61613c8d6d059af59a154db0e2e7c67d0e 100644 (file)
@@ -116,6 +116,8 @@ static void winbind_task_init(struct task_server *task)
        struct wbsrv_service *service;
        struct wbsrv_listen_socket *listen_socket;
 
+       task_server_set_title(task, "task[winbind]");
+
        /* within the winbind task we want to be a single process, so
           ask for the single process model ops and pass these to the
           stream_setup_socket() call. */
index 49eb13909a012dba8c4aac1330295c8bf3bcd9d2..885307d0c363e3308fc929de4457d1a1a18fae96 100644 (file)
@@ -437,6 +437,8 @@ static void wreplsrv_task_init(struct task_server *task)
        NTSTATUS status;
        struct wreplsrv_service *service;
 
+       task_server_set_title(task, "task[wreplsrv]");
+
        service = talloc_zero(task, struct wreplsrv_service);
        if (!service) {
                task_server_terminate(task, "wreplsrv_task_init: out of memory");