#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"
#include "param/param.h"
+#include "librpc/gen_ndr/ndr_irpc_c.h"
/*
terminate a task service
*/
-void task_server_terminate(struct task_server *task, const char *reason)
+void task_server_terminate(struct task_server *task, const char *reason, bool fatal)
{
struct tevent_context *event_ctx = task->event_ctx;
const struct model_ops *model_ops = task->model_ops;
DEBUG(0,("task_server_terminate: [%s]\n", reason));
+
+ if (fatal && task->msg_ctx != NULL) {
+ struct dcerpc_binding_handle *irpc_handle;
+ struct samba_terminate r;
+
+ irpc_handle = irpc_binding_handle_by_name(task, task->msg_ctx,
+ "samba", &ndr_table_irpc);
+ if (irpc_handle != NULL) {
+ /* Note: this makes use of nested event loops... */
+ dcerpc_binding_handle_set_sync_ev(irpc_handle, event_ctx);
+ r.in.reason = reason;
+ dcerpc_samba_terminate_r(irpc_handle, task, &r);
+ }
+ }
+
+ imessaging_cleanup(task->msg_ctx);
+
model_ops->terminate(event_ctx, task->lp_ctx, reason);
/* don't free this above, it might contain the 'reason' being printed */
*/
static void task_server_callback(struct tevent_context *event_ctx,
struct loadparm_context *lp_ctx,
- struct server_id server_id, void *private)
+ struct server_id server_id, void *private_data)
{
- struct task_state *state = talloc_get_type(private, struct task_state);
+ struct task_state *state = talloc_get_type(private_data, struct task_state);
struct task_server *task;
task = talloc(event_ctx, struct task_server);
task->server_id = server_id;
task->lp_ctx = lp_ctx;
- task->msg_ctx = messaging_init(task,
- lp_messaging_path(task, task->lp_ctx),
- task->server_id,
- lp_iconv_convenience(task->lp_ctx),
- task->event_ctx);
+ task->msg_ctx = imessaging_init(task,
+ task->lp_ctx,
+ task->server_id,
+ task->event_ctx, false);
if (!task->msg_ctx) {
- task_server_terminate(task, "messaging_init() failed");
+ task_server_terminate(task, "imessaging_init() failed", true);
return;
}