s4-server: kill main daemon if a task fails to initialise
authorAndrew Tridgell <tridge@samba.org>
Sat, 19 Sep 2009 01:05:55 +0000 (18:05 -0700)
committerAndrew Tridgell <tridge@samba.org>
Sat, 19 Sep 2009 01:05:55 +0000 (18:05 -0700)
When one of our core tasks fails to initialise it can now ask for the
server as a whole to die, rather than limping along in a degraded
state.

25 files changed:
source4/cldap_server/cldap_server.c
source4/dsdb/kcc/kcc_periodic.c
source4/dsdb/kcc/kcc_service.c
source4/dsdb/repl/drepl_notify.c
source4/dsdb/repl/drepl_periodic.c
source4/dsdb/repl/drepl_service.c
source4/kdc/kdc.c
source4/ldap_server/ldap_server.c
source4/lib/messaging/irpc.h
source4/lib/messaging/messaging.h
source4/librpc/idl/irpc.idl
source4/nbt_server/irpc.c
source4/nbt_server/nbt_server.c
source4/ntp_signd/ntp_signd.c
source4/rpc_server/service_rpc.c
source4/smb_server/smb_samba3.c
source4/smb_server/smb_server.c
source4/smbd/process_single.c
source4/smbd/server.c
source4/smbd/service_named_pipe.c
source4/smbd/service_task.c
source4/web_server/web_server.c
source4/winbind/wb_server.c
source4/wrepl_server/wrepl_periodic.c
source4/wrepl_server/wrepl_server.c

index 1a08cd21f90d2b871d02a329710b419e0228075a..ee8c76ef2cfdae00c84d598943da7591f47d44f3 100644 (file)
@@ -187,16 +187,18 @@ static void cldapd_task_init(struct task_server *task)
        load_interfaces(task, lp_interfaces(task->lp_ctx), &ifaces);
 
        if (iface_count(ifaces) == 0) {
-               task_server_terminate(task, "cldapd: no network interfaces configured");
+               task_server_terminate(task, "cldapd: no network interfaces configured", false);
                return;
        }
 
        switch (lp_server_role(task->lp_ctx)) {
        case ROLE_STANDALONE:
-               task_server_terminate(task, "cldap_server: no CLDAP server required in standalone configuration");
+               task_server_terminate(task, "cldap_server: no CLDAP server required in standalone configuration", 
+                                     false);
                return;
        case ROLE_DOMAIN_MEMBER:
-               task_server_terminate(task, "cldap_server: no CLDAP server required in member server configuration");
+               task_server_terminate(task, "cldap_server: no CLDAP server required in member server configuration",
+                                     false);
                return;
        case ROLE_DOMAIN_CONTROLLER:
                /* Yes, we want an CLDAP server */
@@ -207,21 +209,21 @@ 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");
+               task_server_terminate(task, "cldapd: out of memory", true);
                return;
        }
 
        cldapd->task = task;
        cldapd->samctx = samdb_connect(cldapd, task->event_ctx, task->lp_ctx, system_session(cldapd, task->lp_ctx));
        if (cldapd->samctx == NULL) {
-               task_server_terminate(task, "cldapd failed to open samdb");
+               task_server_terminate(task, "cldapd failed to open samdb", true);
                return;
        }
 
        /* 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");
+               task_server_terminate(task, "cldapd failed to setup interfaces", true);
                return;
        }
 
index 3af79d8b89f7e2f31e0a498650551287b3087b83..dae0c1e2358c4b4eb9fe790aa90f2c08fe212891 100644 (file)
@@ -172,7 +172,7 @@ static void kccsrv_periodic_handler_te(struct tevent_context *ev, struct tevent_
 
        status = kccsrv_periodic_schedule(service, service->periodic.interval);
        if (!W_ERROR_IS_OK(status)) {
-               task_server_terminate(service->task, win_errstr(status));
+               task_server_terminate(service->task, win_errstr(status), true);
                return;
        }
 }
index 22798790000ca3f545fefa020254b23f45378c54..32e09ac989808c8bb07bad739b0a86dcb858a29b 100644 (file)
@@ -151,10 +151,10 @@ static void kccsrv_task_init(struct task_server *task)
 
        switch (lp_server_role(task->lp_ctx)) {
        case ROLE_STANDALONE:
-               task_server_terminate(task, "kccsrv: no KCC required in standalone configuration");
+               task_server_terminate(task, "kccsrv: no KCC required in standalone configuration", false);
                return;
        case ROLE_DOMAIN_MEMBER:
-               task_server_terminate(task, "kccsrv: no KCC required in domain member configuration");
+               task_server_terminate(task, "kccsrv: no KCC required in domain member configuration", false);
                return;
        case ROLE_DOMAIN_CONTROLLER:
                /* Yes, we want a KCC */
