2 * Unix SMB/CIFS implementation.
4 * SMBD RPC service callbacks
6 * Copyright (c) 2011 Andreas Schneider <asn@samba.org>
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.
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.
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/>.
25 #include "../librpc/gen_ndr/ndr_epmapper_c.h"
26 #include "../librpc/gen_ndr/srv_epmapper.h"
27 #include "../librpc/gen_ndr/srv_srvsvc.h"
28 #include "../librpc/gen_ndr/srv_winreg.h"
29 #include "../librpc/gen_ndr/srv_dfs.h"
30 #include "../librpc/gen_ndr/srv_dssetup.h"
31 #include "../librpc/gen_ndr/srv_echo.h"
32 #include "../librpc/gen_ndr/srv_eventlog.h"
33 #include "../librpc/gen_ndr/srv_initshutdown.h"
34 #include "../librpc/gen_ndr/srv_lsa.h"
35 #include "../librpc/gen_ndr/srv_netlogon.h"
36 #include "../librpc/gen_ndr/srv_ntsvcs.h"
37 #include "../librpc/gen_ndr/srv_samr.h"
38 #include "../librpc/gen_ndr/srv_spoolss.h"
39 #include "../librpc/gen_ndr/srv_svcctl.h"
40 #include "../librpc/gen_ndr/srv_wkssvc.h"
42 #include "printing/nt_printing_migrate_internal.h"
43 #include "rpc_server/eventlog/srv_eventlog_reg.h"
44 #include "rpc_server/svcctl/srv_svcctl_reg.h"
45 #include "rpc_server/spoolss/srv_spoolss_nt.h"
46 #include "rpc_server/svcctl/srv_svcctl_nt.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/epmapper/srv_epmapper.h"
55 /* the default is "embedded" so this table
56 * lists only services that are not using
57 * the default in order to keep enumerating it
58 * in rpc_service_mode() as short as possible
60 struct rpc_service_defaults {
63 } rpc_service_defaults[] = {
64 { "epmapper", "external" },
65 /* { "spoolss", "embedded" }, */
66 /* { "lsarpc", "embedded" }, */
67 /* { "samr", "embedded" }, */
68 /* { "netlogon", "embedded" }, */
73 enum rpc_service_mode_e rpc_service_mode(const char *name)
75 const char *rpcsrv_type;
76 enum rpc_service_mode_e state;
81 for (i = 0; rpc_service_defaults[i].name; i++) {
82 if (strcasecmp_m(name, rpc_service_defaults[i].name) == 0) {
83 def = rpc_service_defaults[i].def_mode;
87 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
88 "rpc_server", name, def);
90 if (strcasecmp_m(rpcsrv_type, "embedded") == 0) {
91 state = RPC_SERVICE_MODE_EMBEDDED;
92 } else if (strcasecmp_m(rpcsrv_type, "external") == 0) {
93 state = RPC_SERVICE_MODE_EXTERNAL;
94 } else if (strcasecmp(rpcsrv_type, "daemon") == 0) {
95 state = RPC_SERVICE_MODE_DAEMON;
97 state = RPC_SERVICE_MODE_DISABLED;
103 static bool rpc_setup_epmapper(struct tevent_context *ev_ctx,
104 struct messaging_context *msg_ctx)
106 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
109 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
110 status = rpc_epmapper_init(NULL);
111 if (!NT_STATUS_IS_OK(status)) {
119 static bool rpc_setup_winreg(struct tevent_context *ev_ctx,
120 struct messaging_context *msg_ctx,
121 const struct dcerpc_binding_vector *v)
123 const struct ndr_interface_table *t = &ndr_table_winreg;
124 const char *pipe_name = "winreg";
125 struct dcerpc_binding_vector *v2;
126 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
130 status = rpc_winreg_init(NULL);
131 if (!NT_STATUS_IS_OK(status)) {
135 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
136 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
141 status = dcerpc_binding_vector_replace_iface(t, v2);
142 if (!NT_STATUS_IS_OK(status)) {
146 status = dcerpc_binding_vector_add_np_default(t, v2);
147 if (!NT_STATUS_IS_OK(status)) {
151 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
159 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
160 if (!NT_STATUS_IS_OK(status)) {
164 status = rpc_ep_register(ev_ctx,
168 if (!NT_STATUS_IS_OK(status)) {
176 static bool rpc_setup_srvsvc(struct tevent_context *ev_ctx,
177 struct messaging_context *msg_ctx,
178 const struct dcerpc_binding_vector *v)
180 const struct ndr_interface_table *t = &ndr_table_srvsvc;
181 const char *pipe_name = "srvsvc";
182 struct dcerpc_binding_vector *v2;
183 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
187 status = rpc_srvsvc_init(NULL);
188 if (!NT_STATUS_IS_OK(status)) {
192 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
193 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
198 status = dcerpc_binding_vector_replace_iface(t, v2);
199 if (!NT_STATUS_IS_OK(status)) {
203 status = dcerpc_binding_vector_add_np_default(t, v2);
204 if (!NT_STATUS_IS_OK(status)) {
208 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
216 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
217 if (!NT_STATUS_IS_OK(status)) {
221 status = rpc_ep_register(ev_ctx,
225 if (!NT_STATUS_IS_OK(status)) {
233 static bool rpc_setup_lsarpc(struct tevent_context *ev_ctx,
234 struct messaging_context *msg_ctx,
235 const struct dcerpc_binding_vector *v)
237 const struct ndr_interface_table *t = &ndr_table_lsarpc;
238 const char *pipe_name = "lsarpc";
239 struct dcerpc_binding_vector *v2;
240 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
241 enum rpc_service_mode_e lsarpc_mode = rpc_lsarpc_mode();
245 status = rpc_lsarpc_init(NULL);
246 if (!NT_STATUS_IS_OK(status)) {
250 if (lsarpc_mode == RPC_SERVICE_MODE_EMBEDDED &&
251 epm_mode != RPC_SERVICE_MODE_DISABLED) {
252 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
257 status = dcerpc_binding_vector_replace_iface(t, v2);
258 if (!NT_STATUS_IS_OK(status)) {
262 status = dcerpc_binding_vector_add_np_default(t, v2);
263 if (!NT_STATUS_IS_OK(status)) {
267 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
275 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
276 if (!NT_STATUS_IS_OK(status)) {
280 status = rpc_ep_register(ev_ctx,
284 if (!NT_STATUS_IS_OK(status)) {
292 static bool rpc_setup_samr(struct tevent_context *ev_ctx,
293 struct messaging_context *msg_ctx,
294 const struct dcerpc_binding_vector *v)
296 const struct ndr_interface_table *t = &ndr_table_samr;
297 const char *pipe_name = "samr";
298 struct dcerpc_binding_vector *v2;
299 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
300 enum rpc_service_mode_e samr_mode = rpc_samr_mode();
304 status = rpc_samr_init(NULL);
305 if (!NT_STATUS_IS_OK(status)) {
309 if (samr_mode == RPC_SERVICE_MODE_EMBEDDED &&
310 epm_mode != RPC_SERVICE_MODE_DISABLED) {
311 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
316 status = dcerpc_binding_vector_replace_iface(t, v2);
317 if (!NT_STATUS_IS_OK(status)) {
321 status = dcerpc_binding_vector_add_np_default(t, v2);
322 if (!NT_STATUS_IS_OK(status)) {
326 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
334 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
335 if (!NT_STATUS_IS_OK(status)) {
339 status = rpc_ep_register(ev_ctx,
343 if (!NT_STATUS_IS_OK(status)) {
351 static bool rpc_setup_netlogon(struct tevent_context *ev_ctx,
352 struct messaging_context *msg_ctx,
353 const struct dcerpc_binding_vector *v)
355 const struct ndr_interface_table *t = &ndr_table_netlogon;
356 const char *pipe_name = "netlogon";
357 struct dcerpc_binding_vector *v2;
358 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
359 enum rpc_service_mode_e netlogon_mode = rpc_netlogon_mode();
363 status = rpc_netlogon_init(NULL);
364 if (!NT_STATUS_IS_OK(status)) {
368 if (netlogon_mode == RPC_SERVICE_MODE_EMBEDDED &&
369 epm_mode != RPC_SERVICE_MODE_DISABLED) {
370 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
375 status = dcerpc_binding_vector_replace_iface(t, v2);
376 if (!NT_STATUS_IS_OK(status)) {
380 status = dcerpc_binding_vector_add_np_default(t, v2);
381 if (!NT_STATUS_IS_OK(status)) {
385 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
393 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
394 if (!NT_STATUS_IS_OK(status)) {
398 status = rpc_ep_register(ev_ctx,
402 if (!NT_STATUS_IS_OK(status)) {
410 static bool rpc_setup_netdfs(struct tevent_context *ev_ctx,
411 struct messaging_context *msg_ctx,
412 const struct dcerpc_binding_vector *v)
414 const struct ndr_interface_table *t = &ndr_table_netdfs;
415 const char *pipe_name = "netdfs";
416 struct dcerpc_binding_vector *v2;
417 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
421 status = rpc_netdfs_init(NULL);
422 if (!NT_STATUS_IS_OK(status)) {
426 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
427 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
432 status = dcerpc_binding_vector_replace_iface(t, v2);
433 if (!NT_STATUS_IS_OK(status)) {
437 status = dcerpc_binding_vector_add_np_default(t, v2);
438 if (!NT_STATUS_IS_OK(status)) {
442 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
450 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
451 if (!NT_STATUS_IS_OK(status)) {
455 status = rpc_ep_register(ev_ctx,
459 if (!NT_STATUS_IS_OK(status)) {
468 static bool rpc_setup_rpcecho(struct tevent_context *ev_ctx,
469 struct messaging_context *msg_ctx,
470 const struct dcerpc_binding_vector *v)
472 const struct ndr_interface_table *t = &ndr_table_rpcecho;
473 const char *pipe_name = "rpcecho";
474 struct dcerpc_binding_vector *v2;
475 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
479 status = rpc_rpcecho_init(NULL);
480 if (!NT_STATUS_IS_OK(status)) {
484 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
485 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
490 status = dcerpc_binding_vector_replace_iface(t, v2);
491 if (!NT_STATUS_IS_OK(status)) {
495 status = dcerpc_binding_vector_add_np_default(t, v2);
496 if (!NT_STATUS_IS_OK(status)) {
500 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
508 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
509 if (!NT_STATUS_IS_OK(status)) {
513 status = rpc_ep_register(ev_ctx,
517 if (!NT_STATUS_IS_OK(status)) {
526 static bool rpc_setup_dssetup(struct tevent_context *ev_ctx,
527 struct messaging_context *msg_ctx,
528 const struct dcerpc_binding_vector *v)
530 const struct ndr_interface_table *t = &ndr_table_dssetup;
531 const char *pipe_name = "dssetup";
532 struct dcerpc_binding_vector *v2;
533 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
537 status = rpc_dssetup_init(NULL);
538 if (!NT_STATUS_IS_OK(status)) {
542 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
543 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
548 status = dcerpc_binding_vector_replace_iface(t, v2);
549 if (!NT_STATUS_IS_OK(status)) {
553 status = dcerpc_binding_vector_add_np_default(t, v2);
554 if (!NT_STATUS_IS_OK(status)) {
558 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
566 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
567 if (!NT_STATUS_IS_OK(status)) {
571 status = rpc_ep_register(ev_ctx,
575 if (!NT_STATUS_IS_OK(status)) {
583 static bool rpc_setup_wkssvc(struct tevent_context *ev_ctx,
584 struct messaging_context *msg_ctx,
585 const struct dcerpc_binding_vector *v)
587 const struct ndr_interface_table *t = &ndr_table_wkssvc;
588 const char *pipe_name = "wkssvc";
589 struct dcerpc_binding_vector *v2;
590 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
594 status = rpc_wkssvc_init(NULL);
595 if (!NT_STATUS_IS_OK(status)) {
599 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
600 v2 = dcerpc_binding_vector_dup(talloc_tos(), v);
605 status = dcerpc_binding_vector_replace_iface(t, v2);
606 if (!NT_STATUS_IS_OK(status)) {
610 status = dcerpc_binding_vector_add_np_default(t, v2);
611 if (!NT_STATUS_IS_OK(status)) {
615 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
623 status = dcerpc_binding_vector_add_unix(t, v2, pipe_name);
624 if (!NT_STATUS_IS_OK(status)) {
628 status = rpc_ep_register(ev_ctx,
632 if (!NT_STATUS_IS_OK(status)) {
640 static bool spoolss_init_cb(void *ptr)
642 struct messaging_context *msg_ctx =
643 talloc_get_type_abort(ptr, struct messaging_context);
647 * Migrate the printers first.
649 ok = nt_printing_tdb_migrate(msg_ctx);
657 static bool spoolss_shutdown_cb(void *ptr)
659 srv_spoolss_cleanup();
664 static bool rpc_setup_spoolss(struct tevent_context *ev_ctx,
665 struct messaging_context *msg_ctx)
667 const struct ndr_interface_table *t = &ndr_table_spoolss;
668 struct rpc_srv_callbacks spoolss_cb;
669 struct dcerpc_binding_vector *v;
670 enum rpc_service_mode_e spoolss_mode = rpc_spoolss_mode();
673 if (_lp_disable_spoolss() ||
674 spoolss_mode == RPC_SERVICE_MODE_DISABLED) {
678 if (spoolss_mode == RPC_SERVICE_MODE_EMBEDDED) {
679 spoolss_cb.init = spoolss_init_cb;
680 spoolss_cb.shutdown = spoolss_shutdown_cb;
681 spoolss_cb.private_data = msg_ctx;
683 status = rpc_spoolss_init(&spoolss_cb);
684 } else if (spoolss_mode == RPC_SERVICE_MODE_EXTERNAL ||
685 spoolss_mode == RPC_SERVICE_MODE_DAEMON) {
686 status = rpc_spoolss_init(NULL);
688 if (!NT_STATUS_IS_OK(status)) {
692 if (spoolss_mode == RPC_SERVICE_MODE_EMBEDDED) {
693 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
695 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
696 status = dcerpc_binding_vector_new(talloc_tos(), &v);
697 if (!NT_STATUS_IS_OK(status)) {
701 status = dcerpc_binding_vector_add_np_default(t, v);
702 if (!NT_STATUS_IS_OK(status)) {
706 status = rpc_ep_register(ev_ctx,
710 if (!NT_STATUS_IS_OK(status)) {
719 static bool svcctl_init_cb(void *ptr)
721 struct messaging_context *msg_ctx =
722 talloc_get_type_abort(ptr, struct messaging_context);
725 /* initialize the control hooks */
726 init_service_op_table();
728 ok = svcctl_init_winreg(msg_ctx);
736 static bool svcctl_shutdown_cb(void *ptr)
738 shutdown_service_op_table();
743 static bool rpc_setup_svcctl(struct tevent_context *ev_ctx,
744 struct messaging_context *msg_ctx)
746 const struct ndr_interface_table *t = &ndr_table_svcctl;
747 const char *pipe_name = "svcctl";
748 struct dcerpc_binding_vector *v;
749 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
750 struct rpc_srv_callbacks svcctl_cb;
754 svcctl_cb.init = svcctl_init_cb;
755 svcctl_cb.shutdown = svcctl_shutdown_cb;
756 svcctl_cb.private_data = msg_ctx;
758 status = rpc_svcctl_init(&svcctl_cb);
759 if (!NT_STATUS_IS_OK(status)) {
763 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
764 status = dcerpc_binding_vector_new(talloc_tos(), &v);
765 if (!NT_STATUS_IS_OK(status)) {
769 status = dcerpc_binding_vector_add_np_default(t, v);
770 if (!NT_STATUS_IS_OK(status)) {
774 ok = setup_dcerpc_ncalrpc_socket(ev_ctx,
782 status = dcerpc_binding_vector_add_unix(t, v, pipe_name);
783 if (!NT_STATUS_IS_OK(status)) {
787 status = rpc_ep_register(ev_ctx,
791 if (!NT_STATUS_IS_OK(status)) {
799 static bool rpc_setup_ntsvcs(struct tevent_context *ev_ctx,
800 struct messaging_context *msg_ctx)
802 const struct ndr_interface_table *t = &ndr_table_ntsvcs;
803 struct dcerpc_binding_vector *v;
804 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
807 status = rpc_ntsvcs_init(NULL);
808 if (!NT_STATUS_IS_OK(status)) {
812 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
813 status = dcerpc_binding_vector_new(talloc_tos(), &v);
814 if (!NT_STATUS_IS_OK(status)) {
818 status = dcerpc_binding_vector_add_np_default(t, v);
819 if (!NT_STATUS_IS_OK(status)) {
823 status = rpc_ep_register(ev_ctx,
827 if (!NT_STATUS_IS_OK(status)) {
835 static bool eventlog_init_cb(void *ptr)
837 struct messaging_context *msg_ctx =
838 talloc_get_type_abort(ptr, struct messaging_context);
841 ok = eventlog_init_winreg(msg_ctx);
849 static bool rpc_setup_eventlog(struct tevent_context *ev_ctx,
850 struct messaging_context *msg_ctx)
852 const struct ndr_interface_table *t = &ndr_table_eventlog;
853 struct rpc_srv_callbacks eventlog_cb;
854 struct dcerpc_binding_vector *v;
855 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
858 eventlog_cb.init = eventlog_init_cb;
859 eventlog_cb.shutdown = NULL;
860 eventlog_cb.private_data = msg_ctx;
862 status = rpc_eventlog_init(&eventlog_cb);
863 if (!NT_STATUS_IS_OK(status)) {
867 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
868 status = dcerpc_binding_vector_new(talloc_tos(), &v);
869 if (!NT_STATUS_IS_OK(status)) {
873 status = dcerpc_binding_vector_add_np_default(t, v);
874 if (!NT_STATUS_IS_OK(status)) {
878 status = rpc_ep_register(ev_ctx,
882 if (!NT_STATUS_IS_OK(status)) {
890 static bool rpc_setup_initshutdown(struct tevent_context *ev_ctx,
891 struct messaging_context *msg_ctx)
893 const struct ndr_interface_table *t = &ndr_table_initshutdown;
894 struct dcerpc_binding_vector *v;
895 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
898 status = rpc_initshutdown_init(NULL);
899 if (!NT_STATUS_IS_OK(status)) {
903 if (epm_mode != RPC_SERVICE_MODE_DISABLED) {
904 status = dcerpc_binding_vector_new(talloc_tos(), &v);
905 if (!NT_STATUS_IS_OK(status)) {
909 status = dcerpc_binding_vector_add_np_default(t, v);
910 if (!NT_STATUS_IS_OK(status)) {
914 status = rpc_ep_register(ev_ctx,
918 if (!NT_STATUS_IS_OK(status)) {
926 bool dcesrv_ep_setup(struct tevent_context *ev_ctx,
927 struct messaging_context *msg_ctx)
929 enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
930 struct dcerpc_binding_vector *v;
931 const char *rpcsrv_type;
936 tmp_ctx = talloc_stackframe();
937 if (tmp_ctx == NULL) {
941 status = dcerpc_binding_vector_new(tmp_ctx,
943 if (!NT_STATUS_IS_OK(status)) {
948 ok = rpc_setup_epmapper(ev_ctx, msg_ctx);
953 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
958 if ((strcasecmp_m(rpcsrv_type, "yes") == 0 ||
959 strcasecmp_m(rpcsrv_type, "true") == 0)
960 && epm_mode != RPC_SERVICE_MODE_DISABLED) {
961 status = rpc_setup_tcpip_sockets(ev_ctx,
966 if (!NT_STATUS_IS_OK(status)) {
972 ok = rpc_setup_winreg(ev_ctx, msg_ctx, v);
977 ok = rpc_setup_srvsvc(ev_ctx, msg_ctx, v);
982 ok = rpc_setup_lsarpc(ev_ctx, msg_ctx, v);
987 ok = rpc_setup_samr(ev_ctx, msg_ctx, v);
992 ok = rpc_setup_netlogon(ev_ctx, msg_ctx, v);
997 ok = rpc_setup_netdfs(ev_ctx, msg_ctx, v);
1003 ok = rpc_setup_rpcecho(ev_ctx, msg_ctx, v);
1009 ok = rpc_setup_dssetup(ev_ctx, msg_ctx, v);
1014 ok = rpc_setup_wkssvc(ev_ctx, msg_ctx, v);
1019 ok = rpc_setup_spoolss(ev_ctx, msg_ctx);
1024 ok = rpc_setup_svcctl(ev_ctx, msg_ctx);
1029 ok = rpc_setup_ntsvcs(ev_ctx, msg_ctx);
1034 ok = rpc_setup_eventlog(ev_ctx, msg_ctx);
1039 ok = rpc_setup_initshutdown(ev_ctx, msg_ctx);
1045 talloc_free(tmp_ctx);
1049 /* vim: set ts=8 sw=8 noet cindent ft=c.doxygen: */