s3-rpc_server: Replace RPC_SERVICE_MODE_DAEMON checks
[idra/samba.git] / source3 / rpc_server / rpc_service_setup.c
index 86a5a7a378fd6946f7019911a2f8765de69e09c1..29d7bf238a2b84c5f1806bd6218d1376e252b7c2 100644 (file)
 #include "rpc_server/rpc_service_setup.h"
 #include "rpc_server/rpc_ep_register.h"
 #include "rpc_server/rpc_server.h"
+#include "rpc_server/rpc_config.h"
 #include "rpc_server/epmapper/srv_epmapper.h"
 
-enum rpc_service_mode_e rpc_epmapper_mode(void)
-{
-       const char *rpcsrv_type;
-       enum rpc_service_mode_e state;
-
-       rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
-                                          "rpc_server",
-                                          "epmapper",
-                                          "daemon");
-
-       if (strcasecmp_m(rpcsrv_type, "external") == 0) {
-               state = RPC_SERVICE_MODE_EXTERNAL;
-       } else if (strcasecmp_m(rpcsrv_type, "daemon") == 0) {
-               state = RPC_SERVICE_MODE_DAEMON;
-       } else {
-               state = RPC_SERVICE_MODE_DISABLED;
-       }
-
-       return state;
-}
-
-enum rpc_service_mode_e rpc_spoolss_mode(void)
-{
-       const char *rpcsrv_type;
-       enum rpc_service_mode_e state;
-
-       rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
-                                          "rpc_server",
-                                          "spoolss",
-                                          "embedded");
-
-       if (strcasecmp_m(rpcsrv_type, "embedded") == 0) {
-               state = RPC_SERVICE_MODE_EMBEDDED;
-       } else if (strcasecmp_m(rpcsrv_type, "external") == 0) {
-               state = RPC_SERVICE_MODE_EXTERNAL;
-       } else if (strcasecmp_m(rpcsrv_type, "daemon") == 0) {
-               state = RPC_SERVICE_MODE_DAEMON;
-       } else {
-               state = RPC_SERVICE_MODE_DISABLED;
-       }
-
-       return state;
-}
-
 static bool rpc_setup_epmapper(struct tevent_context *ev_ctx,
                               struct messaging_context *msg_ctx)
 {
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_daemon_type_e epm_type = rpc_epmapper_daemon();
        NTSTATUS status;
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (epm_mode != RPC_SERVICE_MODE_DISABLED &&
+           epm_type != RPC_DAEMON_DISABLED) {
                status = rpc_epmapper_init(NULL);
                if (!NT_STATUS_IS_OK(status)) {
                        return false;
@@ -234,6 +193,8 @@ static bool rpc_setup_lsarpc(struct tevent_context *ev_ctx,
        const char *pipe_name = "lsarpc";
        struct dcerpc_binding_vector *v2;
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_service_mode_e lsarpc_mode = rpc_lsarpc_mode();
+       enum rpc_daemon_type_e lsasd_type = rpc_lsasd_daemon();
        NTSTATUS status;
        bool ok;
 
@@ -242,7 +203,9 @@ static bool rpc_setup_lsarpc(struct tevent_context *ev_ctx,
                return false;
        }
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (lsarpc_mode == RPC_SERVICE_MODE_EMBEDDED &&
+           lsasd_type != RPC_DAEMON_DISABLED &&
+           epm_mode != RPC_SERVICE_MODE_DISABLED) {
                v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
                if (v2 == NULL) {
                        return false;
@@ -291,6 +254,8 @@ static bool rpc_setup_samr(struct tevent_context *ev_ctx,
        const char *pipe_name = "samr";
        struct dcerpc_binding_vector *v2;
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_service_mode_e samr_mode = rpc_samr_mode();
+       enum rpc_daemon_type_e lsasd_type = rpc_lsasd_daemon();
        NTSTATUS status;
        bool ok;
 
@@ -299,7 +264,9 @@ static bool rpc_setup_samr(struct tevent_context *ev_ctx,
                return false;
        }
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (samr_mode == RPC_SERVICE_MODE_EMBEDDED &&
+           lsasd_type != RPC_DAEMON_DISABLED &&
+           epm_mode != RPC_SERVICE_MODE_DISABLED) {
                v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
                if (v2 == NULL) {
                        return false;
@@ -348,6 +315,8 @@ static bool rpc_setup_netlogon(struct tevent_context *ev_ctx,
        const char *pipe_name = "netlogon";
        struct dcerpc_binding_vector *v2;
        enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
+       enum rpc_service_mode_e netlogon_mode = rpc_netlogon_mode();
+       enum rpc_daemon_type_e lsasd_type = rpc_lsasd_daemon();
        NTSTATUS status;
        bool ok;
 
@@ -356,7 +325,9 @@ static bool rpc_setup_netlogon(struct tevent_context *ev_ctx,
                return false;
        }
 
-       if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
+       if (netlogon_mode == RPC_SERVICE_MODE_EMBEDDED &&
+           lsasd_type != RPC_DAEMON_DISABLED &&
+           epm_mode != RPC_SERVICE_MODE_DISABLED) {
                v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
                if (v2 == NULL) {
                        return false;
@@ -658,28 +629,29 @@ static bool rpc_setup_spoolss(struct tevent_context *ev_ctx,
        struct rpc_srv_callbacks spoolss_cb;
        struct dcerpc_binding_vector *v;
        enum rpc_service_mode_e spoolss_mode = rpc_spoolss_mode();
-       NTSTATUS status;
+       enum rpc_daemon_type_e spoolss_type = rpc_spoolss_daemon();
+       NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
 
        if (_lp_disable_spoolss() ||
+           spoolss_type == RPC_DAEMON_DISABLED ||
            spoolss_mode == RPC_SERVICE_MODE_DISABLED) {
                return true;
        }
 
-       if (spoolss_mode == RPC_SERVICE_MODE_EMBEDDED) {
+       if (spoolss_type == RPC_DAEMON_EMBEDDED) {
                spoolss_cb.init         = spoolss_init_cb;
                spoolss_cb.shutdown     = spoolss_shutdown_cb;
                spoolss_cb.private_data = msg_ctx;
 
                status = rpc_spoolss_init(&spoolss_cb);
-       } else if (spoolss_mode == RPC_SERVICE_MODE_EXTERNAL ||
-                  spoolss_mode == RPC_SERVICE_MODE_DAEMON) {
+       } else if (spoolss_type == RPC_DAEMON_FORK) {
                status = rpc_spoolss_init(NULL);
        }
        if (!NT_STATUS_IS_OK(status)) {
                return false;
        }
 
-       if (spoolss_mode == RPC_SERVICE_MODE_EMBEDDED) {
+       if (spoolss_type == RPC_DAEMON_EMBEDDED) {
                enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
 
                if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
@@ -916,6 +888,7 @@ static bool rpc_setup_initshutdown(struct tevent_context *ev_ctx,
 bool dcesrv_ep_setup(struct tevent_context *ev_ctx,
                     struct messaging_context *msg_ctx)
 {
+       enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
        struct dcerpc_binding_vector *v;
        const char *rpcsrv_type;
        TALLOC_CTX *tmp_ctx;
@@ -944,8 +917,9 @@ bool dcesrv_ep_setup(struct tevent_context *ev_ctx,
                                           "tcpip",
                                           "no");
 
-       if (strcasecmp_m(rpcsrv_type, "yes") == 0 ||
-           strcasecmp_m(rpcsrv_type, "true") == 0) {
+       if ((strcasecmp_m(rpcsrv_type, "yes") == 0 ||
+            strcasecmp_m(rpcsrv_type, "true") == 0)
+           && epm_mode != RPC_SERVICE_MODE_DISABLED) {
                status = rpc_setup_tcpip_sockets(ev_ctx,
                                                 msg_ctx,
                                                 &ndr_table_winreg,