@@ -165,7 +165,7 @@ static void kccsrv_task_init(struct task_server *task)
 
        service = talloc_zero(task, struct kccsrv_service);
        if (!service) {
-               task_server_terminate(task, "kccsrv_task_init: out of memory");
+               task_server_terminate(task, "kccsrv_task_init: out of memory", true);
                return;
        }
        service->task           = task;
@@ -174,9 +174,10 @@ static void kccsrv_task_init(struct task_server *task)
 
        status = kccsrv_init_creds(service);
        if (!W_ERROR_IS_OK(status)) {
-               task_server_terminate(task, talloc_asprintf(task,
-                                     "kccsrv: Failed to obtain server credentials: %s\n",
-                                     win_errstr(status)));
+               task_server_terminate(task, 
+                                     talloc_asprintf(task,
+                                                     "kccsrv: Failed to obtain server credentials: %s\n",
+                                                     win_errstr(status)), true);
                return;
        }
 
@@ -184,7 +185,7 @@ static void kccsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "kccsrv: Failed to connect to local samdb: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
@@ -192,7 +193,7 @@ static void kccsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "kccsrv: Failed to load partitions: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
@@ -205,7 +206,7 @@ static void kccsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "kccsrv: Failed to periodic schedule: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
index 73280917c52770c27936004bb4c32df637af1027..d354b4e2993fbfc0d50e8e447e7c9da231b05409 100644 (file)
@@ -368,7 +368,7 @@ static void dreplsrv_notify_handler_te(struct tevent_context *ev, struct tevent_
 
        status = dreplsrv_notify_schedule(service, service->notify.interval);
        if (!W_ERROR_IS_OK(status)) {
-               task_server_terminate(service->task, win_errstr(status));
+               task_server_terminate(service->task, win_errstr(status), false);
                return;
        }
 }
index 377cecbe9919e99df60f11ba9d2cf11bb6e45e83..61d5598207d29b829b3f1987361a1832bc5d0033 100644 (file)
@@ -46,7 +46,7 @@ static void dreplsrv_periodic_handler_te(struct tevent_context *ev, struct teven
 
        status = dreplsrv_periodic_schedule(service, service->periodic.interval);
        if (!W_ERROR_IS_OK(status)) {
-               task_server_terminate(service->task, win_errstr(status));
+               task_server_terminate(service->task, win_errstr(status), false);
                return;
        }
 }
index 75ce42b91a38b0bf2a058ad8b383f67b73810357..34853c85f92ac6d21fca2f5a85d9043fdeb06cb0 100644 (file)
@@ -138,10 +138,12 @@ static void dreplsrv_task_init(struct task_server *task)
 
        switch (lp_server_role(task->lp_ctx)) {
        case ROLE_STANDALONE:
-               task_server_terminate(task, "dreplsrv: no DSDB replication required in standalone configuration");
+               task_server_terminate(task, "dreplsrv: no DSDB replication required in standalone configuration", 
+                                     false);
                return;
        case ROLE_DOMAIN_MEMBER:
-               task_server_terminate(task, "dreplsrv: no DSDB replication required in domain member configuration");
+               task_server_terminate(task, "dreplsrv: no DSDB replication required in domain member configuration", 
+                                     false);
                return;
        case ROLE_DOMAIN_CONTROLLER:
                /* Yes, we want DSDB replication */
@@ -152,7 +154,7 @@ static void dreplsrv_task_init(struct task_server *task)
 
        service = talloc_zero(task, struct dreplsrv_service);
        if (!service) {
-               task_server_terminate(task, "dreplsrv_task_init: out of memory");
+               task_server_terminate(task, "dreplsrv_task_init: out of memory", true);
                return;
        }
        service->task           = task;
@@ -163,7 +165,7 @@ static void dreplsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "dreplsrv: Failed to obtain server credentials: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
@@ -171,7 +173,7 @@ static void dreplsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "dreplsrv: Failed to connect to local samdb: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
@@ -179,7 +181,7 @@ static void dreplsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "dreplsrv: Failed to load partitions: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
@@ -190,7 +192,7 @@ static void dreplsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "dreplsrv: Failed to periodic schedule: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
@@ -200,7 +202,7 @@ static void dreplsrv_task_init(struct task_server *task)
        if (!W_ERROR_IS_OK(status)) {
                task_server_terminate(task, talloc_asprintf(task,
                                      "dreplsrv: Failed to setup notify schedule: %s\n",
-                                     win_errstr(status)));
+                                                           win_errstr(status)), true);
                return;
        }
 
