From 526f20bbecc9bbd607595637c15fc4001d3f0c70 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 9 Mar 2006 17:48:41 +0000 Subject: [PATCH] r14079: I just found the setproctitle library from alt linux:-) - 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 --- source/cldap_server/cldap_server.c | 2 ++ source/kdc/kdc.c | 2 ++ source/ldap_server/ldap_server.c | 2 ++ source/nbt_server/nbt_server.c | 2 ++ source/smb_server/smb_server.c | 2 +- source/smbd/process_model.h | 4 ++- source/smbd/process_model.m4 | 17 +++++++++++++ source/smbd/process_model.mk | 1 + source/smbd/process_single.c | 6 +++++ source/smbd/process_standard.c | 39 ++++++++++++++++++++++++++++-- source/smbd/process_thread.c | 6 +++++ source/smbd/service_stream.c | 25 +++++++++++++++++++ source/smbd/service_task.c | 8 ++++++ source/web_server/web_server.c | 2 ++ source/winbind/wb_server.c | 2 ++ source/wrepl_server/wrepl_server.c | 2 ++ 16 files changed, 118 insertions(+), 4 deletions(-) diff --git a/source/cldap_server/cldap_server.c b/source/cldap_server/cldap_server.c index ef2487cc9..3687eb521 100644 --- a/source/cldap_server/cldap_server.c +++ b/source/cldap_server/cldap_server.c @@ -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"); diff --git a/source/kdc/kdc.c b/source/kdc/kdc.c index 97f824600..2fd5674f7 100644 --- a/source/kdc/kdc.c +++ b/source/kdc/kdc.c @@ -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"); diff --git a/source/ldap_server/ldap_server.c b/source/ldap_server/ldap_server.c index 867f57682..ee203abc7 100644 --- a/source/ldap_server/ldap_server.c +++ b/source/ldap_server/ldap_server.c @@ -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; diff --git a/source/nbt_server/nbt_server.c b/source/nbt_server/nbt_server.c index f5a7934dc..43772eee0 100644 --- a/source/nbt_server/nbt_server.c +++ b/source/nbt_server/nbt_server.c @@ -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"); diff --git a/source/smb_server/smb_server.c b/source/smb_server/smb_server.c index 2b12e9fda..ac87cc14e 100644 --- a/source/smb_server/smb_server.c +++ b/source/smb_server/smb_server.c @@ -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, diff --git a/source/smbd/process_model.h b/source/smbd/process_model.h index 4080d2d4b..d525ce9cd 100644 --- a/source/smbd/process_model.h +++ b/source/smbd/process_model.h @@ -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 */ diff --git a/source/smbd/process_model.m4 b/source/smbd/process_model.m4 index 673d5e5e2..ea7373e4f 100644 --- a/source/smbd/process_model.m4 +++ b/source/smbd/process_model.m4 @@ -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}]) diff --git a/source/smbd/process_model.mk b/source/smbd/process_model.mk index 22083a7a8..e09db012f 100644 --- a/source/smbd/process_model.mk +++ b/source/smbd/process_model.mk @@ -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 ################################################ diff --git a/source/smbd/process_single.c b/source/smbd/process_single.c index 3e60b6bd5..1ca271845 100644 --- a/source/smbd/process_single.c +++ b/source/smbd/process_single.c @@ -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, }; /* diff --git a/source/smbd/process_standard.c b/source/smbd/process_standard.c index dadbe5bf8..798d0883c 100644 --- a/source/smbd/process_standard.c +++ b/source/smbd/process_standard.c @@ -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" @@ -33,6 +34,13 @@ #include "passdb/secrets.h" +#ifdef HAVE_SETPROCTITLE +#include +#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, }; /* diff --git a/source/smbd/process_thread.c b/source/smbd/process_thread.c index 10b705135..bab630ef2 100644 --- a/source/smbd/process_thread.c +++ b/source/smbd/process_thread.c @@ -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, }; /* diff --git a/source/smbd/service_stream.c b/source/smbd/service_stream.c index 13cb570e0..59e87304d 100644 --- a/source/smbd/service_stream.c +++ b/source/smbd/service_stream.c @@ -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); +} diff --git a/source/smbd/service_task.c b/source/smbd/service_task.c index c6784e713..2963bac42 100644 --- a/source/smbd/service_task.c +++ b/source/smbd/service_task.c @@ -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); +} diff --git a/source/web_server/web_server.c b/source/web_server/web_server.c index d8e41a1ff..05c315e4f 100644 --- a/source/web_server/web_server.c +++ b/source/web_server/web_server.c @@ -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; diff --git a/source/winbind/wb_server.c b/source/winbind/wb_server.c index 8cd578216..16663f616 100644 --- a/source/winbind/wb_server.c +++ b/source/winbind/wb_server.c @@ -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. */ diff --git a/source/wrepl_server/wrepl_server.c b/source/wrepl_server/wrepl_server.c index 49eb13909..885307d0c 100644 --- a/source/wrepl_server/wrepl_server.c +++ b/source/wrepl_server/wrepl_server.c @@ -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"); -- 2.34.1