mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
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
This commit is contained in:
parent
a465126e15
commit
526f20bbec
@ -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");
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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");
|
||||
|
@ -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,
|
||||
|
@ -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 */
|
||||
|
@ -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}])
|
||||
|
@ -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
|
||||
################################################
|
||||
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -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 <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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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. */
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user