index c861f7ae3e2cd77d2803644a434d50155c0a68a8..a67aa094613fe3299110601e4ee2a396dfd244b1 100644 (file)
@@ -662,10 +662,10 @@ static void kdc_task_init(struct task_server *task)
 
        switch (lp_server_role(task->lp_ctx)) {
        case ROLE_STANDALONE:
-               task_server_terminate(task, "kdc: no KDC required in standalone configuration");
+               task_server_terminate(task, "kdc: no KDC required in standalone configuration", false);
                return;
        case ROLE_DOMAIN_MEMBER:
-               task_server_terminate(task, "kdc: no KDC required in member server configuration");
+               task_server_terminate(task, "kdc: no KDC required in member server configuration", false);
                return;
        case ROLE_DOMAIN_CONTROLLER:
                /* Yes, we want a KDC */
@@ -675,7 +675,7 @@ static void kdc_task_init(struct task_server *task)
        load_interfaces(task, lp_interfaces(task->lp_ctx), &ifaces);
 
        if (iface_count(ifaces) == 0) {
-               task_server_terminate(task, "kdc: no network interfaces configured");
+               task_server_terminate(task, "kdc: no network interfaces configured", false);
                return;
        }
 
@@ -683,7 +683,7 @@ static void kdc_task_init(struct task_server *task)
 
        kdc = talloc(task, struct kdc_server);
        if (kdc == NULL) {
-               task_server_terminate(task, "kdc: out of memory");
+               task_server_terminate(task, "kdc: out of memory", true);
                return;
        }
 
@@ -695,7 +695,7 @@ static void kdc_task_init(struct task_server *task)
        if (ret) {
                DEBUG(1,("kdc_task_init: krb5_init_context failed (%s)\n", 
                         error_message(ret)));
-               task_server_terminate(task, "kdc: krb5_init_context failed");
+               task_server_terminate(task, "kdc: krb5_init_context failed", true);
                return; 
        }
 
@@ -704,14 +704,14 @@ static void kdc_task_init(struct task_server *task)
        ret = krb5_kdc_get_config(kdc->smb_krb5_context->krb5_context, 
                                  &kdc->config);
        if(ret) {
-               task_server_terminate(task, "kdc: failed to get KDC configuration");
+               task_server_terminate(task, "kdc: failed to get KDC configuration", true);
                return;
        }
  
        kdc->config->logf = kdc->smb_krb5_context->logf;
        kdc->config->db = talloc(kdc, struct HDB *);
        if (!kdc->config->db) {
-               task_server_terminate(task, "kdc: out of memory");
+               task_server_terminate(task, "kdc: out of memory", true);
                return;
        }
        kdc->config->num_db = 1;
@@ -720,7 +720,7 @@ static void kdc_task_init(struct task_server *task)
                                       kdc->smb_krb5_context->krb5_context, 
                                       &kdc->config->db[0]);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "kdc: hdb_samba4_create_kdc (setup KDC database) failed");
+               task_server_terminate(task, "kdc: hdb_samba4_create_kdc (setup KDC database) failed", true);
                return; 
        }
 
