[SCM] Samba Shared Repository - branch master updated
Andreas Schneider
asn at samba.org
Mon Feb 21 16:08:02 MST 2011
The branch, master has been updated
via 8fce373 s3-rpc_server: Let enpoint mapper listen on port 135.
via 0abe7c6 s3-rpc_server: Added event and msg ctx to _rpc_ep_register.
via df5d265 s3-rpc_server: Added port option to _rpc_ep_register.
via a99e670 s3-rpc_server: Added function to setup tcpip listener!
via fc46ea9 s3-rpc_server: Rename srv_rpc_register.c.
via 116144a s3-rpc_server: Rename srv_rpc_register.
via 184702a s3-rpc_server: Pass tevent_context to dcerpc endpoints.
via 02b356d s3-rpc_server: Create a common ncacn listen state.
via 98fcbd0 s3-rpc_server: Rename named_pipe_read_packet().
via 59f7bcb s3-librpc: Only register NCACN_NP.
from debd6da s3-lsa: fix some uninitialized variables in our lsa server.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 8fce37331ed713ddfa40ed791bf43b904c426423
Author: Andreas Schneider <asn at samba.org>
Date: Mon Feb 21 09:58:26 2011 +0100
s3-rpc_server: Let enpoint mapper listen on port 135.
*** This is my commit #500 ***
Endpoint Mapper is disabled by default. The next steps are to setup a
tcpip and ncalrpc listener for each service and register it at epm.
Autobuild-User: Andreas Schneider <asn at cryptomilk.org>
Autobuild-Date: Tue Feb 22 00:07:45 CET 2011 on sn-devel-104
commit 0abe7c68c5623d4468609654dfde72c5ccce396e
Author: Andreas Schneider <asn at samba.org>
Date: Mon Feb 21 16:28:38 2011 +0100
s3-rpc_server: Added event and msg ctx to _rpc_ep_register.
commit df5d26521a9b0d2bbbe474ead03d1a0b0c7fabf2
Author: Andreas Schneider <asn at samba.org>
Date: Mon Feb 21 09:08:47 2011 +0100
s3-rpc_server: Added port option to _rpc_ep_register.
commit a99e670cd228e2a0d9070aa6541d29b63913fc8d
Author: Andreas Schneider <asn at samba.org>
Date: Mon Feb 14 10:29:14 2011 +0100
s3-rpc_server: Added function to setup tcpip listener!
commit fc46ea981f4953f4ec4850ac613635bde077c7d7
Author: Andreas Schneider <asn at samba.org>
Date: Thu Feb 17 12:24:41 2011 +0100
s3-rpc_server: Rename srv_rpc_register.c.
commit 116144a4d0f89c8a08fa21bae92d5f25b66282c5
Author: Andreas Schneider <asn at samba.org>
Date: Thu Feb 17 12:21:09 2011 +0100
s3-rpc_server: Rename srv_rpc_register.
commit 184702a43d7976041aaaf721b25c8eaca627259e
Author: Andreas Schneider <asn at samba.org>
Date: Thu Feb 17 12:18:45 2011 +0100
s3-rpc_server: Pass tevent_context to dcerpc endpoints.
commit 02b356d7a8f75e5ea431a29e33845df089ff7446
Author: Andreas Schneider <asn at samba.org>
Date: Tue Feb 15 12:57:26 2011 +0100
s3-rpc_server: Create a common ncacn listen state.
commit 98fcbd09757b7e9a59a554b4ce1b1097a6ad288a
Author: Andreas Schneider <asn at samba.org>
Date: Mon Feb 14 15:58:14 2011 +0100
s3-rpc_server: Rename named_pipe_read_packet().
This is not named pipe specific.
commit 59f7bcbc39cc412137b63b743ac19f11d4639b26
Author: Andreas Schneider <asn at samba.org>
Date: Mon Feb 21 17:55:52 2011 +0100
s3-librpc: Only register NCACN_NP.
This is the only transport we support at the moment.
-----------------------------------------------------------------------
Summary of changes:
source3/Makefile.in | 2 +-
source3/librpc/rpc/dcerpc_ep.c | 31 +-
.../{srv_rpc_register.c => rpc_ep_setup.c} | 288 ++++++++--
.../{srv_rpc_register.h => rpc_ep_setup.h} | 3 +-
source3/rpc_server/rpc_server.c | 625 +++++++++++++++++++-
source3/rpc_server/rpc_server.h | 6 +
source3/rpc_server/wscript_build | 2 +-
source3/smbd/server.c | 4 +-
8 files changed, 876 insertions(+), 85 deletions(-)
rename source3/rpc_server/{srv_rpc_register.c => rpc_ep_setup.c} (57%)
rename source3/rpc_server/{srv_rpc_register.h => rpc_ep_setup.h} (90%)
Changeset truncated at 500 lines:
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 686d04c..2f3575f 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -729,7 +729,7 @@ RPC_RPCECHO_OBJ = rpc_server/echo/srv_echo_nt.o librpc/gen_ndr/srv_echo.o
RPC_EPMAPPER_OBJ = rpc_server/epmapper/srv_epmapper.o librpc/gen_ndr/srv_epmapper.o
-RPC_SERVER_REGISTER_OBJ = rpc_server/srv_rpc_register.o $(DCE_RPC_EP_OBJ)
+RPC_SERVER_REGISTER_OBJ = rpc_server/rpc_ep_setup.o $(DCE_RPC_EP_OBJ)
RPC_SERVER_OBJ = $(RPC_LSARPC_OBJ) $(RPC_WINREG_OBJ) $(RPC_INITSHUTDOWN_OBJ) \
$(RPC_DSSETUP_OBJ) $(RPC_WKSSVC_OBJ) $(RPC_SVCCTL_OBJ) \
diff --git a/source3/librpc/rpc/dcerpc_ep.c b/source3/librpc/rpc/dcerpc_ep.c
index cfbe0ab..37d69b0 100644
--- a/source3/librpc/rpc/dcerpc_ep.c
+++ b/source3/librpc/rpc/dcerpc_ep.c
@@ -29,7 +29,9 @@ NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx,
struct dcerpc_binding_vector **pbvec)
{
struct dcerpc_binding_vector *bvec;
- uint32_t ep_count, i;
+ uint32_t ep_count;
+ uint32_t count = 0;
+ uint32_t i;
NTSTATUS status;
TALLOC_CTX *tmp_ctx;
@@ -68,17 +70,28 @@ NTSTATUS dcerpc_binding_vector_create(TALLOC_CTX *mem_ctx,
}
b->object = iface->syntax_id;
- if (b->transport == NCACN_NP) {
- b->host = talloc_asprintf(b, "\\\\%s", global_myname());
- if (b->host == NULL) {
- status = NT_STATUS_NO_MEMORY;
- goto done;
- }
+
+ switch (b->transport) {
+ case NCACN_NP:
+ b->host = talloc_asprintf(b, "\\\\%s", global_myname());
+ if (b->host == NULL) {
+ status = NT_STATUS_NO_MEMORY;
+ goto done;
+ }
+ break;
+ case NCACN_IP_TCP:
+ /* TODO */
+ case NCALRPC:
+ /* TODO */
+ default:
+ continue;
}
- bvec->bindings[i] = *b;
+ bvec->bindings[count] = *b;
+ count++;
}
- bvec->count = ep_count;
+
+ bvec->count = count;
*pbvec = talloc_move(mem_ctx, &bvec);
diff --git a/source3/rpc_server/srv_rpc_register.c b/source3/rpc_server/rpc_ep_setup.c
similarity index 57%
rename from source3/rpc_server/srv_rpc_register.c
rename to source3/rpc_server/rpc_ep_setup.c
index 9d213ec..e8640fa 100644
--- a/source3/rpc_server/srv_rpc_register.c
+++ b/source3/rpc_server/rpc_ep_setup.c
@@ -43,10 +43,82 @@
#include "librpc/rpc/dcerpc_ep.h"
-#include "rpc_server/srv_rpc_register.h"
+#include "rpc_server/rpc_ep_setup.h"
+#include "rpc_server/rpc_server.h"
+
+struct dcesrv_ep_context {
+ struct tevent_context *ev_ctx;
+ struct messaging_context *msg_ctx;
+};
+
+static uint16_t _open_sockets(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx,
+ struct ndr_syntax_id syntax_id,
+ uint16_t port)
+{
+ uint32_t num_ifs = iface_count();
+ uint32_t i;
+ uint16_t p = 0;
+
+ if (lp_interfaces() && lp_bind_interfaces_only()) {
+ /*
+ * We have been given an interfaces line, and been told to only
+ * bind to those interfaces. Create a socket per interface and
+ * bind to only these.
+ */
+
+ /* Now open a listen socket for each of the interfaces. */
+ for(i = 0; i < num_ifs; i++) {
+ const struct sockaddr_storage *ifss =
+ iface_n_sockaddr_storage(i);
+
+ p = setup_dcerpc_ncacn_tcpip_socket(ev_ctx,
+ msg_ctx,
+ syntax_id,
+ ifss,
+ port);
+ if (p == 0) {
+ return 0;
+ }
+ port = p;
+ }
+ } else {
+ const char *sock_addr = lp_socket_address();
+ const char *sock_ptr;
+ char *sock_tok;
+
+ for (sock_ptr = sock_addr;
+ next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,");
+ ) {
+ struct sockaddr_storage ss;
+
+ /* open an incoming socket */
+ if (!interpret_string_addr(&ss,
+ sock_tok,
+ AI_NUMERICHOST|AI_PASSIVE)) {
+ continue;
+ }
+
+ p = setup_dcerpc_ncacn_tcpip_socket(ev_ctx,
+ msg_ctx,
+ syntax_id,
+ &ss,
+ port);
+ if (p == 0) {
+ return 0;
+ }
+ port = p;
+ }
+ }
+
+ return p;
+}
-static NTSTATUS _rpc_ep_register(const struct ndr_interface_table *iface,
- const char *name)
+static NTSTATUS _rpc_ep_register(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx,
+ const struct ndr_interface_table *iface,
+ const char *name,
+ uint16_t port)
{
struct dcerpc_binding_vector *v = NULL;
NTSTATUS status;
@@ -109,9 +181,33 @@ static NTSTATUS _rpc_ep_unregister(const struct ndr_interface_table *iface)
return status;
}
+static bool epmapper_init_cb(void *ptr)
+{
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+ uint16_t port;
+
+ port = _open_sockets(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ ndr_table_epmapper.syntax_id,
+ 135);
+ if (port == 135) {
+ return true;
+ }
+
+ return false;
+}
+
static bool winreg_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_winreg, "winreg"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_winreg,
+ "winreg",
+ 0));
}
static bool winreg_shutdown_cb(void *ptr)
@@ -121,7 +217,14 @@ static bool winreg_shutdown_cb(void *ptr)
static bool srvsvc_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_srvsvc, "srvsvc"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_srvsvc,
+ "srvsvc",
+ 0));
}
static bool srvsvc_shutdown_cb(void *ptr)
@@ -131,7 +234,14 @@ static bool srvsvc_shutdown_cb(void *ptr)
static bool lsarpc_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_lsarpc, "lsarpc"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_lsarpc,
+ "lsarpc",
+ 0));
}
static bool lsarpc_shutdown_cb(void *ptr)
@@ -141,7 +251,14 @@ static bool lsarpc_shutdown_cb(void *ptr)
static bool samr_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_samr, "samr"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_samr,
+ "samr",
+ 0));
}
static bool samr_shutdown_cb(void *ptr)
@@ -151,7 +268,14 @@ static bool samr_shutdown_cb(void *ptr)
static bool netlogon_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_netlogon, "netlogon"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_netlogon,
+ "netlogon",
+ 0));
}
static bool netlogon_shutdown_cb(void *ptr)
@@ -161,20 +285,24 @@ static bool netlogon_shutdown_cb(void *ptr)
static bool spoolss_init_cb(void *ptr)
{
- struct messaging_context *msg_ctx = talloc_get_type_abort(
- ptr, struct messaging_context);
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
NTSTATUS status;
bool ok;
/*
* Migrate the printers first.
*/
- ok = nt_printing_tdb_migrate(msg_ctx);
+ ok = nt_printing_tdb_migrate(ep_ctx->msg_ctx);
if (!ok) {
return false;
}
- status =_rpc_ep_register(&ndr_table_spoolss, "spoolss");
+ status =_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_spoolss,
+ "spoolss",
+ 0);
if (!NT_STATUS_IS_OK(status)) {
return false;
}
@@ -193,11 +321,11 @@ static bool spoolss_shutdown_cb(void *ptr)
static bool svcctl_init_cb(void *ptr)
{
- struct messaging_context *msg_ctx = talloc_get_type_abort(
- ptr, struct messaging_context);
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
bool ok;
- ok = svcctl_init_winreg(msg_ctx);
+ ok = svcctl_init_winreg(ep_ctx->msg_ctx);
if (!ok) {
return false;
}
@@ -205,7 +333,11 @@ static bool svcctl_init_cb(void *ptr)
/* initialize the control hooks */
init_service_op_table();
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_svcctl, "svcctl"));
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_svcctl,
+ "svcctl",
+ 0));
}
static bool svcctl_shutdown_cb(void *ptr)
@@ -217,7 +349,14 @@ static bool svcctl_shutdown_cb(void *ptr)
static bool ntsvcs_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_ntsvcs, "ntsvcs"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_ntsvcs,
+ "ntsvcs",
+ 0));
}
static bool ntsvcs_shutdown_cb(void *ptr)
@@ -227,17 +366,20 @@ static bool ntsvcs_shutdown_cb(void *ptr)
static bool eventlog_init_cb(void *ptr)
{
- struct messaging_context *msg_ctx = talloc_get_type_abort(
- ptr, struct messaging_context);
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
NTSTATUS status;
- status =_rpc_ep_register(&ndr_table_eventlog,
- "eventlog");
+ status =_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_eventlog,
+ "eventlog",
+ 0);
if (!NT_STATUS_IS_OK(status)) {
return false;
}
- return eventlog_init_winreg(msg_ctx);
+ return eventlog_init_winreg(ep_ctx->msg_ctx);
}
static bool eventlog_shutdown_cb(void *ptr)
@@ -247,8 +389,14 @@ static bool eventlog_shutdown_cb(void *ptr)
static bool initshutdown_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_initshutdown,
- "initshutdown"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_initshutdown,
+ "initshutdown",
+ 0));
}
static bool initshutdown_shutdown_cb(void *ptr)
@@ -257,7 +405,14 @@ static bool initshutdown_shutdown_cb(void *ptr)
}
#ifdef DEVELOPER
static bool rpcecho_init_cb(void *ptr) {
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_rpcecho, "rpcecho"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_rpcecho,
+ "rpcecho",
+ 0));
}
static bool rpcecho_shutdown_cb(void *ptr)
@@ -267,30 +422,59 @@ static bool rpcecho_shutdown_cb(void *ptr)
#endif
static bool netdfs_init_cb(void *ptr)
{
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_netdfs, "netdfs"));
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_netdfs,
+ "netdfs",
+ 0));
}
static bool netdfs_shutdown_cb(void *ptr) {
return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_netdfs));
}
-static bool dssetup_init_cb(void *ptr) {
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_dssetup, "dssetup"));
+static bool dssetup_init_cb(void *ptr)
+{
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_dssetup,
+ "dssetup",
+ 0));
}
static bool dssetup_shutdown_cb(void *ptr) {
return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_dssetup));
}
-static bool wkssvc_init_cb(void *ptr) {
- return NT_STATUS_IS_OK(_rpc_ep_register(&ndr_table_wkssvc, "wkssvc"));
+static bool wkssvc_init_cb(void *ptr)
+{
+ struct dcesrv_ep_context *ep_ctx =
+ talloc_get_type_abort(ptr, struct dcesrv_ep_context);
+
+ return NT_STATUS_IS_OK(_rpc_ep_register(ep_ctx->ev_ctx,
+ ep_ctx->msg_ctx,
+ &ndr_table_wkssvc,
+ "wkssvc",
+ 0));
}
static bool wkssvc_shutdown_cb(void *ptr) {
return NT_STATUS_IS_OK(_rpc_ep_unregister(&ndr_table_wkssvc));
}
-bool srv_rpc_register(struct messaging_context *msg_ctx) {
+bool dcesrv_ep_setup(struct tevent_context *ev_ctx,
+ struct messaging_context *msg_ctx)
+{
+ struct dcesrv_ep_context *ep_ctx;
+
+ struct rpc_srv_callbacks epmapper_cb;
+
struct rpc_srv_callbacks winreg_cb;
struct rpc_srv_callbacks srvsvc_cb;
@@ -312,26 +496,38 @@ bool srv_rpc_register(struct messaging_context *msg_ctx) {
const char *rpcsrv_type;
+ ep_ctx = talloc(ev_ctx, struct dcesrv_ep_context);
+ if (ep_ctx == NULL) {
+ return false;
+ }
+
+ ep_ctx->ev_ctx = ev_ctx;
+ ep_ctx->msg_ctx = msg_ctx;
+
/* start endpoint mapper only if enabled */
rpcsrv_type = lp_parm_const_string(GLOBAL_SECTION_SNUM,
"rpc_server", "epmapper",
"none");
if (StrCaseCmp(rpcsrv_type, "embedded") == 0) {
- if (!NT_STATUS_IS_OK(rpc_epmapper_init(NULL))) {
+ epmapper_cb.init = epmapper_init_cb;
+ epmapper_cb.shutdown = NULL;
+ epmapper_cb.private_data = ep_ctx;
+
+ if (!NT_STATUS_IS_OK(rpc_epmapper_init(&epmapper_cb))) {
return false;
}
}
winreg_cb.init = winreg_init_cb;
winreg_cb.shutdown = winreg_shutdown_cb;
- winreg_cb.private_data = NULL;
+ winreg_cb.private_data = ep_ctx;
if (!NT_STATUS_IS_OK(rpc_winreg_init(&winreg_cb))) {
return false;
}
srvsvc_cb.init = srvsvc_init_cb;
srvsvc_cb.shutdown = srvsvc_shutdown_cb;
- srvsvc_cb.private_data = NULL;
+ srvsvc_cb.private_data = ep_ctx;
if (!NT_STATUS_IS_OK(rpc_srvsvc_init(&srvsvc_cb))) {
return false;
}
@@ -339,28 +535,28 @@ bool srv_rpc_register(struct messaging_context *msg_ctx) {
lsarpc_cb.init = lsarpc_init_cb;
--
Samba Shared Repository
More information about the samba-cvs
mailing list