torture:smb2:replay: extend CHECK_CREATE_OUT() to know leases
[samba.git] / source4 / smbd / service_task.c
index 34ce755b9316f48af773704937eb1ca4c72b192c..7422f2c3e9be2bb21af402ebf80dd32c5cb662e8 100644 (file)
 
 #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 */
@@ -54,9 +69,9 @@ struct task_state {
 */
 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);
@@ -67,13 +82,12 @@ static void task_server_callback(struct tevent_context *event_ctx,
        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;
        }