@@ -728,7 +728,7 @@ static void kdc_task_init(struct task_server *task)
 
        kdc->hdb_samba4_context = talloc(kdc, struct hdb_samba4_context);
        if (!kdc->hdb_samba4_context) {
-               task_server_terminate(task, "kdc: out of memory");
+               task_server_terminate(task, "kdc: out of memory", true);
                return; 
        }
 
@@ -739,13 +739,13 @@ static void kdc_task_init(struct task_server *task)
                                   PLUGIN_TYPE_DATA, "hdb",
                                   &hdb_samba4);
        if(ret) {
-               task_server_terminate(task, "kdc: failed to register hdb keytab");
+               task_server_terminate(task, "kdc: failed to register hdb keytab", true);
                return;
        }
 
        ret = krb5_kt_register(kdc->smb_krb5_context->krb5_context, &hdb_kt_ops);
        if(ret) {
-               task_server_terminate(task, "kdc: failed to register hdb keytab");
+               task_server_terminate(task, "kdc: failed to register hdb keytab", true);
                return;
        }
 
@@ -754,7 +754,7 @@ static void kdc_task_init(struct task_server *task)
                                   PLUGIN_TYPE_DATA, "windc",
                                   &windc_plugin_table);
        if(ret) {
-               task_server_terminate(task, "kdc: failed to register hdb keytab");
+               task_server_terminate(task, "kdc: failed to register hdb keytab", true);
                return;
        }
 
@@ -763,14 +763,14 @@ static void kdc_task_init(struct task_server *task)
        /* start listening on the configured network interfaces */
        status = kdc_startup_interfaces(kdc, task->lp_ctx, ifaces);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "kdc failed to setup interfaces");
+               task_server_terminate(task, "kdc failed to setup interfaces", true);
                return;
        }
 
        status = IRPC_REGISTER(task->msg_ctx, irpc, KDC_CHECK_GENERIC_KERBEROS, 
                               kdc_check_generic_kerberos, kdc);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "nbtd failed to setup monitoring");
+               task_server_terminate(task, "nbtd failed to setup monitoring", true);
                return;
        }
 
index b119620339b209a0bd1f9a69ce0115bc2138a117..344015892e9bbb53132c68861d62ffada623110e 100644 (file)
@@ -568,10 +568,12 @@ static void ldapsrv_task_init(struct task_server *task)
 
        switch (lp_server_role(task->lp_ctx)) {
        case ROLE_STANDALONE:
-               task_server_terminate(task, "ldap_server: no LDAP server required in standalone configuration");
+               task_server_terminate(task, "ldap_server: no LDAP server required in standalone configuration", 
+                                     false);
                return;
        case ROLE_DOMAIN_MEMBER:
-               task_server_terminate(task, "ldap_server: no LDAP server required in member server configuration");
+               task_server_terminate(task, "ldap_server: no LDAP server required in member server configuration", 
+                                     false);
                return;
        case ROLE_DOMAIN_CONTROLLER:
                /* Yes, we want an LDAP server */
@@ -642,7 +644,7 @@ static void ldapsrv_task_init(struct task_server *task)
         */
        if (!directory_create_or_exist(priv_dir, geteuid(), 0750)) {
                task_server_terminate(task, "Cannot create ldap "
-                                     "privileged ldapi directory");
+                                     "privileged ldapi directory", true);
                return;
        }
        ldapi_path = talloc_asprintf(ldap_service, "%s/ldapi", priv_dir);
@@ -666,7 +668,7 @@ static void ldapsrv_task_init(struct task_server *task)
        return;
 
 failed:
-       task_server_terminate(task, "Failed to startup ldap server task");      
+       task_server_terminate(task, "Failed to startup ldap server task", true);
 }
 
 
index 3c518828ab77c4b408602e207d3518fd86954be1..c82ad398ff41225c62f40f826f12ba0a53d2f2a5 100644 (file)
@@ -22,6 +22,7 @@
 #ifndef IRPC_H
 #define IRPC_H
 
+#include "lib/messaging/messaging.h"
 #include "librpc/gen_ndr/irpc.h"
 #include "librpc/gen_ndr/server_id.h"
 
index c91a31d285d37d2d86a6c2ad9f80bc8b34e9c1a8..4ec69c8f34080cb9bad696109071b0a45a739daa 100644 (file)
@@ -36,4 +36,7 @@ struct messaging_context;
 /* temporary messaging endpoints are allocated above this line */
 #define MSG_TMP_BASE           1000
 
