source4 smdb: Add a post fork hook to the service API
[bbaumbach/samba-autobuild/.git] / source4 / cldap_server / cldap_server.c
index 65d983f729565cf0af2bd5429f936b02136fb78e..511832608336ce0ca31122954a5d3fa9b469373e 100644 (file)
@@ -185,7 +185,7 @@ static NTSTATUS cldapd_startup_interfaces(struct cldapd_server *cldapd, struct l
 /*
   startup the cldapd task
 */
-static void cldapd_task_init(struct task_server *task)
+static NTSTATUS cldapd_task_init(struct task_server *task)
 {
        struct cldapd_server *cldapd;
        NTSTATUS status;
@@ -195,18 +195,18 @@ static void cldapd_task_init(struct task_server *task)
 
        if (iface_list_count(ifaces) == 0) {
                task_server_terminate(task, "cldapd: no network interfaces configured", false);
-               return;
+               return NT_STATUS_UNSUCCESSFUL;
        }
 
        switch (lpcfg_server_role(task->lp_ctx)) {
        case ROLE_STANDALONE:
                task_server_terminate(task, "cldap_server: no CLDAP server required in standalone configuration", 
                                      false);
-               return;
+               return NT_STATUS_INVALID_DOMAIN_ROLE;
        case ROLE_DOMAIN_MEMBER:
                task_server_terminate(task, "cldap_server: no CLDAP server required in member server configuration",
                                      false);
-               return;
+               return NT_STATUS_INVALID_DOMAIN_ROLE;
        case ROLE_ACTIVE_DIRECTORY_DC:
                /* Yes, we want an CLDAP server */
                break;
@@ -217,7 +217,7 @@ static void cldapd_task_init(struct task_server *task)
        cldapd = talloc(task, struct cldapd_server);
        if (cldapd == NULL) {
                task_server_terminate(task, "cldapd: out of memory", true);
-               return;
+               return NT_STATUS_NO_MEMORY;
        }
 
        cldapd->task = task;
@@ -229,17 +229,19 @@ static void cldapd_task_init(struct task_server *task)
                                       0);
        if (cldapd->samctx == NULL) {
                task_server_terminate(task, "cldapd failed to open samdb", true);
-               return;
+               return NT_STATUS_UNSUCCESSFUL;
        }
 
        /* start listening on the configured network interfaces */
        status = cldapd_startup_interfaces(cldapd, task->lp_ctx, ifaces);
        if (!NT_STATUS_IS_OK(status)) {
                task_server_terminate(task, "cldapd failed to setup interfaces", true);
-               return;
+               return status;
        }
 
        irpc_add_name(task->msg_ctx, "cldap_server");
+
+       return NT_STATUS_OK;
 }
 
 
@@ -250,8 +252,9 @@ NTSTATUS server_service_cldapd_init(TALLOC_CTX *ctx)
 {
        static const struct service_details details = {
                .inhibit_fork_on_accept = true,
-               .inhibit_pre_fork = true
+               .inhibit_pre_fork = true,
+               .task_init = cldapd_task_init,
+               .post_fork = NULL
        };
-       return register_server_service(ctx, "cldap", cldapd_task_init,
-                                      &details);
+       return register_server_service(ctx, "cldap", &details);
 }