From: Andrew Tridgell Date: Sat, 30 Oct 2010 00:24:15 +0000 (+1100) Subject: s4-smbd: don't initialise process models more than once X-Git-Tag: samba-4.0.0alpha14~1562 X-Git-Url: http://git.samba.org/?p=samba.git;a=commitdiff_plain;h=046d38faa5e78f2bdcfcdb3b1582427c2ecc80b8 s4-smbd: don't initialise process models more than once this also removes the event_context parameter from process model initialisation. It isn't needed, and is confusing when a process model init can be called from more than one place, possibly with different event contexts. Pair-Programmed-With: Andrew Bartlett --- diff --git a/source4/dns_server/dns_server.c b/source4/dns_server/dns_server.c index 635cd9507fa..8e37fc21d3d 100644 --- a/source4/dns_server/dns_server.c +++ b/source4/dns_server/dns_server.c @@ -550,7 +550,7 @@ static NTSTATUS dns_startup_interfaces(struct dns_server *dns, struct loadparm_c /* within the dns 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. */ - model_ops = process_model_startup(dns->task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) { DEBUG(0,("Can't find 'single' process model_ops\n")); return NT_STATUS_INTERNAL_ERROR; diff --git a/source4/kdc/kdc.c b/source4/kdc/kdc.c index 3242258e23e..a4bab42920b 100644 --- a/source4/kdc/kdc.c +++ b/source4/kdc/kdc.c @@ -537,7 +537,7 @@ static NTSTATUS kdc_startup_interfaces(struct kdc_server *kdc, struct loadparm_c /* within the kdc 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. */ - model_ops = process_model_startup(kdc->task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) { DEBUG(0,("Can't find 'single' process model_ops\n")); return NT_STATUS_INTERNAL_ERROR; diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c index ba5a268e8e2..38e89598833 100644 --- a/source4/ldap_server/ldap_server.c +++ b/source4/ldap_server/ldap_server.c @@ -899,7 +899,7 @@ static void ldapsrv_task_init(struct task_server *task) task_server_set_title(task, "task[ldapsrv]"); /* run the ldap server as a single process */ - model_ops = process_model_startup(task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) goto failed; ldap_service = talloc_zero(task, struct ldapsrv_service); diff --git a/source4/ntp_signd/ntp_signd.c b/source4/ntp_signd/ntp_signd.c index ae3eeb93f75..a0dd2d3065b 100644 --- a/source4/ntp_signd/ntp_signd.c +++ b/source4/ntp_signd/ntp_signd.c @@ -503,7 +503,7 @@ static void ntp_signd_task_init(struct task_server *task) /* within the ntp_signd 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. */ - model_ops = process_model_startup(task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) { DEBUG(0,("Can't find 'single' process model_ops\n")); return; diff --git a/source4/rpc_server/service_rpc.c b/source4/rpc_server/service_rpc.c index 82d6d9be6ec..dfe25b75c66 100644 --- a/source4/rpc_server/service_rpc.c +++ b/source4/rpc_server/service_rpc.c @@ -56,7 +56,7 @@ static void dcesrv_task_init(struct task_server *task) /* run the rpc server as a single process to allow for shard * handles, and sharing of ldb contexts */ - model_ops = process_model_startup(task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) goto failed; status = dcesrv_init_context(task->event_ctx, diff --git a/source4/smb_server/smb_samba3.c b/source4/smb_server/smb_samba3.c index 5af2ce50423..df85bcf9001 100644 --- a/source4/smb_server/smb_samba3.c +++ b/source4/smb_server/smb_samba3.c @@ -119,7 +119,7 @@ static void samba3_smb_task_init(struct task_server *task) NTSTATUS status; const struct model_ops *model_ops; - model_ops = process_model_startup(task->event_ctx, "standard"); + model_ops = process_model_startup("standard"); if (model_ops == NULL) { goto failed; diff --git a/source4/smbd/process_model.c b/source4/smbd/process_model.c index d3f234eb41c..0e636054609 100644 --- a/source4/smbd/process_model.c +++ b/source4/smbd/process_model.c @@ -22,32 +22,52 @@ #include "smbd/process_model.h" #include "param/param.h" -static const struct model_ops *process_model_byname(const char *name); +/* the list of currently registered process models */ +static struct process_model { + struct model_ops *ops; + bool initialised; +} *models = NULL; +static int num_models; + + +/* + return the operations structure for a named backend of the specified type +*/ +static struct process_model *process_model_byname(const char *name) +{ + int i; + + for (i=0;iname, name) == 0) { + return &models[i]; + } + } + + return NULL; +} + /* setup the events for the chosen process model */ -_PUBLIC_ const struct model_ops *process_model_startup(struct tevent_context *ev, const char *model) +_PUBLIC_ const struct model_ops *process_model_startup(const char *model) { - const struct model_ops *ops; + struct process_model *m; - ops = process_model_byname(model); - if (!ops) { + m = process_model_byname(model); + if (m == NULL) { DEBUG(0,("Unknown process model '%s'\n", model)); exit(-1); } - ops->model_init(ev); + if (!m->initialised) { + m->initialised = true; + m->ops->model_init(); + } - return ops; + return m->ops; } -/* the list of currently registered process models */ -static struct process_model { - struct model_ops *ops; -} *models = NULL; -static int num_models; - /* register a process model. @@ -99,22 +119,6 @@ _PUBLIC_ NTSTATUS process_model_init(struct loadparm_context *lp_ctx) return NT_STATUS_OK; } -/* - return the operations structure for a named backend of the specified type -*/ -static const struct model_ops *process_model_byname(const char *name) -{ - int i; - - for (i=0;iname, name) == 0) { - return models[i].ops; - } - } - - return NULL; -} - /* return the PROCESS_MODEL module version, and the size of some critical types This can be used by process model modules to either detect compilation errors, or provide diff --git a/source4/smbd/process_model.h b/source4/smbd/process_model.h index 1d3e32eb341..b5790316ec2 100644 --- a/source4/smbd/process_model.h +++ b/source4/smbd/process_model.h @@ -26,6 +26,7 @@ #include "lib/socket/socket.h" #include "smbd/service.h" +#include "smbd/process_model_proto.h" /* modules can use the following to determine if the interface has changed * please increment the version number after each interface change @@ -41,7 +42,7 @@ struct model_ops { const char *name; /* called at startup when the model is selected */ - void (*model_init)(struct tevent_context *); + void (*model_init)(void); /* function to accept new connection */ void (*accept_connection)(struct tevent_context *, @@ -78,7 +79,7 @@ struct process_model_critical_sizes { extern const struct model_ops single_ops; -const struct model_ops *process_model_startup(struct tevent_context *ev, const char *model); +const struct model_ops *process_model_startup(const char *model); NTSTATUS register_process_model(const void *_ops); NTSTATUS process_model_init(struct loadparm_context *lp_ctx); diff --git a/source4/smbd/process_onefork.c b/source4/smbd/process_onefork.c index b0e2e29bd6c..da34f731641 100644 --- a/source4/smbd/process_onefork.c +++ b/source4/smbd/process_onefork.c @@ -49,7 +49,7 @@ static int none_setproctitle(const char *fmt, ...) /* called when the process model is selected */ -static void onefork_model_init(struct tevent_context *ev) +static void onefork_model_init(void) { signal(SIGCHLD, SIG_IGN); } diff --git a/source4/smbd/process_prefork.c b/source4/smbd/process_prefork.c index 64941dbeb5f..13404643814 100644 --- a/source4/smbd/process_prefork.c +++ b/source4/smbd/process_prefork.c @@ -49,7 +49,7 @@ static int none_setproctitle(const char *fmt, ...) /* called when the process model is selected */ -static void prefork_model_init(struct tevent_context *ev) +static void prefork_model_init(void) { signal(SIGCHLD, SIG_IGN); } diff --git a/source4/smbd/process_single.c b/source4/smbd/process_single.c index 688b46e0a01..7678a912f98 100644 --- a/source4/smbd/process_single.c +++ b/source4/smbd/process_single.c @@ -29,7 +29,7 @@ /* called when the process model is selected */ -static void single_model_init(struct tevent_context *ev) +static void single_model_init(void) { } diff --git a/source4/smbd/process_standard.c b/source4/smbd/process_standard.c index 5ee8e6948d0..99e815a160b 100644 --- a/source4/smbd/process_standard.c +++ b/source4/smbd/process_standard.c @@ -50,7 +50,7 @@ static int child_pipe[2]; /* called when the process model is selected */ -static void standard_model_init(struct tevent_context *ev) +static void standard_model_init(void) { pipe(child_pipe); signal(SIGCHLD, SIG_IGN); diff --git a/source4/smbd/process_thread.c b/source4/smbd/process_thread.c index b169a79222c..cf94234c34f 100644 --- a/source4/smbd/process_thread.c +++ b/source4/smbd/process_thread.c @@ -511,7 +511,7 @@ static void thread_fault_handler(int sig) /* called when the process model is selected */ -static void thread_model_init(struct tevent_context *event_context) +static void thread_model_init(void) { struct mutex_ops m_ops; struct debug_ops d_ops; @@ -520,7 +520,7 @@ static void thread_model_init(struct tevent_context *event_context) ZERO_STRUCT(d_ops); pthread_key_create(&title_key, NULL); - pthread_setspecific(title_key, talloc_strdup(event_context, "")); + pthread_setspecific(title_key, NULL); /* register mutex/rwlock handlers */ m_ops.mutex_init = thread_mutex_init; diff --git a/source4/smbd/service.c b/source4/smbd/service.c index 7b53e9fa4e3..9cdbbc28f3a 100644 --- a/source4/smbd/service.c +++ b/source4/smbd/service.c @@ -83,7 +83,7 @@ NTSTATUS server_service_startup(struct tevent_context *event_ctx, return NT_STATUS_INVALID_PARAMETER; } - model_ops = process_model_startup(event_ctx, model); + model_ops = process_model_startup(model); if (!model_ops) { DEBUG(0,("process_model_startup('%s') failed\n", model)); return NT_STATUS_INTERNAL_ERROR; diff --git a/source4/torture/rpc/spoolss_notify.c b/source4/torture/rpc/spoolss_notify.c index 8e23637442e..4608f1f09db 100644 --- a/source4/torture/rpc/spoolss_notify.c +++ b/source4/torture/rpc/spoolss_notify.c @@ -460,7 +460,7 @@ static bool test_start_dcerpc_server(struct torture_context *tctx, torture_comment(tctx, "Listening for callbacks on %s\n", address); - status = smbsrv_add_socket(event_ctx, tctx->lp_ctx, &single_ops, address); + status = smbsrv_add_socket(event_ctx, tctx->lp_ctx, process_model_startup("single"), address); torture_assert_ntstatus_ok(tctx, status, "starting smb server"); status = dcesrv_init_context(tctx, tctx->lp_ctx, endpoints, &dce_ctx); @@ -469,7 +469,7 @@ static bool test_start_dcerpc_server(struct torture_context *tctx, for (e=dce_ctx->endpoint_list;e;e=e->next) { status = dcesrv_add_ep(dce_ctx, tctx->lp_ctx, - e, tctx->ev, &single_ops); + e, tctx->ev, process_model_startup("single")); torture_assert_ntstatus_ok(tctx, status, "unable listen on dcerpc endpoint server"); } diff --git a/source4/web_server/web_server.c b/source4/web_server/web_server.c index f40f0a625ba..97e65e5a475 100644 --- a/source4/web_server/web_server.c +++ b/source4/web_server/web_server.c @@ -307,7 +307,7 @@ static void websrv_task_init(struct task_server *task) task_server_set_title(task, "task[websrv]"); /* run the web server as a single process */ - model_ops = process_model_startup(task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) goto failed; if (lpcfg_interfaces(task->lp_ctx) && lpcfg_bind_interfaces_only(task->lp_ctx)) { diff --git a/source4/winbind/wb_server.c b/source4/winbind/wb_server.c index 184b1162c12..34d145d318e 100644 --- a/source4/winbind/wb_server.c +++ b/source4/winbind/wb_server.c @@ -205,7 +205,7 @@ static void winbind_task_init(struct task_server *task) /* 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. */ - model_ops = process_model_startup(task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) { task_server_terminate(task, "Can't find 'single' process model_ops", true); diff --git a/source4/wrepl_server/wrepl_in_connection.c b/source4/wrepl_server/wrepl_in_connection.c index a32b842e04a..632c9a9a5b2 100644 --- a/source4/wrepl_server/wrepl_in_connection.c +++ b/source4/wrepl_server/wrepl_in_connection.c @@ -357,7 +357,7 @@ NTSTATUS wreplsrv_in_connection_merge(struct wreplsrv_partner *partner, /* within the wrepl 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. */ - model_ops = process_model_startup(service->task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) { DEBUG(0,("Can't find 'single' process model_ops")); return NT_STATUS_INTERNAL_ERROR; @@ -430,7 +430,7 @@ NTSTATUS wreplsrv_setup_sockets(struct wreplsrv_service *service, struct loadpar /* within the wrepl 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. */ - model_ops = process_model_startup(task->event_ctx, "single"); + model_ops = process_model_startup("single"); if (!model_ops) { DEBUG(0,("Can't find 'single' process model_ops")); return NT_STATUS_INTERNAL_ERROR;