+/* taskid for messaging of parent process */
+#define SAMBA_PARENT_TASKID     0
+
 #endif
index 41787355a9b091b8277cdc8e1b1d59e06b34618b..24326e434eba5377017ad6e89ab7c27e517dba74 100644 (file)
@@ -141,4 +141,11 @@ import "misc.idl", "security.idl", "nbt.idl";
                [out,switch_is(level)] smbsrv_info info
                );
 
+       /*
+         called when samba should shutdown
+        */
+       void samba_terminate(
+               [in] astring reason
+               );
+
 }
index 951f1d296a9664bd8db95f12fbdbb1f7f638495b..dbaebf66f78661bf937d2992670341a453ae8ccd 100644 (file)
@@ -180,7 +180,7 @@ void nbtd_register_irpc(struct nbtd_server *nbtsrv)
        status = IRPC_REGISTER(task->msg_ctx, irpc, NBTD_INFORMATION, 
                               nbtd_information, nbtsrv);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "nbtd failed to setup monitoring");
+               task_server_terminate(task, "nbtd failed to setup monitoring", true);
                return;
        }
 
@@ -188,7 +188,7 @@ void nbtd_register_irpc(struct nbtd_server *nbtsrv)
                               nbtd_getdcname, nbtsrv);
        if (!NT_STATUS_IS_OK(status)) {
                task_server_terminate(task, "nbtd failed to setup getdcname "
-                                     "handler");
+                                     "handler", true);
                return;
        }
 
@@ -196,7 +196,7 @@ void nbtd_register_irpc(struct nbtd_server *nbtsrv)
                               nbtd_proxy_wins_challenge, nbtsrv);
        if (!NT_STATUS_IS_OK(status)) {
                task_server_terminate(task, "nbtd failed to setup wins challenge "
-                                     "handler");
+                                     "handler", true);
                return;
        }
 
@@ -204,7 +204,7 @@ void nbtd_register_irpc(struct nbtd_server *nbtsrv)
                               nbtd_proxy_wins_release_demand, nbtsrv);
        if (!NT_STATUS_IS_OK(status)) {
                task_server_terminate(task, "nbtd failed to setup wins release demand "
-                                     "handler");
+                                     "handler", true);
                return;
        }
 }
index e6ff5003bf84faeeb822066d97c820f2a6c9da16..4a02feb6fc3e182402b2a5447ee5db45dae0c016 100644 (file)
@@ -42,7 +42,7 @@ static void nbtd_task_init(struct task_server *task)
        load_interfaces(task, lp_interfaces(task->lp_ctx), &ifaces);
 
        if (iface_count(ifaces) == 0) {
-               task_server_terminate(task, "nbtd: no network interfaces configured");
+               task_server_terminate(task, "nbtd: no network interfaces configured", false);
                return;
        }
 
@@ -50,7 +50,7 @@ static void nbtd_task_init(struct task_server *task)
 
        nbtsrv = talloc(task, struct nbtd_server);
        if (nbtsrv == NULL) {
-               task_server_terminate(task, "nbtd: out of memory");
+               task_server_terminate(task, "nbtd: out of memory", true);
                return;
        }
 
@@ -62,20 +62,20 @@ static void nbtd_task_init(struct task_server *task)
        /* start listening on the configured network interfaces */
        status = nbtd_startup_interfaces(nbtsrv, task->lp_ctx, ifaces);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "nbtd failed to setup interfaces");
+               task_server_terminate(task, "nbtd failed to setup interfaces", true);
                return;
        }
 
        nbtsrv->sam_ctx = samdb_connect(nbtsrv, task->event_ctx, task->lp_ctx, system_session(nbtsrv, task->lp_ctx));
        if (nbtsrv->sam_ctx == NULL) {
-               task_server_terminate(task, "nbtd failed to open samdb");
+               task_server_terminate(task, "nbtd failed to open samdb", true);
                return;
        }
 
        /* start the WINS server, if appropriate */
        status = nbtd_winsserver_init(nbtsrv);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "nbtd failed to start WINS server");
+               task_server_terminate(task, "nbtd failed to start WINS server", true);
                return;
        }
 
