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/>.
24 #include "../librpc/gen_ndr/srv_epmapper.h"
25 #include "../librpc/gen_ndr/srv_srvsvc.h"
26 #include "../librpc/gen_ndr/srv_winreg.h"
27 #include "../librpc/gen_ndr/srv_dfs.h"
28 #include "../librpc/gen_ndr/srv_dssetup.h"
29 #include "../librpc/gen_ndr/srv_echo.h"
30 #include "../librpc/gen_ndr/srv_eventlog.h"
31 #include "../librpc/gen_ndr/srv_initshutdown.h"
32 #include "../librpc/gen_ndr/srv_lsa.h"
33 #include "../librpc/gen_ndr/srv_netlogon.h"
34 #include "../librpc/gen_ndr/srv_ntsvcs.h"
35 #include "../librpc/gen_ndr/srv_samr.h"
36 #include "../librpc/gen_ndr/srv_spoolss.h"
37 #include "../librpc/gen_ndr/srv_svcctl.h"
38 #include "../librpc/gen_ndr/srv_wkssvc.h"
40 #include "printing/nt_printing_migrate.h"
41 #include "rpc_server/eventlog/srv_eventlog_reg.h"
42 #include "rpc_server/svcctl/srv_svcctl_reg.h"
44 #include "librpc/rpc/dcerpc_ep.h"
46 #include "rpc_server/srv_rpc_register.h"
48 static NTSTATUS _rpc_ep_register(const struct ndr_interface_table *iface,
51 struct dcerpc_binding_vector *v = NULL;
53 const char *rpcsrv_type;
55 /* start endpoint mapper only if enabled */
56 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
57 "rpc_server", "epmapper",
59 if (StrCaseCmp(rpcsrv_type, "none") == 0) {
63 status = dcerpc_binding_vector_create(talloc_tos(),
66 if (!NT_STATUS_IS_OK(status)) {
70 status = dcerpc_ep_register(iface,
72 &iface->syntax_id.uuid,
74 if (!NT_STATUS_IS_OK(status)) {
81 static NTSTATUS _rpc_ep_unregister(const struct ndr_interface_table *iface)
83 struct dcerpc_binding_vector *v = NULL;
85 const char *rpcsrv_type;
87 /* start endpoint mapper only if enabled */
88 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
89 "rpc_server", "epmapper",
91 if (StrCaseCmp(rpcsrv_type, "none") == 0) {
95 status = dcerpc_binding_vector_create(talloc_tos(),
98 if (!NT_STATUS_IS_OK(status)) {
102 status = dcerpc_ep_unregister(iface,
104 &iface->syntax_id.uuid);
105 if (!NT_STATUS_IS_OK(status)) {
112 static bool winreg_init_cb(void *ptr)
114 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_winreg, "winreg"));
117 static bool winreg_shutdown_cb(void *ptr)
119 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_winreg));
122 static bool srvsvc_init_cb(void *ptr)
124 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_srvsvc, "srvsvc"));
127 static bool srvsvc_shutdown_cb(void *ptr)
129 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_srvsvc));
132 static bool lsarpc_init_cb(void *ptr)
134 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_lsarpc, "lsarpc"));
137 static bool lsarpc_shutdown_cb(void *ptr)
139 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_lsarpc));
142 static bool samr_init_cb(void *ptr)
144 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_samr, "samr"));
147 static bool samr_shutdown_cb(void *ptr)
149 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_samr));
152 static bool netlogon_init_cb(void *ptr)
154 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_netlogon, "netlogon"));
157 static bool netlogon_shutdown_cb(void *ptr)
159 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_netlogon));
162 static bool spoolss_init_cb(void *ptr)
164 struct messaging_context *msg_ctx = talloc_get_type_abort(
165 ptr, struct messaging_context);
170 * Migrate the printers first.
172 ok = nt_printing_tdb_migrate(msg_ctx);
177 status =_rpc_ep_register(&ndr_table_spoolss, "spoolss");
178 if (!NT_STATUS_IS_OK(status)) {
187 static bool spoolss_shutdown_cb(void *ptr)
189 srv_spoolss_cleanup();
191 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_spoolss));
194 static bool svcctl_init_cb(void *ptr)
196 struct messaging_context *msg_ctx = talloc_get_type_abort(
197 ptr, struct messaging_context);
200 ok = svcctl_init_winreg(msg_ctx);
205 /* initialize the control hooks */
206 init_service_op_table();
208 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_svcctl, "svcctl"));
211 static bool svcctl_shutdown_cb(void *ptr)
213 shutdown_service_op_table();
215 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_svcctl));
218 static bool ntsvcs_init_cb(void *ptr)
220 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_ntsvcs, "ntsvcs"));
223 static bool ntsvcs_shutdown_cb(void *ptr)
225 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_ntsvcs));
228 static bool eventlog_init_cb(void *ptr)
230 struct messaging_context *msg_ctx = talloc_get_type_abort(
231 ptr, struct messaging_context);
234 status =_rpc_ep_register(&ndr_table_eventlog,
236 if (!NT_STATUS_IS_OK(status)) {
240 return eventlog_init_winreg(msg_ctx);
243 static bool eventlog_shutdown_cb(void *ptr)
245 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_eventlog));
248 static bool initshutdown_init_cb(void *ptr)
250 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_initshutdown,
254 static bool initshutdown_shutdown_cb(void *ptr)
256 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_initshutdown));
259 static bool rpcecho_init_cb(void *ptr) {
260 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_rpcecho, "rpcecho"));
263 static bool rpcecho_shutdown_cb(void *ptr)
265 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_rpcecho));
268 static bool netdfs_init_cb(void *ptr)
270 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_netdfs, "netdfs"));
273 static bool netdfs_shutdown_cb(void *ptr) {
274 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_netdfs));
277 static bool dssetup_init_cb(void *ptr) {
278 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_dssetup, "dssetup"));
281 static bool dssetup_shutdown_cb(void *ptr) {
282 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_dssetup));
285 static bool wkssvc_init_cb(void *ptr) {
286 return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_wkssvc, "wkssvc"));
289 static bool wkssvc_shutdown_cb(void *ptr) {
290 return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_wkssvc));
293 bool srv_rpc_register(struct messaging_context *msg_ctx) {
294 struct rpc_srv_callbacks winreg_cb;
295 struct rpc_srv_callbacks srvsvc_cb;
297 struct rpc_srv_callbacks lsarpc_cb;
298 struct rpc_srv_callbacks samr_cb;
299 struct rpc_srv_callbacks netlogon_cb;
301 struct rpc_srv_callbacks spoolss_cb;
302 struct rpc_srv_callbacks svcctl_cb;
303 struct rpc_srv_callbacks ntsvcs_cb;
304 struct rpc_srv_callbacks eventlog_cb;
305 struct rpc_srv_callbacks initshutdown_cb;
306 struct rpc_srv_callbacks netdfs_cb;
308 struct rpc_srv_callbacks rpcecho_cb;
310 struct rpc_srv_callbacks dssetup_cb;
311 struct rpc_srv_callbacks wkssvc_cb;
313 const char *rpcsrv_type;
315 /* start endpoint mapper only if enabled */
316 rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
317 "rpc_server", "epmapper",
319 if (StrCaseCmp(rpcsrv_type, "embedded") == 0) {
320 if (!NT_STATUS_IS_OK(rpc_epmapper_init(NULL))) {
325 winreg_cb.init = winreg_init_cb;
326 winreg_cb.shutdown = winreg_shutdown_cb;
327 winreg_cb.private_data = NULL;
328 if (!NT_STATUS_IS_OK(rpc_winreg_init(&winreg_cb))) {
332 srvsvc_cb.init = srvsvc_init_cb;
333 srvsvc_cb.shutdown = srvsvc_shutdown_cb;
334 srvsvc_cb.private_data = NULL;
335 if (!NT_STATUS_IS_OK(rpc_srvsvc_init(&srvsvc_cb))) {
340 lsarpc_cb.init = lsarpc_init_cb;
341 lsarpc_cb.shutdown = lsarpc_shutdown_cb;
342 lsarpc_cb.private_data = NULL;
343 if (!NT_STATUS_IS_OK(rpc_lsarpc_init(&lsarpc_cb))) {
347 samr_cb.init = samr_init_cb;
348 samr_cb.shutdown = samr_shutdown_cb;
349 samr_cb.private_data = NULL;
350 if (!NT_STATUS_IS_OK(rpc_samr_init(&samr_cb))) {
354 netlogon_cb.init = netlogon_init_cb;
355 netlogon_cb.shutdown = netlogon_shutdown_cb;
356 netlogon_cb.private_data = NULL;
357 if (!NT_STATUS_IS_OK(rpc_netlogon_init(&netlogon_cb))) {
361 spoolss_cb.init = spoolss_init_cb;
362 spoolss_cb.shutdown = spoolss_shutdown_cb;
363 spoolss_cb.private_data = msg_ctx;
364 if (!NT_STATUS_IS_OK(rpc_spoolss_init(&spoolss_cb))) {
369 svcctl_cb.init = svcctl_init_cb;
370 svcctl_cb.shutdown = svcctl_shutdown_cb;
371 svcctl_cb.private_data = msg_ctx;
372 if (!NT_STATUS_IS_OK(rpc_svcctl_init(&svcctl_cb))) {
376 ntsvcs_cb.init = ntsvcs_init_cb;
377 ntsvcs_cb.shutdown = ntsvcs_shutdown_cb;
378 ntsvcs_cb.private_data = NULL;
379 if (!NT_STATUS_IS_OK(rpc_ntsvcs_init(&ntsvcs_cb))) {
383 eventlog_cb.init = eventlog_init_cb;
384 eventlog_cb.shutdown = eventlog_shutdown_cb;
385 eventlog_cb.private_data = msg_ctx;
386 if (!NT_STATUS_IS_OK(rpc_eventlog_init(&eventlog_cb))) {
390 initshutdown_cb.init = initshutdown_init_cb;
391 initshutdown_cb.shutdown = initshutdown_shutdown_cb;
392 initshutdown_cb.private_data = NULL;
393 if (!NT_STATUS_IS_OK(rpc_initshutdown_init(&initshutdown_cb))) {
397 netdfs_cb.init = netdfs_init_cb;
398 netdfs_cb.shutdown = netdfs_shutdown_cb;
399 netdfs_cb.private_data = NULL;
400 if (!NT_STATUS_IS_OK(rpc_netdfs_init(&netdfs_cb))) {
405 rpcecho_cb.init = rpcecho_init_cb;
406 rpcecho_cb.shutdown = rpcecho_shutdown_cb;
407 rpcecho_cb.private_data = NULL;
408 if (!NT_STATUS_IS_OK(rpc_rpcecho_init(&rpcecho_cb))) {
413 dssetup_cb.init = dssetup_init_cb;
414 dssetup_cb.shutdown = dssetup_shutdown_cb;
415 dssetup_cb.private_data = NULL;
416 if (!NT_STATUS_IS_OK(rpc_dssetup_init(&dssetup_cb))) {
420 wkssvc_cb.init = wkssvc_init_cb;
421 wkssvc_cb.shutdown = wkssvc_shutdown_cb;
422 wkssvc_cb.private_data = NULL;
423 if (!NT_STATUS_IS_OK(rpc_wkssvc_init(&wkssvc_cb))) {
430 /* vim: set ts=8 sw=8 noet cindent ft=c.doxygen: */