[SCM] Samba Shared Repository - branch master updated
Ralph Böhme
slow at samba.org
Sun Feb 21 21:29:03 UTC 2016
The branch, master has been updated
via 6018a77 s3:rpc_server: make it possible to build mdssvc as a shared module
via 593abe5 s3:rpc_server: allow building RPC services as shared modules
from 4164111 testprogs/blackbox/subunit: Fix testok
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 6018a7756f9610ffd392371a3d5e5a433d7528a5
Author: Ralph Boehme <slow at samba.org>
Date: Tue Oct 6 13:45:33 2015 +0200
s3:rpc_server: make it possible to build mdssvc as a shared module
Allow building mdssvc RPC service as shared module:
--with-shared-modules=rpc_mdssvc_module
The default is to build it static.
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Guenther Deschner <gd at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
Autobuild-User(master): Ralph Böhme <slow at samba.org>
Autobuild-Date(master): Sun Feb 21 22:28:41 CET 2016 on sn-devel-144
commit 593abe5f6bf3eefba35218214efb31907fa11bd7
Author: Ralph Boehme <slow at samba.org>
Date: Sat Oct 24 10:50:43 2015 +0200
s3:rpc_server: allow building RPC services as shared modules
This is the general RPC subsystem change, existing modules must be
tweaked to support being loaded as a module.
The next commit shows how to do this for the Spotlight RPC service.
The general syntax is: --with-shared-modules=rpc_NAME_module
Signed-off-by: Ralph Boehme <slow at samba.org>
Reviewed-by: Guenther Deschner <gd at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/rpc_server/mdssd.c | 40 ++-------
source3/rpc_server/mdssvc/srv_mdssvc_nt.c | 66 ++++++++++++++
source3/rpc_server/rpc_modules.c | 138 ++++++++++++++++++++++++++++++
source3/rpc_server/rpc_modules.h | 47 ++++++++++
source3/rpc_server/rpc_service_setup.c | 85 ++++++------------
source3/rpc_server/rpc_service_setup.h | 6 ++
source3/rpc_server/wscript_build | 32 ++++---
source3/wscript | 3 +-
8 files changed, 310 insertions(+), 107 deletions(-)
create mode 100644 source3/rpc_server/rpc_modules.c
create mode 100644 source3/rpc_server/rpc_modules.h
Changeset truncated at 500 lines:
diff --git a/source3/rpc_server/mdssd.c b/source3/rpc_server/mdssd.c
index f76d13e..e4c12cd 100644
--- a/source3/rpc_server/mdssd.c
+++ b/source3/rpc_server/mdssd.c
@@ -34,6 +34,7 @@
#include "rpc_server/rpc_server.h"
#include "rpc_server/rpc_ep_register.h"
#include "rpc_server/rpc_sock_helper.h"
+#include "rpc_server/rpc_modules.h"
#include "librpc/gen_ndr/srv_mdssvc.h"
#include "rpc_server/mdssvc/srv_mdssvc_nt.h"
@@ -91,7 +92,7 @@ static void mdssd_sig_term_handler(struct tevent_context *ev,
void *siginfo,
void *private_data)
{
- rpc_mdssvc_shutdown();
+ shutdown_rpc_module("mdssvc");
DEBUG(0, ("termination signal\n"));
exit(0);
@@ -228,10 +229,9 @@ static bool mdssd_child_init(struct tevent_context *ev_ctx,
messaging_register(msg_ctx, ev_ctx,
MSG_PREFORK_PARENT_EVENT, parent_ping);
- status = rpc_mdssvc_init(NULL);
- if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0, ("Failed to intialize RPC: %s\n",
- nt_errstr(status)));
+ ok = init_rpc_module("mdssvc", NULL);
+ if (!ok) {
+ DBG_ERR("Failed to de-intialize RPC\n");
return false;
}
@@ -608,27 +608,6 @@ done:
return ok;
}
-static bool mdssvc_init_cb(void *ptr)
-{
- struct messaging_context *msg_ctx =
- talloc_get_type_abort(ptr, struct messaging_context);
- bool ok;
-
- ok = init_service_mdssvc(msg_ctx);
- if (!ok) {
- return false;
- }
-
- return true;
-}
-
-static bool mdssvc_shutdown_cb(void *ptr)
-{
- shutdown_service_mdssvc();
-
- return true;
-}
-
void start_mdssd(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx)
{
@@ -638,7 +617,6 @@ void start_mdssd(struct tevent_context *ev_ctx,
pid_t pid;
int rc;
bool ok;
- struct rpc_srv_callbacks mdssvc_cb;
DEBUG(1, ("Forking Metadata Service Daemon\n"));
@@ -720,12 +698,8 @@ void start_mdssd(struct tevent_context *ev_ctx,
messaging_register(msg_ctx, ev_ctx,
MSG_PREFORK_CHILD_EVENT, child_ping);
- mdssvc_cb.init = mdssvc_init_cb;
- mdssvc_cb.shutdown = mdssvc_shutdown_cb;
- mdssvc_cb.private_data = msg_ctx;
-
- status = rpc_mdssvc_init(&mdssvc_cb);
- if (!NT_STATUS_IS_OK(status)) {
+ ok = setup_rpc_module(ev_ctx, msg_ctx, "mdssvc");
+ if (!ok) {
exit(1);
}
diff --git a/source3/rpc_server/mdssvc/srv_mdssvc_nt.c b/source3/rpc_server/mdssvc/srv_mdssvc_nt.c
index cb0d759..37b13e7 100644
--- a/source3/rpc_server/mdssvc/srv_mdssvc_nt.c
+++ b/source3/rpc_server/mdssvc/srv_mdssvc_nt.c
@@ -19,6 +19,9 @@
#include "includes.h"
#include "ntdomain.h"
+#include "rpc_server/rpc_service_setup.h"
+#include "rpc_server/rpc_config.h"
+#include "rpc_server/rpc_modules.h"
#include "rpc_server/mdssvc/srv_mdssvc_nt.h"
#include "../librpc/gen_ndr/srv_mdssvc.h"
#include "libcli/security/security_token.h"
@@ -28,6 +31,69 @@
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_RPC_SRV
+static bool mdssvc_init_cb(void *ptr)
+{
+ struct messaging_context *msg_ctx =
+ talloc_get_type_abort(ptr, struct messaging_context);
+ bool ok;
+
+ ok = init_service_mdssvc(msg_ctx);
+ if (!ok) {
+ return false;
+ }
+
+ return true;
+}
+
+static bool mdssvc_shutdown_cb(void *ptr)
+{
+ shutdown_service_mdssvc();
+
+ return true;
+}
+
+static bool rpc_setup_mdssvc(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx)
+{
+ const struct ndr_interface_table *t = &ndr_table_mdssvc;
+ const char *pipe_name = "mdssvc";
+ struct rpc_srv_callbacks mdssvc_cb;
+ NTSTATUS status;
+ enum rpc_service_mode_e service_mode = rpc_service_mode(t->name);
+ enum rpc_daemon_type_e mdssvc_type = rpc_mdssd_daemon();
+
+ mdssvc_cb.init = mdssvc_init_cb;
+ mdssvc_cb.shutdown = mdssvc_shutdown_cb;
+ mdssvc_cb.private_data = msg_ctx;
+
+ status = rpc_mdssvc_init(&mdssvc_cb);
+ if (!NT_STATUS_IS_OK(status)) {
+ return false;
+ }
+
+ if (service_mode != RPC_SERVICE_MODE_EMBEDDED
+ || mdssvc_type != RPC_DAEMON_EMBEDDED) {
+ return true;
+ }
+
+ return rpc_setup_embedded(ev_ctx, msg_ctx, t, pipe_name);
+}
+
+static struct rpc_module_fns rpc_module_mdssvc_fns = {
+ .setup = rpc_setup_mdssvc,
+ .init = rpc_mdssvc_init,
+ .shutdown = rpc_mdssvc_shutdown,
+};
+
+static_decl_rpc;
+NTSTATUS rpc_mdssvc_module_init(void)
+{
+ DBG_DEBUG("Registering mdsvc RPC service\n");
+
+ return register_rpc_module(&rpc_module_mdssvc_fns, "mdssvc");
+}
+
+
bool init_service_mdssvc(struct messaging_context *msg_ctx)
{
return mds_init(msg_ctx);
diff --git a/source3/rpc_server/rpc_modules.c b/source3/rpc_server/rpc_modules.c
new file mode 100644
index 0000000..69b5d03
--- /dev/null
+++ b/source3/rpc_server/rpc_modules.c
@@ -0,0 +1,138 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * SMBD RPC modules
+ *
+ * Copyright (c) 2015 Ralph Boehme <slow at samba.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+#include "rpc_server/rpc_modules.h"
+
+static struct rpc_module *rpc_modules;
+
+struct rpc_module {
+ struct rpc_module *prev, *next;
+ char *name;
+ struct rpc_module_fns *fns;
+};
+
+static struct rpc_module *find_rpc_module(const char *name)
+{
+ struct rpc_module *module = NULL;
+
+ for (module = rpc_modules; module != NULL; module = module->next) {
+ if (strequal(module->name, name)) {
+ return module;
+ }
+ }
+
+ return NULL;
+}
+
+NTSTATUS register_rpc_module(struct rpc_module_fns *fns,
+ const char *name)
+{
+ struct rpc_module *module = find_rpc_module(name);
+
+ if (module != NULL) {
+ DBG_ERR("RPC module %s already loaded!\n", name);
+ return NT_STATUS_OBJECT_NAME_COLLISION;
+ }
+
+ module = SMB_XMALLOC_P(struct rpc_module);
+ module->name = smb_xstrdup(name);
+ module->fns = fns;
+
+ DLIST_ADD(rpc_modules, module);
+ DBG_NOTICE("Successfully added RPC module '%s'\n", name);
+
+ return NT_STATUS_OK;
+}
+
+bool setup_rpc_module(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx,
+ const char *name)
+{
+ bool ok;
+ struct rpc_module *module = find_rpc_module(name);
+
+ if (module == NULL) {
+ return false;
+ }
+
+ ok = module->fns->setup(ev_ctx, msg_ctx);
+ if (!ok) {
+ DBG_ERR("calling setup for %s failed\n", name);
+ }
+
+ return true;
+}
+
+bool setup_rpc_modules(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx)
+{
+ bool ok;
+ struct rpc_module *module = rpc_modules;
+
+ for (module = rpc_modules; module; module = module->next) {
+ ok = module->fns->setup(ev_ctx, msg_ctx);
+ if (!ok) {
+ DBG_ERR("calling setup for %s failed\n", module->name);
+ }
+ }
+
+ return true;
+}
+
+bool init_rpc_module(const char *name,
+ const struct rpc_srv_callbacks *rpc_srv_cb)
+{
+ struct rpc_module *module = find_rpc_module(name);
+ NTSTATUS status;
+
+ if (module == NULL) {
+ return false;
+ }
+
+ status = module->fns->init(rpc_srv_cb);
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_ERR("calling init for %s failed %s\n",
+ name, nt_errstr(status));
+ return false;
+ }
+
+ return true;
+}
+
+bool shutdown_rpc_module(const char *name)
+{
+ struct rpc_module *module = find_rpc_module(name);
+ NTSTATUS status;
+
+ if (module == NULL) {
+ return false;
+ }
+
+ status = module->fns->shutdown();
+ if (!NT_STATUS_IS_OK(status)) {
+ DBG_ERR("calling shutdown for %s failed %s\n",
+ name, nt_errstr(status));
+ return false;
+ }
+
+ return true;
+}
diff --git a/source3/rpc_server/rpc_modules.h b/source3/rpc_server/rpc_modules.h
new file mode 100644
index 0000000..afac1d9
--- /dev/null
+++ b/source3/rpc_server/rpc_modules.h
@@ -0,0 +1,47 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * SMBD RPC modules
+ *
+ * Copyright (c) 2015 Ralph Boehme <slow at samba.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _RPC_MODULES_H
+#define _RPC_MODULES_H
+
+struct rpc_srv_callbacks;
+
+struct rpc_module_fns {
+ bool (*setup)(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx);
+ NTSTATUS (*init)(const struct rpc_srv_callbacks *rpc_srv_cb);
+ NTSTATUS (*shutdown)(void);
+};
+
+NTSTATUS register_rpc_module(struct rpc_module_fns *fns,
+ const char *name);
+
+bool setup_rpc_modules(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx);
+
+bool setup_rpc_module(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx,
+ const char *name);
+
+bool init_rpc_module(const char *name,
+ const struct rpc_srv_callbacks *rpc_srv_cb);
+
+bool shutdown_rpc_module(const char *name);
+#endif
diff --git a/source3/rpc_server/rpc_service_setup.c b/source3/rpc_server/rpc_service_setup.c
index ee995a8..e1625ee 100644
--- a/source3/rpc_server/rpc_service_setup.c
+++ b/source3/rpc_server/rpc_service_setup.c
@@ -38,14 +38,12 @@
#include "../librpc/gen_ndr/srv_spoolss.h"
#include "../librpc/gen_ndr/srv_svcctl.h"
#include "../librpc/gen_ndr/srv_wkssvc.h"
-#include "../librpc/gen_ndr/srv_mdssvc.h"
#include "printing/nt_printing_migrate_internal.h"
#include "rpc_server/eventlog/srv_eventlog_reg.h"
#include "rpc_server/svcctl/srv_svcctl_reg.h"
#include "rpc_server/spoolss/srv_spoolss_nt.h"
#include "rpc_server/svcctl/srv_svcctl_nt.h"
-#include "rpc_server/mdssvc/srv_mdssvc_nt.h"
#include "librpc/rpc/dcerpc_ep.h"
#include "rpc_server/rpc_sock_helper.h"
@@ -53,13 +51,16 @@
#include "rpc_server/rpc_ep_register.h"
#include "rpc_server/rpc_server.h"
#include "rpc_server/rpc_config.h"
+#include "rpc_server/rpc_modules.h"
#include "rpc_server/epmapper/srv_epmapper.h"
+static_decl_rpc;
+
/* Common routine for embedded RPC servers */
-static bool rpc_setup_embedded(struct tevent_context *ev_ctx,
- struct messaging_context *msg_ctx,
- const struct ndr_interface_table *t,
- const char *pipe_name)
+bool rpc_setup_embedded(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx,
+ const struct ndr_interface_table *t,
+ const char *pipe_name)
{
struct dcerpc_binding_vector *v;
enum rpc_service_mode_e epm_mode = rpc_epmapper_mode();
@@ -445,61 +446,12 @@ static bool rpc_setup_initshutdown(struct tevent_context *ev_ctx,
return rpc_setup_embedded(ev_ctx, msg_ctx, t, NULL);
}
-#ifdef WITH_SPOTLIGHT
-static bool mdssvc_init_cb(void *ptr)
-{
- struct messaging_context *msg_ctx =
- talloc_get_type_abort(ptr, struct messaging_context);
- bool ok;
-
- ok = init_service_mdssvc(msg_ctx);
- if (!ok) {
- return false;
- }
-
- return true;
-}
-
-static bool mdssvc_shutdown_cb(void *ptr)
-{
- shutdown_service_mdssvc();
-
- return true;
-}
-
-static bool rpc_setup_mdssvc(struct tevent_context *ev_ctx,
- struct messaging_context *msg_ctx)
-{
- const struct ndr_interface_table *t = &ndr_table_mdssvc;
- const char *pipe_name = "mdssvc";
- struct rpc_srv_callbacks mdssvc_cb;
- NTSTATUS status;
- enum rpc_service_mode_e service_mode = rpc_service_mode(t->name);
- enum rpc_daemon_type_e mdssvc_type = rpc_mdssd_daemon();
-
- if (service_mode != RPC_SERVICE_MODE_EMBEDDED
- || mdssvc_type != RPC_DAEMON_EMBEDDED) {
- return true;
- }
-
- mdssvc_cb.init = mdssvc_init_cb;
- mdssvc_cb.shutdown = mdssvc_shutdown_cb;
- mdssvc_cb.private_data = msg_ctx;
-
- status = rpc_mdssvc_init(&mdssvc_cb);
- if (!NT_STATUS_IS_OK(status)) {
- return false;
- }
-
- return rpc_setup_embedded(ev_ctx, msg_ctx, t, pipe_name);
-}
-#endif
-
bool dcesrv_ep_setup(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx)
{
TALLOC_CTX *tmp_ctx;
bool ok;
+ init_module_fn *mod_init_fns = NULL;
tmp_ctx = talloc_stackframe();
if (tmp_ctx == NULL) {
@@ -578,12 +530,27 @@ bool dcesrv_ep_setup(struct tevent_context *ev_ctx,
goto done;
}
-#ifdef WITH_SPOTLIGHT
- ok = rpc_setup_mdssvc(ev_ctx, msg_ctx);
+ /* Initialize static subsystems */
+ static_init_rpc;
+
+ /* Initialize shared modules */
+ mod_init_fns = load_samba_modules(tmp_ctx, "rpc");
+ if (mod_init_fns == NULL) {
+ DBG_ERR("Loading shared RPC modules failed\n");
+ goto done;
+ }
+
+ ok = run_init_functions(mod_init_fns);
if (!ok) {
+ DBG_ERR("Initializing shared RPC modules failed\n");
+ goto done;
+ }
+
+ ok = setup_rpc_modules(ev_ctx, msg_ctx);
+ if (!ok) {
+ DBG_ERR("Shared RPC modules setup failed\n");
goto done;
}
-#endif
done:
--
Samba Shared Repository
More information about the samba-cvs
mailing list