index 8ea7fe4ff969530d72fcb1f8eeba7030245c92ad..a9c6769821b6878019761de6b1e499e87490c691 100644 (file)
@@ -347,7 +347,7 @@ static void ntp_signd_task_init(struct task_server *task)
                char *error = talloc_asprintf(task, "Cannot create NTP signd pipe directory: %s", 
                                              lp_ntp_signd_socket_directory(task->lp_ctx));
                task_server_terminate(task,
-                                     error);
+                                     error, true);
                return;
        }
 
@@ -364,7 +364,7 @@ static void ntp_signd_task_init(struct task_server *task)
 
        ntp_signd = talloc(task, struct ntp_signd_server);
        if (ntp_signd == NULL) {
-               task_server_terminate(task, "ntp_signd: out of memory");
+               task_server_terminate(task, "ntp_signd: out of memory", true);
                return;
        }
 
@@ -373,7 +373,7 @@ static void ntp_signd_task_init(struct task_server *task)
        /* Must be system to get at the password hashes */
        ntp_signd->samdb = samdb_connect(ntp_signd, task->event_ctx, task->lp_ctx, system_session(ntp_signd, task->lp_ctx));
        if (ntp_signd->samdb == NULL) {
-               task_server_terminate(task, "ntp_signd failed to open samdb");
+               task_server_terminate(task, "ntp_signd failed to open samdb", true);
                return;
        }
 
index 3d5c364ec92d966659d1d7bd1588efbc7a26d692..1c23eb967c868d50ce29e5b7e088a9dbb8281e4b 100644 (file)
@@ -714,7 +714,7 @@ static void dcesrv_task_init(struct task_server *task)
 
        return;
 failed:
-       task_server_terminate(task, "Failed to startup dcerpc server task");    
+       task_server_terminate(task, "Failed to startup dcerpc server task", true);      
 }
 
 NTSTATUS server_service_rpc_init(void)
index 1c84392b0c5adc8673c3b81005a5b3f857805512..e201cdb1e9e5d04b1c279a4cbbacb305438222d1 100644 (file)
@@ -165,7 +165,7 @@ static void samba3_smb_task_init(struct task_server *task)
 
        return;
 failed:
-       task_server_terminate(task, "Failed to startup samba3 smb task");
+       task_server_terminate(task, "Failed to startup samba3 smb task", true);
 }
 
 /* called at smbd startup - register ourselves as a server service */
index 28116938004ead58ffa64d97743d7cb3f4ad3051..9b10f66b2cc07389982e7f3e75938a4ac4cdd8b8 100644 (file)
@@ -249,7 +249,7 @@ static void smbsrv_task_init(struct task_server *task)
 
        return;
 failed:
-       task_server_terminate(task, "Failed to startup smb server task");       
+       task_server_terminate(task, "Failed to startup smb server task", true); 
 }
 
 /* called at smbd startup - register ourselves as a server service */
