LCOV - code coverage report
Current view: top level - source3/rpc_server - rpc_service_setup.c (source / functions) Hit Total Coverage
Test: coverage report for abartlet/fix-coverage dd10fb34 Lines: 289 428 67.5 %
Date: 2021-09-23 10:06:22 Functions: 34 34 100.0 %

          Line data    Source code
       1             : /*
       2             :  *  Unix SMB/CIFS implementation.
       3             :  *
       4             :  *  SMBD RPC service callbacks
       5             :  *
       6             :  *  Copyright (c) 2011      Andreas Schneider <asn@samba.org>
       7             :  *
       8             :  *  This program is free software; you can redistribute it and/or modify
       9             :  *  it under the terms of the GNU General Public License as published by
      10             :  *  the Free Software Foundation; either version 3 of the License, or
      11             :  *  (at your option) any later version.
      12             :  *
      13             :  *  This program is distributed in the hope that it will be useful,
      14             :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16             :  *  GNU General Public License for more details.
      17             :  *
      18             :  *  You should have received a copy of the GNU General Public License
      19             :  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
      20             :  */
      21             : 
      22             : #include "includes.h"
      23             : #include "ntdomain.h"
      24             : 
      25             : #include "librpc/gen_ndr/ndr_winreg_scompat.h"
      26             : #include "librpc/gen_ndr/ndr_srvsvc_scompat.h"
      27             : #include "librpc/gen_ndr/ndr_lsa_scompat.h"
      28             : #include "librpc/gen_ndr/ndr_samr_scompat.h"
      29             : #include "librpc/gen_ndr/ndr_netlogon_scompat.h"
      30             : #include "librpc/gen_ndr/ndr_dfs_scompat.h"
      31             : #include "librpc/gen_ndr/ndr_echo_scompat.h"
      32             : #include "librpc/gen_ndr/ndr_dssetup_scompat.h"
      33             : #include "librpc/gen_ndr/ndr_wkssvc_scompat.h"
      34             : #include "librpc/gen_ndr/ndr_spoolss_scompat.h"
      35             : #include "librpc/gen_ndr/ndr_svcctl_scompat.h"
      36             : #include "librpc/gen_ndr/ndr_ntsvcs_scompat.h"
      37             : #include "librpc/gen_ndr/ndr_eventlog_scompat.h"
      38             : #include "librpc/gen_ndr/ndr_initshutdown_scompat.h"
      39             : 
      40             : #include "printing/nt_printing_migrate_internal.h"
      41             : #include "rpc_server/eventlog/srv_eventlog_reg.h"
      42             : #include "rpc_server/svcctl/srv_svcctl_reg.h"
      43             : #include "rpc_server/spoolss/srv_spoolss_nt.h"
      44             : #include "rpc_server/svcctl/srv_svcctl_nt.h"
      45             : 
      46             : #include "lib/server_prefork.h"
      47             : #include "librpc/rpc/dcesrv_core.h"
      48             : #include "librpc/rpc/dcerpc_ep.h"
      49             : #include "rpc_server/rpc_sock_helper.h"
      50             : #include "rpc_server/rpc_service_setup.h"
      51             : #include "rpc_server/rpc_ep_register.h"
      52             : #include "rpc_server/rpc_server.h"
      53             : #include "rpc_server/rpc_config.h"
      54             : #include "rpc_server/rpc_modules.h"
      55             : #include "rpc_server/epmapper/srv_epmapper.h"
      56             : 
      57             : #undef DBGC_CLASS
      58             : #define DBGC_CLASS DBGC_RPC_SRV
      59             : 
      60             : static_decl_rpc;
      61             : 
      62             : /* Common routine for embedded RPC servers */
      63        1330 : NTSTATUS rpc_setup_embedded(struct tevent_context *ev_ctx,
      64             :                             struct messaging_context *msg_ctx,
      65             :                             struct dcesrv_context *dce_ctx,
      66             :                             const struct dcesrv_interface *iface)
      67             : {
      68        1330 :         enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
      69             :         NTSTATUS status;
      70             : 
      71             :         /* Registration of ncacn_np services is problematic.  The
      72             :          * ev_ctx passed in here is passed down to all children of the
      73             :          * smbd process, and if the end point mapper ever goes away,
      74             :          * they will all attempt to re-register.  But we want to test
      75             :          * the code for now, so it is enabled in on environment in
      76             :          * make test */
      77        2014 :         if (epm_mode != RPC_SERVICE_MODE_DISABLED &&
      78         684 :             (lp_parm_bool(-1, "rpc_server", "register_embedded_np", false))) {
      79         236 :                 status = rpc_ep_register(ev_ctx, msg_ctx, dce_ctx, iface);
      80         236 :                 if (!NT_STATUS_IS_OK(status)) {
      81           0 :                         return status;
      82             :                 }
      83             :         }
      84             : 
      85        1330 :         return NT_STATUS_OK;
      86             : }
      87             : 
      88         103 : NTSTATUS dcesrv_create_endpoint_sockets(struct tevent_context *ev_ctx,
      89             :                                         struct messaging_context *msg_ctx,
      90             :                                         struct dcesrv_endpoint *e,
      91             :                                         TALLOC_CTX *mem_ctx,
      92             :                                         size_t *pnum_fds,
      93             :                                         int **pfds)
      94             : {
      95         103 :         struct dcerpc_binding *b = e->ep_description;
      96         103 :         char *binding = NULL;
      97         103 :         int *fds = NULL;
      98             :         size_t num_fds;
      99             :         NTSTATUS status;
     100             : 
     101         103 :         binding = dcerpc_binding_string(mem_ctx, b);
     102         103 :         if (binding == NULL) {
     103           0 :                 return NT_STATUS_NO_MEMORY;
     104             :         }
     105         103 :         DBG_DEBUG("Creating endpoint '%s'\n", binding);
     106         103 :         TALLOC_FREE(binding);
     107             : 
     108         103 :         status = dcesrv_create_binding_sockets(b, mem_ctx, &num_fds, &fds);
     109             : 
     110             :         /* Build binding string again as the endpoint may have changed by
     111             :          * dcesrv_create_<transport>_socket functions */
     112         103 :         binding = dcerpc_binding_string(mem_ctx, b);
     113         103 :         if (binding == NULL) {
     114           0 :                 return NT_STATUS_NO_MEMORY;
     115             :         }
     116             : 
     117         103 :         if (!NT_STATUS_IS_OK(status)) {
     118           0 :                 struct dcesrv_if_list *iface = NULL;
     119           0 :                 DBG_ERR("Failed to create '%s' sockets for ", binding);
     120           0 :                 for (iface = e->interface_list; iface; iface = iface->next) {
     121           0 :                         DEBUGADD(DBGLVL_ERR, ("'%s' ", iface->iface->name));
     122             :                 }
     123           0 :                 DEBUGADD(DBGLVL_ERR, (": %s\n", nt_errstr(status)));
     124           0 :                 return status;
     125             :         } else {
     126         103 :                 struct dcesrv_if_list *iface = NULL;
     127         103 :                 DBG_INFO("Successfully listening on '%s' for ", binding);
     128         334 :                 for (iface = e->interface_list; iface; iface = iface->next) {
     129         231 :                         DEBUGADD(DBGLVL_INFO, ("'%s' ", iface->iface->name));
     130             :                 }
     131         103 :                 DEBUGADD(DBGLVL_INFO, ("\n"));
     132             :         }
     133             : 
     134         103 :         TALLOC_FREE(binding);
     135             : 
     136         103 :         *pnum_fds = num_fds;
     137         103 :         *pfds = fds;
     138             : 
     139         103 :         return status;
     140             : }
     141             : 
     142          17 : NTSTATUS dcesrv_create_endpoint_list_pf_listen_fds(
     143             :         struct tevent_context *ev_ctx,
     144             :         struct messaging_context *msg_ctx,
     145             :         struct dcesrv_context *dce_ctx,
     146             :         struct dcesrv_endpoint *e,
     147             :         TALLOC_CTX *mem_ctx,
     148             :         size_t *pnum_fds,
     149             :         struct pf_listen_fd **pfds)
     150             : {
     151          17 :         struct pf_listen_fd *fds = NULL;
     152          17 :         size_t num_fds = 0;
     153             :         NTSTATUS status;
     154             : 
     155         240 :         for (; e != NULL; e = e->next) {
     156         103 :                 int *ep_fds = NULL;
     157         103 :                 struct pf_listen_fd *tmp = NULL;
     158             :                 size_t i, num_ep_fds;
     159             : 
     160         103 :                 status = dcesrv_create_endpoint_sockets(
     161             :                         ev_ctx,
     162             :                         msg_ctx,
     163             :                         e,
     164             :                         mem_ctx,
     165             :                         &num_ep_fds,
     166             :                         &ep_fds);
     167         103 :                 if (!NT_STATUS_IS_OK(status)) {
     168           0 :                         char *ep_string = dcerpc_binding_string(
     169           0 :                                         dce_ctx, e->ep_description);
     170           0 :                         DBG_ERR("Failed to create endpoint '%s': %s\n",
     171             :                                 ep_string, nt_errstr(status));
     172           0 :                         TALLOC_FREE(ep_string);
     173           0 :                         goto fail;
     174             :                 }
     175             : 
     176         103 :                 if (num_fds + num_ep_fds < num_fds) {
     177             :                         /* overflow */
     178           0 :                         status = NT_STATUS_INTEGER_OVERFLOW;
     179           0 :                         goto fail;
     180             :                 }
     181             : 
     182         103 :                 tmp = talloc_realloc(
     183             :                         mem_ctx,
     184             :                         fds,
     185             :                         struct pf_listen_fd,
     186             :                         num_fds + num_ep_fds);
     187         103 :                 if (tmp == NULL) {
     188           0 :                         status = NT_STATUS_NO_MEMORY;
     189           0 :                         goto fail;
     190             :                 }
     191         103 :                 fds = tmp;
     192             : 
     193         215 :                 for (i=0; i<num_ep_fds; i++) {
     194         112 :                         fds[num_fds].fd = ep_fds[i];
     195         112 :                         fds[num_fds].fd_data = e;
     196         112 :                         num_fds += 1;
     197             :                 }
     198             : 
     199         103 :                 TALLOC_FREE(ep_fds);
     200             :         }
     201             : 
     202          17 :         *pnum_fds = num_fds;
     203          17 :         *pfds = fds;
     204          17 :         return NT_STATUS_OK;
     205             : 
     206           0 : fail:
     207             :         {
     208             :                 size_t i;
     209           0 :                 for (i=0; i<num_fds; i++) {
     210           0 :                         close(fds[i].fd);
     211             :                 }
     212             :         }
     213             : 
     214           0 :         TALLOC_FREE(fds);
     215           0 :         return status;
     216             : }
     217             : 
     218         708 : NTSTATUS dcesrv_setup_endpoint_sockets(struct tevent_context *ev_ctx,
     219             :                                        struct messaging_context *msg_ctx,
     220             :                                        struct dcesrv_context *dce_ctx,
     221             :                                        struct dcesrv_endpoint *e,
     222             :                                        dcerpc_ncacn_termination_fn term_fn,
     223             :                                        void *term_data)
     224             : {
     225         708 :         TALLOC_CTX *frame = talloc_stackframe();
     226         708 :         struct dcerpc_binding *b = e->ep_description;
     227         708 :         char *binding = NULL;
     228         708 :         NTSTATUS status = NT_STATUS_NO_MEMORY;
     229         708 :         struct dcesrv_if_list *iface = NULL;
     230         708 :         int *fds = NULL;
     231         708 :         size_t i, num_fds = 0;
     232         708 :         struct dcerpc_ncacn_listen_state **listen_states = NULL;
     233             : 
     234         708 :         binding = dcerpc_binding_string(frame, b);
     235         708 :         if (binding == NULL) {
     236           0 :                 goto fail;
     237             :         }
     238             : 
     239         708 :         DBG_DEBUG("Setting up endpoint '%s'\n", binding);
     240         708 :         TALLOC_FREE(binding);
     241             : 
     242         708 :         status = dcesrv_create_binding_sockets(b, frame, &num_fds, &fds);
     243             : 
     244             :         /* Build binding string again as the endpoint may have changed by
     245             :          * dcesrv_create_<transport>_socket functions */
     246         708 :         binding = dcerpc_binding_string(frame, b);
     247         708 :         if (binding == NULL) {
     248           0 :                 status = NT_STATUS_NO_MEMORY;
     249           0 :                 goto fail;
     250             :         }
     251             : 
     252         708 :         if (!NT_STATUS_IS_OK(status)) {
     253           0 :                 DBG_ERR("Failed to setup '%s' sockets for ", binding);
     254           0 :                 for (iface = e->interface_list; iface; iface = iface->next) {
     255           0 :                         DEBUGADD(DBGLVL_ERR, ("'%s' ", iface->iface->name));
     256             :                 }
     257           0 :                 DEBUGADD(DBGLVL_ERR, (": %s\n", nt_errstr(status)));
     258           0 :                 goto fail;
     259             :         }
     260             : 
     261         708 :         listen_states = talloc_array(
     262             :                 frame, struct dcerpc_ncacn_listen_state *, num_fds);
     263         708 :         if (listen_states == NULL) {
     264           0 :                 status = NT_STATUS_NO_MEMORY;
     265           0 :                 goto fail;
     266             :         }
     267             : 
     268        1400 :         for (i=0; i<num_fds; i++) {
     269        1416 :                 int ret = dcesrv_setup_ncacn_listener(
     270             :                         listen_states,
     271             :                         dce_ctx,
     272             :                         ev_ctx,
     273             :                         msg_ctx,
     274             :                         e,
     275         708 :                         &fds[i],
     276             :                         term_fn,
     277             :                         term_data,
     278         708 :                         &listen_states[i]);
     279         708 :                 if (ret != 0) {
     280           0 :                         DBG_ERR("dcesrv_setup_ncacn_listener failed for "
     281             :                                 "socket %d: %s\n",
     282             :                                 fds[i],
     283             :                                 strerror(ret));
     284           0 :                         break;
     285             :                 }
     286             :         }
     287             : 
     288         708 :         if (i < num_fds) {
     289           0 :                 goto fail;
     290             :         }
     291             : 
     292        1400 :         for (i=0; i<num_fds; i++) {
     293             :                 /*
     294             :                  * Make the listener states including the tevent_fd's
     295             :                  * talloc children of the endpoint. If the endpoint is
     296             :                  * freed (for example when forked daemons reinit) the
     297             :                  * dcesrv_context, the tevent_fd listener will be
     298             :                  * stopped and the socket closed.
     299             :                  *
     300             :                  * Do this in a loop separate from the one doing the
     301             :                  * dcesrv_setup_ncacn_listener() that can't fail
     302             :                  * anymore.
     303             :                  */
     304         708 :                 talloc_move(e, &listen_states[i]);
     305             :         }
     306             : 
     307         708 :         DBG_INFO("Successfully listening on '%s' for ", binding);
     308        2512 :         for (iface = e->interface_list; iface; iface = iface->next) {
     309        1804 :                 DEBUGADD(DBGLVL_INFO, ("'%s' ", iface->iface->name));
     310             :         }
     311         708 :         DEBUGADD(DBGLVL_INFO, ("\n"));
     312             : 
     313         708 :         TALLOC_FREE(frame);
     314         708 :         return NT_STATUS_OK;
     315             : 
     316           0 : fail:
     317           0 :         for (i=0; i<num_fds; i++) {
     318           0 :                 if (fds[i] != -1) {
     319           0 :                         close(fds[i]);
     320             :                 }
     321             :         }
     322           0 :         TALLOC_FREE(frame);
     323           0 :         return status;
     324             : }
     325             : 
     326          60 : static NTSTATUS dcesrv_init_endpoints(struct tevent_context *ev_ctx,
     327             :                                       struct messaging_context *msg_ctx,
     328             :                                       struct dcesrv_context *dce_ctx)
     329             : {
     330          60 :         struct dcesrv_endpoint *e = NULL;
     331             :         NTSTATUS status;
     332             : 
     333         766 :         for (e = dce_ctx->endpoint_list; e; e = e->next) {
     334         706 :                 enum dcerpc_transport_t transport =
     335         706 :                         dcerpc_binding_get_transport(e->ep_description);
     336             : 
     337         706 :                 if (transport == NCACN_HTTP) {
     338             :                         /*
     339             :                          * We don't support ncacn_http yet
     340             :                          */
     341           0 :                         continue;
     342             :                 }
     343             : 
     344         706 :                 status = dcesrv_setup_endpoint_sockets(ev_ctx,
     345             :                                                        msg_ctx,
     346             :                                                        dce_ctx,
     347             :                                                        e,
     348             :                                                        NULL,
     349             :                                                        NULL);
     350         706 :                 if (!NT_STATUS_IS_OK(status)) {
     351           0 :                         return status;
     352             :                 }
     353             : 
     354             :                 /* Register only NCACN_NP for embedded services */
     355         706 :                 if (transport == NCACN_NP) {
     356         646 :                         struct dcesrv_if_list *ifl = NULL;
     357        1976 :                         for (ifl = e->interface_list; ifl; ifl = ifl->next) {
     358        1330 :                                 status = rpc_setup_embedded(ev_ctx,
     359             :                                                             msg_ctx,
     360             :                                                             dce_ctx,
     361        1330 :                                                             ifl->iface);
     362        1330 :                                 if (!NT_STATUS_IS_OK(status)) {
     363           0 :                                         DBG_ERR("Failed to register embedded "
     364             :                                                 "interface in endpoint mapper "
     365             :                                                 ": %s", nt_errstr(status));
     366           0 :                                         return status;
     367             :                                 }
     368             :                         }
     369             :                 }
     370             :         }
     371             : 
     372          60 :         return NT_STATUS_OK;
     373             : }
     374             : 
     375          60 : static NTSTATUS rpc_setup_winreg(struct tevent_context *ev_ctx,
     376             :                                  struct messaging_context *msg_ctx)
     377             : {
     378             :         NTSTATUS status;
     379             :         enum rpc_service_mode_e service_mode;
     380          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     381             : 
     382             :         /* Register the endpoint server in DCERPC core */
     383          60 :         ep_server = winreg_get_ep_server();
     384          60 :         if (ep_server == NULL) {
     385           0 :                 DBG_ERR("Failed to get 'winreg' endpoint server\n");
     386           0 :                 return NT_STATUS_UNSUCCESSFUL;
     387             :         }
     388             : 
     389          60 :         service_mode = rpc_service_mode(ep_server->name);
     390          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     391           0 :                 return NT_STATUS_OK;
     392             :         }
     393             : 
     394          60 :         status = dcerpc_register_ep_server(ep_server);
     395          60 :         if (!NT_STATUS_IS_OK(status)) {
     396           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     397             :                         "%s\n", ep_server->name, nt_errstr(status));
     398           0 :                 return status;
     399             :         }
     400             : 
     401          60 :         return NT_STATUS_OK;
     402             : }
     403             : 
     404          60 : static NTSTATUS rpc_setup_srvsvc(struct tevent_context *ev_ctx,
     405             :                                  struct messaging_context *msg_ctx)
     406             : {
     407             :         NTSTATUS status;
     408             :         enum rpc_service_mode_e service_mode;
     409          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     410             : 
     411             :         /* Register the endpoint server in DCERPC core */
     412          60 :         ep_server = srvsvc_get_ep_server();
     413          60 :         if (ep_server == NULL) {
     414           0 :                 DBG_ERR("Failed to get 'srvsvc' endpoint server\n");
     415           0 :                 return NT_STATUS_UNSUCCESSFUL;
     416             :         }
     417             : 
     418          60 :         service_mode = rpc_service_mode(ep_server->name);
     419          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     420           0 :                 return NT_STATUS_OK;
     421             :         }
     422             : 
     423          60 :         status = dcerpc_register_ep_server(ep_server);
     424          60 :         if (!NT_STATUS_IS_OK(status)) {
     425           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     426             :                         "%s\n", ep_server->name, nt_errstr(status));
     427           0 :                 return status;
     428             :         }
     429             : 
     430          60 :         return NT_STATUS_OK;
     431             : }
     432             : 
     433          60 : static NTSTATUS rpc_setup_lsarpc(struct tevent_context *ev_ctx,
     434             :                                  struct messaging_context *msg_ctx)
     435             : {
     436          60 :         enum rpc_daemon_type_e lsasd_type = rpc_lsasd_daemon();
     437             :         NTSTATUS status;
     438             :         enum rpc_service_mode_e service_mode;
     439          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     440             : 
     441             :         /* Register the endpoint server in DCERPC core */
     442          60 :         ep_server = lsarpc_get_ep_server();
     443          60 :         if (ep_server == NULL) {
     444           0 :                 DBG_ERR("Failed to get 'lsarpc' endpoint server\n");
     445           0 :                 return NT_STATUS_UNSUCCESSFUL;
     446             :         }
     447             : 
     448          60 :         service_mode = rpc_service_mode(ep_server->name);
     449          62 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED ||
     450           2 :             lsasd_type != RPC_DAEMON_EMBEDDED) {
     451          41 :                 return NT_STATUS_OK;
     452             :         }
     453             : 
     454          19 :         status = dcerpc_register_ep_server(ep_server);
     455          19 :         if (!NT_STATUS_IS_OK(status)) {
     456           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     457             :                         "%s\n", ep_server->name, nt_errstr(status));
     458           0 :                 return status;
     459             :         }
     460             : 
     461          19 :         return NT_STATUS_OK;
     462             : }
     463             : 
     464          60 : static NTSTATUS rpc_setup_samr(struct tevent_context *ev_ctx,
     465             :                                struct messaging_context *msg_ctx)
     466             : {
     467          60 :         enum rpc_daemon_type_e lsasd_type = rpc_lsasd_daemon();
     468             :         NTSTATUS status;
     469             :         enum rpc_service_mode_e service_mode;
     470          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     471             : 
     472             :         /* Register the endpoint server in DCERPC core */
     473          60 :         ep_server = samr_get_ep_server();
     474          60 :         if (ep_server == NULL) {
     475           0 :                 DBG_ERR("Failed to get 'samr' endpoint server\n");
     476           0 :                 return NT_STATUS_UNSUCCESSFUL;
     477             :         }
     478             : 
     479          60 :         service_mode = rpc_service_mode(ep_server->name);
     480          62 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED ||
     481           2 :             lsasd_type != RPC_DAEMON_EMBEDDED) {
     482          41 :                 return NT_STATUS_OK;
     483             :         }
     484             : 
     485          19 :         status = dcerpc_register_ep_server(ep_server);
     486          19 :         if (!NT_STATUS_IS_OK(status)) {
     487           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     488             :                         "%s\n", ep_server->name, nt_errstr(status));
     489           0 :                 return status;
     490             :         }
     491             : 
     492          19 :         return NT_STATUS_OK;
     493             : }
     494             : 
     495          60 : static NTSTATUS rpc_setup_netlogon(struct tevent_context *ev_ctx,
     496             :                                    struct messaging_context *msg_ctx)
     497             : {
     498          60 :         enum rpc_daemon_type_e lsasd_type = rpc_lsasd_daemon();
     499             :         NTSTATUS status;
     500             :         enum rpc_service_mode_e service_mode;
     501          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     502             : 
     503             :         /* Register the endpoint server in DCERPC core */
     504          60 :         ep_server = netlogon_get_ep_server();
     505          60 :         if (ep_server == NULL) {
     506           0 :                 DBG_ERR("Failed to get 'netlogon' endpoint server\n");
     507           0 :                 return NT_STATUS_UNSUCCESSFUL;
     508             :         }
     509             : 
     510          60 :         service_mode = rpc_service_mode(ep_server->name);
     511          62 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED ||
     512           2 :             lsasd_type != RPC_DAEMON_EMBEDDED) {
     513          60 :                 return NT_STATUS_OK;
     514             :         }
     515             : 
     516           0 :         status = dcerpc_register_ep_server(ep_server);
     517           0 :         if (!NT_STATUS_IS_OK(status)) {
     518           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     519             :                         "%s\n", ep_server->name, nt_errstr(status));
     520           0 :                 return status;
     521             :         }
     522             : 
     523           0 :         return NT_STATUS_OK;
     524             : }
     525             : 
     526          60 : static NTSTATUS rpc_setup_netdfs(struct tevent_context *ev_ctx,
     527             :                                  struct messaging_context *msg_ctx)
     528             : {
     529             :         NTSTATUS status;
     530             :         enum rpc_service_mode_e service_mode;
     531          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     532             : 
     533             :         /* Register the endpoint server in DCERPC core */
     534          60 :         ep_server = netdfs_get_ep_server();
     535          60 :         if (ep_server == NULL) {
     536           0 :                 DBG_ERR("Failed to get 'netdfs' endpoint server\n");
     537           0 :                 return NT_STATUS_UNSUCCESSFUL;
     538             :         }
     539             : 
     540          60 :         service_mode = rpc_service_mode(ep_server->name);
     541          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     542          32 :                 return NT_STATUS_OK;
     543             :         }
     544             : 
     545          28 :         status = dcerpc_register_ep_server(ep_server);
     546          28 :         if (!NT_STATUS_IS_OK(status)) {
     547           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     548             :                         "%s\n", ep_server->name, nt_errstr(status));
     549           0 :                 return status;
     550             :         }
     551             : 
     552          28 :         return NT_STATUS_OK;
     553             : }
     554             : 
     555             : #ifdef DEVELOPER
     556          60 : static NTSTATUS rpc_setup_rpcecho(struct tevent_context *ev_ctx,
     557             :                                   struct messaging_context *msg_ctx)
     558             : {
     559             :         NTSTATUS status;
     560             :         enum rpc_service_mode_e service_mode;
     561          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     562             : 
     563             :         /* Register the endpoint server in DCERPC core */
     564          60 :         ep_server = rpcecho_get_ep_server();
     565          60 :         if (ep_server == NULL) {
     566           0 :                 DBG_ERR("Failed to get 'rpcecho' endpoint server\n");
     567           0 :                 return NT_STATUS_UNSUCCESSFUL;
     568             :         }
     569             : 
     570          60 :         service_mode = rpc_service_mode(ep_server->name);
     571          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     572          32 :                 return NT_STATUS_OK;
     573             :         }
     574             : 
     575          28 :         status = dcerpc_register_ep_server(ep_server);
     576          28 :         if (!NT_STATUS_IS_OK(status)) {
     577           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     578             :                         "%s\n", ep_server->name, nt_errstr(status));
     579           0 :                 return status;
     580             :         }
     581             : 
     582          28 :         return NT_STATUS_OK;
     583             : }
     584             : #endif
     585             : 
     586          60 : static NTSTATUS rpc_setup_dssetup(struct tevent_context *ev_ctx,
     587             :                                   struct messaging_context *msg_ctx)
     588             : {
     589             :         NTSTATUS status;
     590             :         enum rpc_service_mode_e service_mode;
     591          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     592             : 
     593             :         /* Register the endpoint server in DCERPC core */
     594          60 :         ep_server = dssetup_get_ep_server();
     595          60 :         if (ep_server == NULL) {
     596           0 :                 DBG_ERR("Failed to get 'dssetup' endpoint server\n");
     597           0 :                 return NT_STATUS_UNSUCCESSFUL;
     598             :         }
     599             : 
     600          60 :         service_mode = rpc_service_mode(ep_server->name);
     601          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     602          32 :                 return NT_STATUS_OK;
     603             :         }
     604             : 
     605          28 :         status = dcerpc_register_ep_server(ep_server);
     606          28 :         if (!NT_STATUS_IS_OK(status)) {
     607           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     608             :                         "%s\n", ep_server->name, nt_errstr(status));
     609           0 :                 return status;
     610             :         }
     611             : 
     612          28 :         return NT_STATUS_OK;
     613             : }
     614             : 
     615          60 : static NTSTATUS rpc_setup_wkssvc(struct tevent_context *ev_ctx,
     616             :                                  struct messaging_context *msg_ctx)
     617             : {
     618             :         NTSTATUS status;
     619             :         enum rpc_service_mode_e service_mode;
     620          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     621             : 
     622             :         /* Register the endpoint server in DCERPC core */
     623          60 :         ep_server = wkssvc_get_ep_server();
     624          60 :         if (ep_server == NULL) {
     625           0 :                 DBG_ERR("Failed to get 'wkssvc' endpoint server\n");
     626           0 :                 return NT_STATUS_UNSUCCESSFUL;
     627             :         }
     628             : 
     629          60 :         service_mode = rpc_service_mode(ep_server->name);
     630          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     631          32 :                 return NT_STATUS_OK;
     632             :         }
     633             : 
     634          28 :         status = dcerpc_register_ep_server(ep_server);
     635          28 :         if (!NT_STATUS_IS_OK(status)) {
     636           0 :                 DBG_ERR("Failed to register '%s' endpoint server: "
     637             :                         "%s\n", ep_server->name, nt_errstr(status));
     638           0 :                 return status;
     639             :         }
     640             : 
     641          28 :         return NT_STATUS_OK;
     642             : }
     643             : 
     644          60 : static NTSTATUS rpc_setup_spoolss(struct tevent_context *ev_ctx,
     645             :                                   struct messaging_context *msg_ctx)
     646             : {
     647          60 :         enum rpc_daemon_type_e spoolss_type = rpc_spoolss_daemon();
     648          60 :         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
     649             :         enum rpc_service_mode_e service_mode;
     650          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     651             : 
     652          60 :         if (lp__disable_spoolss()) {
     653           0 :                 return NT_STATUS_OK;
     654             :         }
     655             : 
     656             :         /* Register the endpoint server in DCERPC core */
     657          60 :         ep_server = spoolss_get_ep_server();
     658          60 :         if (ep_server == NULL) {
     659           0 :                 DBG_ERR("Failed to get 'spoolss' endpoint server\n");
     660           0 :                 return NT_STATUS_UNSUCCESSFUL;
     661             :         }
     662             : 
     663          60 :         service_mode = rpc_service_mode(ep_server->name);
     664          62 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED ||
     665           2 :             spoolss_type != RPC_DAEMON_EMBEDDED) {
     666           8 :                 return NT_STATUS_OK;
     667             :         }
     668             : 
     669          52 :         status = dcerpc_register_ep_server(ep_server);
     670          52 :         if (!NT_STATUS_IS_OK(status)) {
     671           0 :                 DBG_ERR("Failed to register '%s' endpoint server"
     672             :                         ": %s\n", ep_server->name, nt_errstr(status));
     673           0 :                 return status;
     674             :         }
     675             : 
     676          52 :         return NT_STATUS_OK;
     677             : }
     678             : 
     679          60 : static NTSTATUS rpc_setup_svcctl(struct tevent_context *ev_ctx,
     680             :                                  struct messaging_context *msg_ctx)
     681             : {
     682             :         NTSTATUS status;
     683             :         enum rpc_service_mode_e service_mode;
     684          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     685             : 
     686             :         /* Register the endpoint server in DCERPC core */
     687          60 :         ep_server = svcctl_get_ep_server();
     688          60 :         if (ep_server == NULL) {
     689           0 :                 DBG_ERR("Failed to get 'svcctl' endpoint server\n");
     690           0 :                 return NT_STATUS_UNSUCCESSFUL;
     691             :         }
     692             : 
     693          60 :         service_mode = rpc_service_mode(ep_server->name);
     694          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     695           0 :                 return NT_STATUS_OK;
     696             :         }
     697             : 
     698          60 :         status = dcerpc_register_ep_server(ep_server);
     699          60 :         if (!NT_STATUS_IS_OK(status)) {
     700           0 :                 DBG_ERR("Failed to register '%s' endpoint server"
     701             :                         ": %s\n", ep_server->name, nt_errstr(status));
     702           0 :                 return status;
     703             :         }
     704             : 
     705          60 :         return NT_STATUS_OK;
     706             : }
     707             : 
     708          60 : static NTSTATUS rpc_setup_ntsvcs(struct tevent_context *ev_ctx,
     709             :                                  struct messaging_context *msg_ctx)
     710             : {
     711             :         NTSTATUS status;
     712             :         enum rpc_service_mode_e service_mode;
     713          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     714             : 
     715             :         /* Register the endpoint server in DCERPC core */
     716          60 :         ep_server = ntsvcs_get_ep_server();
     717          60 :         if (ep_server == NULL) {
     718           0 :                 DBG_ERR("Failed to get 'ntsvcs' endpoint server\n");
     719           0 :                 return NT_STATUS_UNSUCCESSFUL;
     720             :         }
     721             : 
     722          60 :         service_mode = rpc_service_mode(ep_server->name);
     723          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     724           0 :                 return NT_STATUS_OK;
     725             :         }
     726             : 
     727          60 :         status = dcerpc_register_ep_server(ep_server);
     728          60 :         if (!NT_STATUS_IS_OK(status)) {
     729           0 :                 DBG_ERR("Failed to register '%s' endpoint server"
     730             :                         ": %s\n", ep_server->name, nt_errstr(status));
     731           0 :                 return status;
     732             :         }
     733             : 
     734          60 :         return NT_STATUS_OK;
     735             : }
     736             : 
     737          60 : static NTSTATUS rpc_setup_eventlog(struct tevent_context *ev_ctx,
     738             :                                    struct messaging_context *msg_ctx)
     739             : {
     740             :         NTSTATUS status;
     741             :         enum rpc_service_mode_e service_mode;
     742          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     743             : 
     744             :         /* Register the endpoint server in DCERPC core */
     745          60 :         ep_server = eventlog_get_ep_server();
     746          60 :         if (ep_server == NULL) {
     747           0 :                 DBG_ERR("Failed to get 'eventlog' endpoint server\n");
     748           0 :                 return NT_STATUS_UNSUCCESSFUL;
     749             :         }
     750             : 
     751          60 :         service_mode = rpc_service_mode(ep_server->name);
     752          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     753           0 :                 return NT_STATUS_OK;
     754             :         }
     755             : 
     756          60 :         status = dcerpc_register_ep_server(ep_server);
     757          60 :         if (!NT_STATUS_IS_OK(status)) {
     758           0 :                 DBG_ERR("Failed to register '%s' endpoint server"
     759             :                         ": %s\n", ep_server->name, nt_errstr(status));
     760           0 :                 return status;
     761             :         }
     762             : 
     763          60 :         return NT_STATUS_OK;
     764             : }
     765             : 
     766          60 : static NTSTATUS rpc_setup_initshutdown(struct tevent_context *ev_ctx,
     767             :                                        struct messaging_context *msg_ctx)
     768             : {
     769             :         NTSTATUS status;
     770             :         enum rpc_service_mode_e service_mode;
     771          60 :         const struct dcesrv_endpoint_server *ep_server = NULL;
     772             : 
     773             :         /* Register the endpoint server in DCERPC core */
     774          60 :         ep_server = initshutdown_get_ep_server();
     775          60 :         if (ep_server == NULL) {
     776           0 :                 DBG_ERR("Failed to get 'initshutdown' endpoint server\n");
     777           0 :                 return NT_STATUS_UNSUCCESSFUL;
     778             :         }
     779             : 
     780          60 :         service_mode = rpc_service_mode(ep_server->name);
     781          60 :         if (service_mode != RPC_SERVICE_MODE_EMBEDDED) {
     782          32 :                 return NT_STATUS_OK;
     783             :         }
     784             : 
     785          28 :         status = dcerpc_register_ep_server(ep_server);
     786          28 :         if (!NT_STATUS_IS_OK(status)) {
     787           0 :                 DBG_ERR("Failed to register '%s' endpoint "
     788             :                         "server: %s\n", ep_server->name, nt_errstr(status));
     789           0 :                 return status;
     790             :         }
     791             : 
     792          28 :         return NT_STATUS_OK;
     793             : }
     794             : 
     795          60 : NTSTATUS dcesrv_init(TALLOC_CTX *mem_ctx,
     796             :                      struct tevent_context *ev_ctx,
     797             :                      struct messaging_context *msg_ctx,
     798             :                      struct dcesrv_context *dce_ctx)
     799             : {
     800             :         TALLOC_CTX *tmp_ctx;
     801             :         bool ok;
     802          60 :         init_module_fn *mod_init_fns = NULL;
     803             :         NTSTATUS status;
     804             : 
     805          60 :         tmp_ctx = talloc_stackframe();
     806          60 :         if (tmp_ctx == NULL) {
     807           0 :                 return NT_STATUS_NO_MEMORY;
     808             :         }
     809             : 
     810          60 :         DBG_INFO("Registering DCE/RPC endpoint servers\n");
     811             : 
     812          60 :         status = rpc_setup_winreg(ev_ctx, msg_ctx);
     813          60 :         if (!NT_STATUS_IS_OK(status)) {
     814           0 :                 goto done;
     815             :         }
     816             : 
     817          60 :         status = rpc_setup_srvsvc(ev_ctx, msg_ctx);
     818          60 :         if (!NT_STATUS_IS_OK(status)) {
     819           0 :                 goto done;
     820             :         }
     821             : 
     822          60 :         status = rpc_setup_lsarpc(ev_ctx, msg_ctx);
     823          60 :         if (!NT_STATUS_IS_OK(status)) {
     824           0 :                 goto done;
     825             :         }
     826             : 
     827          60 :         status = rpc_setup_samr(ev_ctx, msg_ctx);
     828          60 :         if (!NT_STATUS_IS_OK(status)) {
     829           0 :                 goto done;
     830             :         }
     831             : 
     832          60 :         status = rpc_setup_netlogon(ev_ctx, msg_ctx);
     833          60 :         if (!NT_STATUS_IS_OK(status)) {
     834           0 :                 goto done;
     835             :         }
     836             : 
     837          60 :         status = rpc_setup_netdfs(ev_ctx, msg_ctx);
     838          60 :         if (!NT_STATUS_IS_OK(status)) {
     839           0 :                 goto done;
     840             :         }
     841             : 
     842             : #ifdef DEVELOPER
     843          60 :         status = rpc_setup_rpcecho(ev_ctx, msg_ctx);
     844          60 :         if (!NT_STATUS_IS_OK(status)) {
     845           0 :                 goto done;
     846             :         }
     847             : #endif
     848             : 
     849          60 :         status = rpc_setup_dssetup(ev_ctx, msg_ctx);
     850          60 :         if (!NT_STATUS_IS_OK(status)) {
     851           0 :                 goto done;
     852             :         }
     853             : 
     854          60 :         status = rpc_setup_wkssvc(ev_ctx, msg_ctx);
     855          60 :         if (!NT_STATUS_IS_OK(status)) {
     856           0 :                 goto done;
     857             :         }
     858             : 
     859          60 :         status = rpc_setup_spoolss(ev_ctx, msg_ctx);
     860          60 :         if (!NT_STATUS_IS_OK(status)) {
     861           0 :                 goto done;
     862             :         }
     863             : 
     864          60 :         status = rpc_setup_svcctl(ev_ctx, msg_ctx);
     865          60 :         if (!NT_STATUS_IS_OK(status)) {
     866           0 :                 goto done;
     867             :         }
     868             : 
     869          60 :         status = rpc_setup_ntsvcs(ev_ctx, msg_ctx);
     870          60 :         if (!NT_STATUS_IS_OK(status)) {
     871           0 :                 goto done;
     872             :         }
     873             : 
     874          60 :         status = rpc_setup_eventlog(ev_ctx, msg_ctx);
     875          60 :         if (!NT_STATUS_IS_OK(status)) {
     876           0 :                 goto done;
     877             :         }
     878             : 
     879          60 :         status = rpc_setup_initshutdown(ev_ctx, msg_ctx);
     880          60 :         if (!NT_STATUS_IS_OK(status)) {
     881           0 :                 goto done;
     882             :         }
     883             : 
     884          60 :         DBG_INFO("Initializing DCE/RPC modules\n");
     885             : 
     886             :         /* Initialize static subsystems */
     887          60 :         static_init_rpc(NULL);
     888             : 
     889             :         /* Initialize shared modules */
     890          60 :         mod_init_fns = load_samba_modules(tmp_ctx, "rpc");
     891          60 :         if ((mod_init_fns == NULL) && (errno != ENOENT)) {
     892             :                 /*
     893             :                  * ENOENT means the directory doesn't exist which can happen if
     894             :                  * all modules are static. So ENOENT is ok, everything else is
     895             :                  * not ok.
     896             :                  */
     897           0 :                 DBG_ERR("Loading shared DCE/RPC modules failed [%s]\n",
     898             :                         strerror(errno));
     899           0 :                 status = NT_STATUS_UNSUCCESSFUL;
     900           0 :                 goto done;
     901             :         }
     902             : 
     903          60 :         ok = run_init_functions(NULL, mod_init_fns);
     904          60 :         if (!ok) {
     905           0 :                 DBG_ERR("Initializing shared DCE/RPC modules failed\n");
     906           0 :                 status = NT_STATUS_UNSUCCESSFUL;
     907           0 :                 goto done;
     908             :         }
     909             : 
     910             :         /* The RPC module setup function has to register the endpoint server */
     911          60 :         ok = setup_rpc_modules(ev_ctx, msg_ctx);
     912          60 :         if (!ok) {
     913           0 :                 DBG_ERR("Shared DCE/RPC modules setup failed\n");
     914           0 :                 status = NT_STATUS_UNSUCCESSFUL;
     915           0 :                 goto done;
     916             :         }
     917             : 
     918          60 :         DBG_INFO("Initializing DCE/RPC registered endpoint servers\n");
     919             : 
     920          60 :         status = dcesrv_init_registered_ep_servers(dce_ctx);
     921          60 :         if (!NT_STATUS_IS_OK(status)) {
     922           0 :                 DBG_ERR("Failed to init DCE/RPC endpoint servers: %s\n",
     923             :                         nt_errstr(status));
     924           0 :                 goto done;
     925             :         }
     926             : 
     927          60 :         DBG_INFO("Initializing DCE/RPC connection endpoints\n");
     928             : 
     929          60 :         status = dcesrv_init_endpoints(ev_ctx, msg_ctx, dce_ctx);
     930          60 :         if (!NT_STATUS_IS_OK(status)) {
     931           0 :                 DBG_ERR("Failed to init DCE/RPC endpoints: %s\n",
     932             :                         nt_errstr(status));
     933           0 :                 goto done;
     934             :         }
     935             : 
     936          58 :         status = NT_STATUS_OK;
     937          60 : done:
     938          60 :         talloc_free(tmp_ctx);
     939          60 :         return status;
     940             : }
     941             : 
     942             : /* vim: set ts=8 sw=8 noet cindent ft=c.doxygen: */

Generated by: LCOV version 1.13