index 738ace95c7d29f163e34d53e2359157a94a0badf..ff57a0bc34b487b315702032346e06b2aab9f787 100644 (file)
@@ -84,7 +84,9 @@ static void single_new_task(struct tevent_context *ev,
                            void (*new_task)(struct tevent_context *, struct loadparm_context *, struct server_id, void *), 
                            void *private_data)
 {
-       static uint32_t taskid = 0;
+       /* start our taskids at 1, zero is reserved for the top
+          level samba task */
+       static uint32_t taskid = 1;
        
        /* We use 1 so we cannot collide in with cluster ids generated
         * in the accept connection above, and unlikly to collide with
index 73dbec01200832db3d17f10df9fe2710c19c39ff..d150161e059cdb6baa2c41deb3a8454f856d6a82 100644 (file)
@@ -40,6 +40,9 @@
 #include "param/param.h"
 #include "dsdb/samdb/samdb.h"
 #include "auth/session.h"
+#include "lib/messaging/irpc.h"
+#include "librpc/gen_ndr/ndr_irpc.h"
+#include "cluster/cluster.h"
 
 /*
   recursively delete a directory tree
@@ -192,6 +195,43 @@ static void prime_samdb_schema(struct tevent_context *event_ctx)
        talloc_free(samdb_context);
 }
 
+
+/*
+  called when a fatal condition occurs in a child task
+ */
+static NTSTATUS samba_terminate(struct irpc_message *msg, 
+                               struct samba_terminate *r)
+{
+       DEBUG(0,("samba_terminate: %s\n", r->in.reason));
+       exit(1);
+}
+
+/*
+  setup messaging for the top level samba (parent) task
+ */
+static NTSTATUS setup_parent_messaging(struct tevent_context *event_ctx, 
+                                      struct loadparm_context *lp_ctx)
+{
+       struct messaging_context *msg;
+       NTSTATUS status;
+
+       msg = messaging_init(talloc_autofree_context(), 
+                            lp_messaging_path(event_ctx, lp_ctx),
+                            cluster_id(0, SAMBA_PARENT_TASKID),
+                            lp_iconv_convenience(lp_ctx),
+                            event_ctx);
+       NT_STATUS_HAVE_NO_MEMORY(msg);
+
+       irpc_add_name(msg, "samba");
+
+       status = IRPC_REGISTER(msg, irpc, SAMBA_TERMINATE,
+                              samba_terminate, NULL);
+
+       return status;
+}
+
+
+
 /*
  main server.
 */
@@ -363,6 +403,12 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
 
        prime_samdb_schema(event_ctx);
 
+       status = setup_parent_messaging(event_ctx, cmdline_lp_ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("Failed to setup parent messaging - %s\n", nt_errstr(status)));
+               return 1;
+       }
+
        DEBUG(0,("%s: using '%s' process model\n", binary_name, model));
        status = server_service_startup(event_ctx, cmdline_lp_ctx, model, 
                                        lp_server_services(cmdline_lp_ctx));
index 940edf2cb5c4b921461e35f4a072d94fe0d734bb..96d572e8131eae8774cfb8ed8422a5bd876d4abd 100644 (file)
@@ -477,6 +477,8 @@ NTSTATUS stream_setup_named_pipe(struct tevent_context *event_context,
 
        if (!directory_create_or_exist(dirname, geteuid(), 0700)) {
                status = map_nt_error_from_unix(errno);
+               DEBUG(0,(__location__ ": Failed to create stream pipe directory %s - %s\n",
+                        dirname, nt_errstr(status)));
                goto fail;
        }
 
index c4fd3d4e982c51145d79d770c2087112fef5184c..5db899576450ac051822ea441ddd27d281ee39b1 100644 (file)
 #include "smbd/service_task.h"
 #include "lib/messaging/irpc.h"
 #include "param/param.h"
+#include "librpc/gen_ndr/ndr_irpc.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) {
+               struct samba_terminate r;
+               struct server_id *sid;
+
+               sid = irpc_servers_byname(task->msg_ctx, task, "samba");
+
+               r.in.reason = reason;
+               IRPC_CALL(task->msg_ctx, sid[0],
+                         irpc, SAMBA_TERMINATE,
+                         &r, NULL);
+       }
+
        model_ops->terminate(event_ctx, task->lp_ctx, reason);
        
        /* don't free this above, it might contain the 'reason' being printed */
@@ -72,7 +86,7 @@ static void task_server_callback(struct tevent_context *event_ctx,
                                       lp_iconv_convenience(task->lp_ctx),
                                       task->event_ctx);
        if (!task->msg_ctx) {
-               task_server_terminate(task, "messaging_init() failed");
+               task_server_terminate(task, "messaging_init() failed", true);
                return;
        }
 
index 2a2bfbb13b46ed72b33521ee83d07a9e31096b59..af11def5a5519014f5e9b1961d3cdc62c055b1ba 100644 (file)
@@ -353,7 +353,7 @@ static void websrv_task_init(struct task_server *task)
        return;
 
 failed:
-       task_server_terminate(task, "websrv_task_init: failed to startup web server task");
+       task_server_terminate(task, "websrv_task_init: failed to startup web server task", true);
 }
 
 
index 95be49d1e3f06e475e469f2d8d5357332f3abf96..d3142ff52a5880843e052594002c56dc6ae41fd1 100644 (file)
@@ -125,21 +125,21 @@ static void winbind_task_init(struct task_server *task)
        model_ops = process_model_startup(task->event_ctx, "single");
        if (!model_ops) {
                task_server_terminate(task,
-                                     "Can't find 'single' process model_ops");
+                                     "Can't find 'single' process model_ops", true);
                return;
        }
 
        /* Make sure the directory for the Samba3 socket exists, and is of the correct permissions */
        if (!directory_create_or_exist(lp_winbindd_socket_directory(task->lp_ctx), geteuid(), 0755)) {
                task_server_terminate(task,
-                                     "Cannot create winbindd pipe directory");
+                                     "Cannot create winbindd pipe directory", true);
                return;
        }
 
        /* Make sure the directory for the Samba3 socket exists, and is of the correct permissions */
        if (!directory_create_or_exist(lp_winbindd_privileged_socket_directory(task->lp_ctx), geteuid(), 0750)) {
                task_server_terminate(task,
-                                     "Cannot create winbindd privileged pipe directory");
+                                     "Cannot create winbindd privileged pipe directory", true);
                return;
        }
 
@@ -149,13 +149,13 @@ static void winbind_task_init(struct task_server *task)
 
        status = wbsrv_setup_domains(service);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, nt_errstr(status));
+               task_server_terminate(task, nt_errstr(status), true);
                return;
        }
 
        service->idmap_ctx = idmap_init(service, task->event_ctx, task->lp_ctx);
        if (service->idmap_ctx == NULL) {
-               task_server_terminate(task, "Failed to load idmap database");
+               task_server_terminate(task, "Failed to load idmap database", true);
                return;
        }
 
@@ -202,15 +202,15 @@ static void winbind_task_init(struct task_server *task)
 listen_failed:
        DEBUG(0,("stream_setup_socket(path=%s) failed - %s\n",
                 listen_socket->socket_path, nt_errstr(status)));
-       task_server_terminate(task, nt_errstr(status));
+       task_server_terminate(task, nt_errstr(status), true);
        return;
 irpc_failed:
        DEBUG(0,("wbsrv_init_irpc() failed - %s\n",
                 nt_errstr(status)));
-       task_server_terminate(task, nt_errstr(status));
+       task_server_terminate(task, nt_errstr(status), true);
        return;
 nomem:
-       task_server_terminate(task, nt_errstr(NT_STATUS_NO_MEMORY));
+       task_server_terminate(task, nt_errstr(NT_STATUS_NO_MEMORY), true);
        return;
 }
 
index 4771544428e319f10bdb57872c9bef65ebdbfceb..94391273ca978e7bb85fc5a32e6e752975781ae4 100644 (file)
@@ -55,7 +55,7 @@ static void wreplsrv_periodic_handler_te(struct tevent_context *ev, struct teven
 
        status = wreplsrv_periodic_schedule(service, service->config.periodic_interval);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(service->task, nt_errstr(status));
+               task_server_terminate(service->task, nt_errstr(status), false);
                return;
        }
 
index c8316a5f4c4c17a0a30d530d9bec021ee6a06f03..a33a3d685e59fef9e8fc144678041dbe4c775141 100644 (file)
@@ -459,7 +459,7 @@ static void wreplsrv_task_init(struct task_server *task)
 
        service = talloc_zero(task, struct wreplsrv_service);
        if (!service) {
-               task_server_terminate(task, "wreplsrv_task_init: out of memory");
+               task_server_terminate(task, "wreplsrv_task_init: out of memory", true);
                return;
        }
        service->task           = task;
@@ -471,7 +471,7 @@ static void wreplsrv_task_init(struct task_server *task)
         */
        status = wreplsrv_open_winsdb(service, task->lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed", true);
                return;
        }
 
@@ -480,7 +480,7 @@ static void wreplsrv_task_init(struct task_server *task)
         */
        status = wreplsrv_setup_partners(service);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_partners() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_partners() failed", true);
                return;
        }
 
@@ -490,13 +490,13 @@ static void wreplsrv_task_init(struct task_server *task)
         */
        status = wreplsrv_setup_sockets(service, task->lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_sockets() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_sockets() failed", true);
                return;
        }
 
        status = wreplsrv_setup_periodic(service);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_periodic() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_periodic() failed", true);
                return;
        }