From 7e6cf43756b7643e2f0ee7ada5076f36f3a24bb7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 8 Jan 2004 22:55:27 +0000 Subject: This patch adds a better dcerpc server infastructure. 1.) We now register endpoint servers add startup via register_backend() and later use the smb.conf 'dcerpc endpoint servers' parameter to setup the dcesrv_context 2.) each endpoint server can register at context creation time as much interfaces as it wants (multiple interfaces on one endpoint are supported!) (NOTE: there's a difference between 'endpoint server' and 'endpoint'! for details look at rpc_server/dcesrv_server.h) 3.) one endpoint can have a security descriptor registered to it self this will be checked in the future when a client wants to connect to an smb pipe endpoint. 4.) we now have a 'remote' endpoint server, which works like the ntvfs_cifs module it takes this options in the [globals] section: dcerpc remote:interfaces = srvsvc, winreg, w32time, epmapper dcerpc remote:binding = ... dcerpc remote:user = ... dcerpc remote:password = ... 5.) we currently have tree endpoint servers: epmapper, rpcecho and remote the default for the 'dcerpc endpiont servers = epmapper, rpcecho' for testing you can also do dcerpc endpoint servers = rpcecho, remote, epmapper dcerpc remote:interfaces = srvsvc, samr, netlogon 6,) please notice the the epmapper now only returns NO_ENTRIES (but I think we'll find a solution for this too:-) 7.) also there're some other stuff left, but step by step :-) This patch also includes updates for the register_subsystem() , ntvfs_init(), and some other funtions to check for duplicate subsystem registration metze (hmmm, my first large commit...I hope it works as supposed :-) (This used to be commit 917e45dafd5be4c2cd90ff425b8d6f8403122349) --- source4/rpc_server/remote/dcesrv_remote.c | 198 ++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 source4/rpc_server/remote/dcesrv_remote.c (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c new file mode 100644 index 0000000000..381c79135c --- /dev/null +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -0,0 +1,198 @@ +/* + Unix SMB/CIFS implementation. + remote dcerpc operations + + Copyright (C) Stefan (metze) Metzmacher 2004 + + 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +struct dcesrv_remote_private { + struct dcerpc_pipe *c_pipe; + void *private; +}; + +static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface) +{ + NTSTATUS status; + struct dcesrv_remote_private *private; + const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); + const char *print_debug = lp_parm_string(-1, "dcerpc_remote", "print_debug"); + + if (!binding) { + printf("You must specify a ncacn binding string\n"); + return NT_STATUS_INVALID_PARAMETER; + } + + private = talloc_p(dce_call->conn->mem_ctx, struct dcesrv_remote_private); + if (!private) { + return NT_STATUS_NO_MEMORY; + } + + status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->ndr->uuid, iface->ndr->if_version, + lp_workgroup(), + lp_parm_string(-1, "dcerpc_remote", "username"), + lp_parm_string(-1, "dcerpc_remote", "password")); + + if (print_debug && strcasecmp("yes",print_debug) == 0) { + private->c_pipe->flags |= DCERPC_DEBUG_PRINT_BOTH; + } + + dce_call->conn->private = private; + + return NT_STATUS_OK; +} + +static void remote_op_unbind(struct dcesrv_connection *dce_conn, const struct dcesrv_interface *iface) +{ + struct dcesrv_remote_private *private = dce_conn->private; + + dcerpc_pipe_close(private->c_pipe); + + return; +} + +static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) +{ + struct dcesrv_remote_private *private = dce_call->conn->private; + NTSTATUS status; + uint16 opnum = dce_call->pkt.u.request.opnum; + ndr_push_flags_fn_t ndr_push_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_push; + ndr_pull_flags_fn_t ndr_pull_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_pull; + size_t struct_size = dce_call->conn->iface->ndr->calls[opnum].struct_size; + + status = dcerpc_ndr_request(private->c_pipe, opnum, mem_ctx, + (ndr_push_flags_fn_t) ndr_push_fn, + (ndr_pull_flags_fn_t) ndr_pull_fn, + r, struct_size); + + return status; +} + +static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const struct dcesrv_interface *iface) +{ + int i; + + for (i=0;indr->endpoints->count;i++) { + NTSTATUS ret; + const char *name = iface->ndr->endpoints->names[i]; + + ret = dcesrv_interface_register(dce_ctx, name, iface, NULL); + if (!NT_STATUS_IS_OK(ret)) { + DEBUG(1,("remote_op_init_server: failed to register endpoint '%s'\n",name)); + return ret; + } + } + + return NT_STATUS_OK; +} + +static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) +{ + int i; + char **ifaces = str_list_make(lp_parm_string(-1,"dcerpc_remote","interfaces"),NULL); + + if (!ifaces) { + DEBUG(3,("remote_op_init_server: no interfaces configured\n")); + return NT_STATUS_OK; + } + + for (i=0;ifaces[i];i++) { + NTSTATUS ret; + struct dcesrv_interface iface; + + if (!ep_server->interface_by_name(&iface, ifaces[i])) { + DEBUG(0,("remote_op_init_server: failed to find interface = '%s'\n", ifaces[i])); + str_list_free(&ifaces); + return NT_STATUS_UNSUCCESSFUL; + } + + ret = remote_register_one_iface(dce_ctx, &iface); + if (!NT_STATUS_IS_OK(ret)) { + DEBUG(0,("remote_op_init_server: failed to register interface = '%s'\n", ifaces[i])); + str_list_free(&ifaces); + return ret; + } + } + + str_list_free(&ifaces); + return NT_STATUS_OK; +} + +static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct dcerpc_interface_table *if_tabl) +{ + iface->ndr = if_tabl; + + iface->bind = remote_op_bind; + iface->unbind = remote_op_unbind; + iface->dispatch = remote_op_dispatch; + + return True; +} + +static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32 if_version) +{ + int i; + + for (i=0;dcerpc_pipes[i];i++) { + if (dcerpc_pipes[i]->if_version == if_version && + strcmp(dcerpc_pipes[i]->uuid, uuid)==0) { + return remote_fill_interface(iface, dcerpc_pipes[i]); + } + } + + return False; +} + +static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) +{ + int i; + + for (i=0;dcerpc_pipes[i];i++) { + if (strcmp(dcerpc_pipes[i]->name, name)==0) { + return remote_fill_interface(iface, dcerpc_pipes[i]); + } + } + + return False; +} + +NTSTATUS dcerpc_remote_init(void) +{ + NTSTATUS ret; + struct dcesrv_endpoint_server ep_server; + + ZERO_STRUCT(ep_server); + + /* fill in our name */ + ep_server.name = "remote"; + + /* fill in all the operations */ + ep_server.init_server = remote_op_init_server; + + ep_server.interface_by_uuid = remote_op_interface_by_uuid; + ep_server.interface_by_name = remote_op_interface_by_name; + + /* register ourselves with the NTVFS subsystem. */ + ret = register_backend("dcerpc", &ep_server); + if (!NT_STATUS_IS_OK(ret)) { + DEBUG(0,("Failed to register 'remote' endpoint server!\n")); + return ret; + } + + return ret; +} -- cgit From 894e02f80c254da4edca5dbae99561d205c63fbe Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 2 Feb 2004 13:28:29 +0000 Subject: some DEBUG and comment fixes metze (This used to be commit 5ac4f878687eb0fa95a2e5830a8372168a27d3b3) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 381c79135c..2ca7fe326f 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -187,7 +187,7 @@ NTSTATUS dcerpc_remote_init(void) ep_server.interface_by_uuid = remote_op_interface_by_uuid; ep_server.interface_by_name = remote_op_interface_by_name; - /* register ourselves with the NTVFS subsystem. */ + /* register ourselves with the DCERPC subsystem. */ ret = register_backend("dcerpc", &ep_server); if (!NT_STATUS_IS_OK(ret)) { DEBUG(0,("Failed to register 'remote' endpoint server!\n")); -- cgit From 0b4da9d7e069a5e32d9706ee12cde7fe7625270d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 3 Feb 2004 14:56:07 +0000 Subject: - add 'print' to the DCERPC binding strings e.g. ncacn_np:myserver:[samr,sign,print] will now enable the packet debugging and the debugging is not bound anymore to the debuglevel >= 2 in the torture tests - also the dcesrv_remote module now supports debugging of the packets use the 'dcerpc_remote:binding' smb.conf parameter. metze (This used to be commit 40abf3c584efed7f977ddd688ea064540e5a5b13) --- source4/rpc_server/remote/dcesrv_remote.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 2ca7fe326f..710c2f514a 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -31,7 +31,6 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; struct dcesrv_remote_private *private; const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); - const char *print_debug = lp_parm_string(-1, "dcerpc_remote", "print_debug"); if (!binding) { printf("You must specify a ncacn binding string\n"); @@ -48,10 +47,6 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct lp_parm_string(-1, "dcerpc_remote", "username"), lp_parm_string(-1, "dcerpc_remote", "password")); - if (print_debug && strcasecmp("yes",print_debug) == 0) { - private->c_pipe->flags |= DCERPC_DEBUG_PRINT_BOTH; - } - dce_call->conn->private = private; return NT_STATUS_OK; @@ -71,15 +66,30 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT struct dcesrv_remote_private *private = dce_call->conn->private; NTSTATUS status; uint16 opnum = dce_call->pkt.u.request.opnum; + const char *name = dce_call->conn->iface->ndr->calls[opnum].name; ndr_push_flags_fn_t ndr_push_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_push; ndr_pull_flags_fn_t ndr_pull_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_pull; + ndr_print_function_t ndr_print_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_print; size_t struct_size = dce_call->conn->iface->ndr->calls[opnum].struct_size; + if (private->c_pipe->flags & DCERPC_DEBUG_PRINT_IN) { + ndr_print_function_debug(ndr_print_fn, name, NDR_IN | NDR_SET_VALUES, r); + } + status = dcerpc_ndr_request(private->c_pipe, opnum, mem_ctx, (ndr_push_flags_fn_t) ndr_push_fn, (ndr_pull_flags_fn_t) ndr_pull_fn, r, struct_size); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("dcesrv_remote: call[%s] failed with: %s!\n",name, nt_errstr(status))); + return status; + } + + if (NT_STATUS_IS_OK(status) && (private->c_pipe->flags & DCERPC_DEBUG_PRINT_OUT)) { + ndr_print_function_debug(ndr_print_fn, name, NDR_OUT, r); + } + return status; } -- cgit From f9d8f8843dc0ab8c9d59abde7222e0f118b86b5d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 25 May 2004 16:24:13 +0000 Subject: r884: convert samba4 to use [u]int32_t instead of [u]int32 metze (This used to be commit 0e5517d937a2eb7cf707991d1c7498c1ab456095) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 710c2f514a..7856908236 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -154,7 +154,7 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct d return True; } -static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32 if_version) +static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32_t if_version) { int i; -- cgit From f88bf54c7f6d1c2ef833047eb8327953c304b5ff Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 25 May 2004 17:24:24 +0000 Subject: r889: convert samba4 to use [u]int16_t instead of [u]int16 metze (This used to be commit af6f1f8a01bebbecd99bc8c066519e89966e65e3) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 7856908236..37fa89f175 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -65,7 +65,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT { struct dcesrv_remote_private *private = dce_call->conn->private; NTSTATUS status; - uint16 opnum = dce_call->pkt.u.request.opnum; + uint16_t opnum = dce_call->pkt.u.request.opnum; const char *name = dce_call->conn->iface->ndr->calls[opnum].name; ndr_push_flags_fn_t ndr_push_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_push; ndr_pull_flags_fn_t ndr_pull_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_pull; -- cgit From d79c7d41da373dea7f95506c178b18f0dd896043 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 25 Sep 2004 11:24:10 +0000 Subject: r2627: use the new talloc capabilities in a bunch more places in the rpc server code. This fixes a number of memory leaks I found when testing with valgrind and smbtorture, as the cascading effect of a talloc_free() ensures that anything derived from the top level object is destroyed on disconnect. (This used to be commit 76d0b8206ce64d6ff4a192979c43dddbec726d6e) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 37fa89f175..b2b0ae824c 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -37,7 +37,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_INVALID_PARAMETER; } - private = talloc_p(dce_call->conn->mem_ctx, struct dcesrv_remote_private); + private = talloc_p(dce_call->conn, struct dcesrv_remote_private); if (!private) { return NT_STATUS_NO_MEMORY; } -- cgit From c051779a0a34a9c40a5425fb1eb821983b8dc852 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 2 Nov 2004 07:42:47 +0000 Subject: r3468: split out dcerpc_server.h (This used to be commit 729e0026e4408f74f140375537d4fe48c1fc3242) --- source4/rpc_server/remote/dcesrv_remote.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index b2b0ae824c..fc080bc59a 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -20,6 +20,7 @@ */ #include "includes.h" +#include "rpc_server/dcerpc_server.h" struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; -- cgit From 02785df1b06647f1adaaac3c93f363ec5070a941 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 3 Nov 2004 00:38:05 +0000 Subject: r3497: removed some include cruft, and split out librpc/gen_ndr/tables.h (This used to be commit 7dd3a5a6dadb0edc4fad56deba84f24b1e6dd2bc) --- source4/rpc_server/remote/dcesrv_remote.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index fc080bc59a..ca67ac974e 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -21,6 +21,7 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" +#include "librpc/gen_ndr/tables.h" struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; -- cgit From 6d3c74a67b935f348777feb3fac7653a9c4277a8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 3 Nov 2004 20:32:28 +0000 Subject: r3513: Add (the infrastructure for) DCOM support. Contents: - Support for sending over the object UUID in DCERPC calls - Simple torture test for the DCOM "Simple" object - Generate extra argument for "object" interfaces in pidl - Some stubs for common DCOM functions (This used to be commit c052f2e1edd816206d8974af3140cec7ef97a70c) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index ca67ac974e..7bb461bd6f 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -78,7 +78,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT ndr_print_function_debug(ndr_print_fn, name, NDR_IN | NDR_SET_VALUES, r); } - status = dcerpc_ndr_request(private->c_pipe, opnum, mem_ctx, + status = dcerpc_ndr_request(private->c_pipe, NULL, opnum, mem_ctx, (ndr_push_flags_fn_t) ndr_push_fn, (ndr_pull_flags_fn_t) ndr_pull_fn, r, struct_size); -- cgit From 71db46ea665606384f2be1be708c74c97c9adfb2 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Nov 2004 23:23:15 +0000 Subject: r3586: Fix some of the issues with the module init functions. Both subsystems and modules can now have init functions, which can be specified in .mk files (INIT_FUNCTION = ...) The build system will define : - SUBSYSTEM_init_static_modules that calls the init functions of all statically compiled modules. Failing to load will generate an error which is not fatal - BINARY_init_subsystems that calls the init functions (if defined) for the subsystems the binary depends on This removes the hack with the "static bool Initialised = " and the "lazy_init" functions (This used to be commit 7a8244761bfdfdfb48f8264d76951ebdfbf7bd8a) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 7bb461bd6f..fbd6f65a1a 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -183,7 +183,7 @@ static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const ch return False; } -NTSTATUS dcerpc_remote_init(void) +NTSTATUS dcerpc_server_remote_init(void) { NTSTATUS ret; struct dcesrv_endpoint_server ep_server; -- cgit From 31ded4901b4529ad2e49871502cab5ecba71483a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 14 Nov 2004 22:23:23 +0000 Subject: r3737: - Get rid of the register_subsystem() and register_backend() functions. - Re-disable tdbtool (it was building fine on my Debian box but other machines were having problems) (This used to be commit 0d7bb2c40b7a9ed59df3f8944133ea562697e814) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index fbd6f65a1a..957f5aa1b2 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -200,7 +200,7 @@ NTSTATUS dcerpc_server_remote_init(void) ep_server.interface_by_name = remote_op_interface_by_name; /* register ourselves with the DCERPC subsystem. */ - ret = register_backend("dcerpc", &ep_server); + ret = dcerpc_register_ep_server(&ep_server); if (!NT_STATUS_IS_OK(ret)) { DEBUG(0,("Failed to register 'remote' endpoint server!\n")); return ret; -- cgit From 46badf19089668e470e9bb5b2300017f8948b49e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 16 Nov 2004 21:07:08 +0000 Subject: r3790: use a registration function that is called from dcerpc_*_init functions rather then a large table in librpc/gen_ndr/tables.c. This will allow us to only link in only the required gen_ndr files (speeds up linking quite a bit, makes binaries smaller). Each gen_ndr_* file now has a init function that calls the init functions of the interfaces it contains. I did it this way to keep pidl's code simple, though it might hurt startup time a bit. I'd be happy to change it if people like one function better. (This used to be commit 3c436590ae95b58ad6d00e72d6fdd08a4d80f208) --- source4/rpc_server/remote/dcesrv_remote.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 957f5aa1b2..1ea6c1e4ea 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -21,7 +21,6 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" -#include "librpc/gen_ndr/tables.h" struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; @@ -158,12 +157,12 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct d static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32_t if_version) { - int i; + struct dcerpc_interface_list *l; - for (i=0;dcerpc_pipes[i];i++) { - if (dcerpc_pipes[i]->if_version == if_version && - strcmp(dcerpc_pipes[i]->uuid, uuid)==0) { - return remote_fill_interface(iface, dcerpc_pipes[i]); + for (l=dcerpc_pipes;l;l=l->next) { + if (l->table->if_version == if_version && + strcmp(l->table->uuid, uuid)==0) { + return remote_fill_interface(iface, l->table); } } @@ -172,11 +171,11 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const ch static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) { - int i; + struct dcerpc_interface_list *l; - for (i=0;dcerpc_pipes[i];i++) { - if (strcmp(dcerpc_pipes[i]->name, name)==0) { - return remote_fill_interface(iface, dcerpc_pipes[i]); + for (l=dcerpc_pipes;l;l=l->next) { + if (strcmp(l->table->name, name)==0) { + return remote_fill_interface(iface, l->table); } } -- cgit From 9b50dba87e7c668aac4aa7ba7b72ed20a50a95bc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 7 Dec 2004 09:26:00 +0000 Subject: r4086: - make dcerpc_ndr_request_table_send() the default and rename it to just dcerpc_ndr_request_send() - this allows us to call dcerpc_log_packet() when we receive a packet we can't parse correctly metze (This used to be commit a7a6cea112a180a28188997ca99f30d8dd286bb8) --- source4/rpc_server/remote/dcesrv_remote.c | 38 +++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 1ea6c1e4ea..ab09920b99 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -65,33 +65,37 @@ static void remote_op_unbind(struct dcesrv_connection *dce_conn, const struct dc static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) { struct dcesrv_remote_private *private = dce_call->conn->private; - NTSTATUS status; uint16_t opnum = dce_call->pkt.u.request.opnum; - const char *name = dce_call->conn->iface->ndr->calls[opnum].name; - ndr_push_flags_fn_t ndr_push_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_push; - ndr_pull_flags_fn_t ndr_pull_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_pull; - ndr_print_function_t ndr_print_fn = dce_call->conn->iface->ndr->calls[opnum].ndr_print; - size_t struct_size = dce_call->conn->iface->ndr->calls[opnum].struct_size; + const struct dcerpc_interface_call *call; + const char *name; + + if (opnum >= dce_call->conn->iface->ndr->num_calls) { + dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR; + return NT_STATUS_NET_WRITE_FAULT; + } + + name = dce_call->conn->iface->ndr->calls[opnum].name; + call = &dce_call->conn->iface->ndr->calls[opnum]; if (private->c_pipe->flags & DCERPC_DEBUG_PRINT_IN) { - ndr_print_function_debug(ndr_print_fn, name, NDR_IN | NDR_SET_VALUES, r); + ndr_print_function_debug(call->ndr_print, name, NDR_IN | NDR_SET_VALUES, r); } - status = dcerpc_ndr_request(private->c_pipe, NULL, opnum, mem_ctx, - (ndr_push_flags_fn_t) ndr_push_fn, - (ndr_pull_flags_fn_t) ndr_pull_fn, - r, struct_size); + /* we didn't use the return code of this function as we only check the last_fault_code */ + dcerpc_ndr_request(private->c_pipe, NULL, dce_call->conn->iface->ndr, + opnum, mem_ctx,r); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(0,("dcesrv_remote: call[%s] failed with: %s!\n",name, nt_errstr(status))); - return status; + dce_call->fault_code = private->c_pipe->last_fault_code; + if (dce_call->fault_code != 0) { + DEBUG(0,("dcesrv_remote: call[%s] failed with: %s!\n",name, dcerpc_errstr(mem_ctx, dce_call->fault_code))); + return NT_STATUS_NET_WRITE_FAULT; } - if (NT_STATUS_IS_OK(status) && (private->c_pipe->flags & DCERPC_DEBUG_PRINT_OUT)) { - ndr_print_function_debug(ndr_print_fn, name, NDR_OUT, r); + if ((dce_call->fault_code == 0) && (private->c_pipe->flags & DCERPC_DEBUG_PRINT_OUT)) { + ndr_print_function_debug(call->ndr_print, name, NDR_OUT, r); } - return status; + return NT_STATUS_OK; } static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const struct dcesrv_interface *iface) -- cgit From bb072199b14c0e877360475eefb89021e7ec0bcf Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 20 Dec 2004 14:37:54 +0000 Subject: r4288: don't use struct dcerpc_interface_table anymore in the main rpc server code. let the backends specify a ndr_push/ndr_pull function like we already do with the dispatch() function. this allows an interface implmentation to work as real proxy without needing to know the idl for an interface that means just the plain decrypted payload can be forwarded If someone want to write such a backend, patches are wellcome metze (This used to be commit a150bdf140d9165a05cbc7cac40b6e3c03a7bd3c) --- source4/rpc_server/remote/dcesrv_remote.c | 83 +++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 16 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index ab09920b99..3bf917ac71 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -24,7 +24,6 @@ struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; - void *private; }; static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface) @@ -34,7 +33,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); if (!binding) { - printf("You must specify a ncacn binding string\n"); + DEBUG(0,("You must specify a ncacn binding string\n")); return NT_STATUS_INVALID_PARAMETER; } @@ -43,10 +42,13 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_NO_MEMORY; } - status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->ndr->uuid, iface->ndr->if_version, + status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->uuid, iface->if_version, lp_workgroup(), lp_parm_string(-1, "dcerpc_remote", "username"), lp_parm_string(-1, "dcerpc_remote", "password")); + if (!NT_STATUS_IS_OK(status)) { + return status; + } dce_call->conn->private = private; @@ -62,28 +64,53 @@ static void remote_op_unbind(struct dcesrv_connection *dce_conn, const struct dc return; } -static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) +static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r) { - struct dcesrv_remote_private *private = dce_call->conn->private; + NTSTATUS status; + const struct dcerpc_interface_table *table = dce_call->conn->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; - const struct dcerpc_interface_call *call; - const char *name; - if (opnum >= dce_call->conn->iface->ndr->num_calls) { + dce_call->fault_code = 0; + + if (opnum >= table->num_calls) { dce_call->fault_code = DCERPC_FAULT_OP_RNG_ERROR; return NT_STATUS_NET_WRITE_FAULT; } - name = dce_call->conn->iface->ndr->calls[opnum].name; - call = &dce_call->conn->iface->ndr->calls[opnum]; + *r = talloc(mem_ctx, table->calls[opnum].struct_size); + if (!*r) { + return NT_STATUS_NO_MEMORY; + } + + /* unravel the NDR for the packet */ + status = table->calls[opnum].ndr_pull(pull, NDR_IN, *r); + if (!NT_STATUS_IS_OK(status)) { + dcerpc_log_packet(table, opnum, NDR_IN, + &dce_call->pkt.u.request.stub_and_verifier); + dce_call->fault_code = DCERPC_FAULT_NDR; + return NT_STATUS_NET_WRITE_FAULT; + } + + return NT_STATUS_OK; +} + +static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) +{ + struct dcesrv_remote_private *private = dce_call->conn->private; + uint16_t opnum = dce_call->pkt.u.request.opnum; + const struct dcerpc_interface_table *table = dce_call->conn->iface->private; + const struct dcerpc_interface_call *call; + const char *name; + + name = table->calls[opnum].name; + call = &table->calls[opnum]; if (private->c_pipe->flags & DCERPC_DEBUG_PRINT_IN) { ndr_print_function_debug(call->ndr_print, name, NDR_IN | NDR_SET_VALUES, r); } /* we didn't use the return code of this function as we only check the last_fault_code */ - dcerpc_ndr_request(private->c_pipe, NULL, dce_call->conn->iface->ndr, - opnum, mem_ctx,r); + dcerpc_ndr_request(private->c_pipe, NULL, table, opnum, mem_ctx,r); dce_call->fault_code = private->c_pipe->last_fault_code; if (dce_call->fault_code != 0) { @@ -98,13 +125,30 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT return NT_STATUS_OK; } +static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, void *r) +{ + NTSTATUS status; + const struct dcerpc_interface_table *table = dce_call->conn->iface->private; + uint16_t opnum = dce_call->pkt.u.request.opnum; + + /* unravel the NDR for the packet */ + status = table->calls[opnum].ndr_push(push, NDR_OUT, r); + if (!NT_STATUS_IS_OK(status)) { + dce_call->fault_code = DCERPC_FAULT_NDR; + return NT_STATUS_NET_WRITE_FAULT; + } + + return NT_STATUS_OK; +} + static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const struct dcesrv_interface *iface) { int i; + const struct dcerpc_interface_table *table = iface->private; - for (i=0;indr->endpoints->count;i++) { + for (i=0;iendpoints->count;i++) { NTSTATUS ret; - const char *name = iface->ndr->endpoints->names[i]; + const char *name = table->endpoints->names[i]; ret = dcesrv_interface_register(dce_ctx, name, iface, NULL); if (!NT_STATUS_IS_OK(ret)) { @@ -150,11 +194,18 @@ static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const stru static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct dcerpc_interface_table *if_tabl) { - iface->ndr = if_tabl; - + iface->name = if_tabl->name; + iface->uuid = if_tabl->uuid; + iface->if_version = if_tabl->if_version; + iface->bind = remote_op_bind; iface->unbind = remote_op_unbind; + + iface->ndr_pull = remote_op_ndr_pull; iface->dispatch = remote_op_dispatch; + iface->ndr_push = remote_op_ndr_push; + + iface->private = if_tabl; return True; } -- cgit From ddc10d4d37984246a6547e34a32d629c689c40d1 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Jan 2005 03:06:58 +0000 Subject: r4549: got rid of a lot more uses of plain talloc(), instead using talloc_size() or talloc_array_p() where appropriate. also fixed a memory leak in pvfs_copy_file() (failed to free a memory context) (This used to be commit 89b74b53546e1570b11b3702f40bee58aed8c503) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 3bf917ac71..8feb54a500 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -77,7 +77,7 @@ static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CT return NT_STATUS_NET_WRITE_FAULT; } - *r = talloc(mem_ctx, table->calls[opnum].struct_size); + *r = talloc_size(mem_ctx, table->calls[opnum].struct_size); if (!*r) { return NT_STATUS_NO_MEMORY; } -- cgit From 6836f5d0b167027908da9a08b9b219520997b563 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 9 Jan 2005 08:34:05 +0000 Subject: r4616: the first phase in the addition of proper support for dcerpc_alter_context and multiple context_ids in the dcerpc client library. This stage does the following: - split "struct dcerpc_pipe" into two parts, the main part being "struct dcerpc_connection", which contains all the parts not dependent on the context, and "struct dcerpc_pipe" which has the context dependent part. This is similar to the layering in libcli_*() for SMB - disable the current dcerpc_alter code. I've used a #warning until i get the 2nd phase finished. I don't know how portable #warning is, but it won't be long before I add full alter context support anyway, so it won't last long - cleanup the allocation of dcerpc_pipe structures. The previous code was quite awkward. (This used to be commit 4004c69937be7e5dae56f9567ca607f982d395d3) --- source4/rpc_server/remote/dcesrv_remote.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 8feb54a500..83c550974d 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -105,7 +105,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT name = table->calls[opnum].name; call = &table->calls[opnum]; - if (private->c_pipe->flags & DCERPC_DEBUG_PRINT_IN) { + if (private->c_pipe->conn->flags & DCERPC_DEBUG_PRINT_IN) { ndr_print_function_debug(call->ndr_print, name, NDR_IN | NDR_SET_VALUES, r); } @@ -118,7 +118,8 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT return NT_STATUS_NET_WRITE_FAULT; } - if ((dce_call->fault_code == 0) && (private->c_pipe->flags & DCERPC_DEBUG_PRINT_OUT)) { + if ((dce_call->fault_code == 0) && + (private->c_pipe->conn->flags & DCERPC_DEBUG_PRINT_OUT)) { ndr_print_function_debug(call->ndr_print, name, NDR_OUT, r); } @@ -212,9 +213,9 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct d static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32_t if_version) { - struct dcerpc_interface_list *l; + const struct dcerpc_interface_list *l; - for (l=dcerpc_pipes;l;l=l->next) { + for (l=librpc_dcerpc_pipes();l;l=l->next) { if (l->table->if_version == if_version && strcmp(l->table->uuid, uuid)==0) { return remote_fill_interface(iface, l->table); @@ -226,9 +227,9 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const ch static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) { - struct dcerpc_interface_list *l; + const struct dcerpc_interface_list *l; - for (l=dcerpc_pipes;l;l=l->next) { + for (l=librpc_dcerpc_pipes();l;l=l->next) { if (strcmp(l->table->name, name)==0) { return remote_fill_interface(iface, l->table); } -- cgit From 577218b2aded7adb367f3f33bcc5560f3d4c0ec2 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 10 Jan 2005 12:15:26 +0000 Subject: r4640: first stage in the server side support for multiple context_ids on one pipe this stage does the following: - simplifies the dcerpc_handle handling, and all the callers of it - split out the context_id depenent state into a linked list of established contexts - fixed some talloc handling in several rpc servers that i noticed while doing the above (This used to be commit fde042b3fc609c94e2c7eedcdd72ecdf489cf63b) --- source4/rpc_server/remote/dcesrv_remote.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 83c550974d..1464ef0307 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -50,14 +50,14 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return status; } - dce_call->conn->private = private; + dce_call->context->private = private; return NT_STATUS_OK; } -static void remote_op_unbind(struct dcesrv_connection *dce_conn, const struct dcesrv_interface *iface) +static void remote_op_unbind(struct dcesrv_connection_context *context, const struct dcesrv_interface *iface) { - struct dcesrv_remote_private *private = dce_conn->private; + struct dcesrv_remote_private *private = context->private; dcerpc_pipe_close(private->c_pipe); @@ -67,7 +67,7 @@ static void remote_op_unbind(struct dcesrv_connection *dce_conn, const struct dc static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r) { NTSTATUS status; - const struct dcerpc_interface_table *table = dce_call->conn->iface->private; + const struct dcerpc_interface_table *table = dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; dce_call->fault_code = 0; @@ -96,9 +96,9 @@ static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CT static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) { - struct dcesrv_remote_private *private = dce_call->conn->private; + struct dcesrv_remote_private *private = dce_call->context->private; uint16_t opnum = dce_call->pkt.u.request.opnum; - const struct dcerpc_interface_table *table = dce_call->conn->iface->private; + const struct dcerpc_interface_table *table = dce_call->context->iface->private; const struct dcerpc_interface_call *call; const char *name; @@ -129,7 +129,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, void *r) { NTSTATUS status; - const struct dcerpc_interface_table *table = dce_call->conn->iface->private; + const struct dcerpc_interface_table *table = dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; /* unravel the NDR for the packet */ -- cgit From 759da3b915e2006d4c87b5ace47f399accd9ce91 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 27 Jan 2005 07:08:20 +0000 Subject: r5037: got rid of all of the TALLOC_DEPRECATED stuff. My apologies for the large commit. I thought this was worthwhile to get done for consistency. (This used to be commit ec32b22ed5ec224f6324f5e069d15e92e38e15c0) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 1464ef0307..b1e9659198 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -37,7 +37,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_INVALID_PARAMETER; } - private = talloc_p(dce_call->conn, struct dcesrv_remote_private); + private = talloc(dce_call->conn, struct dcesrv_remote_private); if (!private) { return NT_STATUS_NO_MEMORY; } -- cgit From db4ba6e6909b4cf80b2b18f1a0d34b613de4be25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 4 Feb 2005 04:58:48 +0000 Subject: r5221: replace the str_list_*() code with new code based on talloc(). This is a precursor to adding the wins client code in the nbt server. (This used to be commit e8e499755ab667015740b35a7787134ebe852954) --- source4/rpc_server/remote/dcesrv_remote.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index b1e9659198..fc8c8a6706 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -164,7 +164,7 @@ static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) { int i; - char **ifaces = str_list_make(lp_parm_string(-1,"dcerpc_remote","interfaces"),NULL); + char **ifaces = str_list_make(dce_ctx, lp_parm_string(-1,"dcerpc_remote","interfaces"),NULL); if (!ifaces) { DEBUG(3,("remote_op_init_server: no interfaces configured\n")); @@ -177,19 +177,19 @@ static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const stru if (!ep_server->interface_by_name(&iface, ifaces[i])) { DEBUG(0,("remote_op_init_server: failed to find interface = '%s'\n", ifaces[i])); - str_list_free(&ifaces); + talloc_free(ifaces); return NT_STATUS_UNSUCCESSFUL; } ret = remote_register_one_iface(dce_ctx, &iface); if (!NT_STATUS_IS_OK(ret)) { DEBUG(0,("remote_op_init_server: failed to register interface = '%s'\n", ifaces[i])); - str_list_free(&ifaces); + talloc_free(ifaces); return ret; } } - str_list_free(&ifaces); + talloc_free(ifaces); return NT_STATUS_OK; } -- cgit From 8674eaa5cc9b1ddeb65f05527a5b539f15e4afcb Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 10 Feb 2005 05:22:53 +0000 Subject: r5300: more uint32 and system/filesys.h build fixes when developer mode is enabled (This used to be commit 93931b1a741a3722c311ada80c4c9d3d670f91b2) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index fc8c8a6706..ee526e1978 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -164,7 +164,7 @@ static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) { int i; - char **ifaces = str_list_make(dce_ctx, lp_parm_string(-1,"dcerpc_remote","interfaces"),NULL); + const char **ifaces = str_list_make(dce_ctx, lp_parm_string(-1,"dcerpc_remote","interfaces"),NULL); if (!ifaces) { DEBUG(3,("remote_op_init_server: no interfaces configured\n")); -- cgit From df643022136a4b229aca817f5b57f7302a97f852 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 19 Mar 2005 08:34:43 +0000 Subject: r5902: A rather large change... I wanted to add a simple 'workstation' argument to the DCERPC authenticated binding calls, but this patch kind of grew from there. With SCHANNEL, the 'workstation' name (the netbios name of the client) matters, as this is what ties the session between the NETLOGON ops and the SCHANNEL bind. This changes a lot of files, and these will again be changed when jelmer does the credentials work. I also correct some schannel IDL to distinguish between workstation names and account names. The distinction matters for domain trust accounts. Issues in handling this (issues with lifetime of talloc pointers) caused me to change the 'creds_CredentialsState' and 'struct dcerpc_binding' pointers to always be talloc()ed pointers. In the schannel DB, we now store both the domain and computername, and query on both. This should ensure we fault correctly when the domain is specified incorrectly in the SCHANNEL bind. In the RPC-SCHANNEL test, I finally fixed a bug that vl pointed out, where the comment claimed we re-used a connection, but in fact we made a new connection. This was achived by breaking apart some of the dcerpc_secondary_connection() logic. The addition of workstation handling was also propogated to NTLMSSP and GENSEC, for completeness. The RPC-SAMSYNC test has been cleaned up a little, using a loop over usernames/passwords rather than manually expanded tests. This will be expanded further (the code in #if 0 in this patch) to use a newly created user account for testing. In making this test pass test_rpc.sh, I found a bug in the RPC-ECHO server, caused by the removal of [ref] and the assoicated pointer from the IDL. This has been re-added, until the underlying pidl issues are solved. (This used to be commit 824289dcc20908ddec957a4a892a103eec2da9b9) --- source4/rpc_server/remote/dcesrv_remote.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index ee526e1978..9ed6b5a1bd 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -43,6 +43,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct } status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->uuid, iface->if_version, + lp_netbios_name(), lp_workgroup(), lp_parm_string(-1, "dcerpc_remote", "username"), lp_parm_string(-1, "dcerpc_remote", "password")); -- cgit From 05bc2d7b2c11a3583a6d1221cfbd618eb6730518 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 21 Mar 2005 21:22:07 +0000 Subject: r5928: Use cli_credentials in: - gtk+ (returned by GtkHostBindingDialog as well now) - torture/ - librpc/ - lib/com/dcom/ (This used to be commit ccefd782335e01e8e6ecb2bcd28a4f999c53b1a6) --- source4/rpc_server/remote/dcesrv_remote.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 9ed6b5a1bd..4c25ace71e 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -31,6 +31,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; struct dcesrv_remote_private *private; const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); + struct cli_credentials credentials; if (!binding) { DEBUG(0,("You must specify a ncacn binding string\n")); @@ -42,11 +43,12 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_NO_MEMORY; } - status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->uuid, iface->if_version, - lp_netbios_name(), - lp_workgroup(), - lp_parm_string(-1, "dcerpc_remote", "username"), - lp_parm_string(-1, "dcerpc_remote", "password")); + cli_credentials_set_username(&credentials, lp_parm_string(-1, "dcerpc_remote", "username"), CRED_SPECIFIED); + cli_credentials_set_workstation(&credentials, lp_netbios_name(), CRED_SPECIFIED); + cli_credentials_set_domain(&credentials, lp_workgroup(), CRED_SPECIFIED); + cli_credentials_set_password(&credentials, lp_parm_string(-1, "dcerpc_remote", "password"), CRED_SPECIFIED); + + status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->uuid, iface->if_version, &credentials); if (!NT_STATUS_IS_OK(status)) { return status; } -- cgit From 645711c602313940dcf80ec786557920ecfbf884 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 22 Mar 2005 08:00:45 +0000 Subject: r5941: Commit this patch much earlier than I would normally prefer, but metze needs a working tree... The main volume of this patch was what I started working on today: - Cleans up memory handling around DCE/RPC pipes, to have a parent talloc context. - Uses sepereate inner loops for some of the DCE/RPC tests The other and more important part of this patch fixes issues surrounding the new credentials framwork: This makes the struct cli_credentials always a talloc() structure, rather than on the stack. Parts of the cli_credentials code already assumed this. There were other issues, particularly in the DCERPC over SMB handling, as well as little things that had to be tidied up before test_w2k3.sh would start to pass. Andrew Bartlett (This used to be commit 0453f9d05d2e336fba1f85dbf2718d01fa2bf778) --- source4/rpc_server/remote/dcesrv_remote.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 4c25ace71e..825adddfee 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -31,7 +31,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; struct dcesrv_remote_private *private; const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); - struct cli_credentials credentials; + struct cli_credentials *credentials; if (!binding) { DEBUG(0,("You must specify a ncacn binding string\n")); @@ -42,13 +42,20 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct if (!private) { return NT_STATUS_NO_MEMORY; } + + credentials = cli_credentials_init(private); + + cli_credentials_set_username(credentials, lp_parm_string(-1, "dcerpc_remote", "username"), CRED_SPECIFIED); + cli_credentials_set_workstation(credentials, lp_netbios_name(), CRED_SPECIFIED); + cli_credentials_set_domain(credentials, lp_workgroup(), CRED_SPECIFIED); + cli_credentials_set_password(credentials, lp_parm_string(-1, "dcerpc_remote", "password"), CRED_SPECIFIED); - cli_credentials_set_username(&credentials, lp_parm_string(-1, "dcerpc_remote", "username"), CRED_SPECIFIED); - cli_credentials_set_workstation(&credentials, lp_netbios_name(), CRED_SPECIFIED); - cli_credentials_set_domain(&credentials, lp_workgroup(), CRED_SPECIFIED); - cli_credentials_set_password(&credentials, lp_parm_string(-1, "dcerpc_remote", "password"), CRED_SPECIFIED); + status = dcerpc_pipe_connect(private, + &(private->c_pipe), binding, + iface->uuid, iface->if_version, + credentials); - status = dcerpc_pipe_connect(&(private->c_pipe), binding, iface->uuid, iface->if_version, &credentials); + talloc_free(credentials); if (!NT_STATUS_IS_OK(status)) { return status; } @@ -62,7 +69,7 @@ static void remote_op_unbind(struct dcesrv_connection_context *context, const st { struct dcesrv_remote_private *private = context->private; - dcerpc_pipe_close(private->c_pipe); + talloc_free(private->c_pipe); return; } -- cgit From af237084ecd4f9928c6c282b9c5c73598d5c73d6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 16 Jun 2005 11:36:09 +0000 Subject: r7633: this patch started as an attempt to make the dcerpc code use a given event_context for the socket_connect() call, so that when things that use dcerpc are running alongside anything else it doesn't block the whole process during a connect. Then of course I needed to change any code that created a dcerpc connection (such as the auth code) to also take an event context, and anything that called that and so on .... thus the size of the patch. There were 3 places where I punted: - abartlet wanted me to add a gensec_set_event_context() call instead of adding it to the gensec init calls. Andrew, my apologies for not doing this. I didn't do it as adding a new parameter allowed me to catch all the callers with the compiler. Now that its done, we could go back and use gensec_set_event_context() - the ejs code calls auth initialisation, which means it should pass in the event context from the web server. I punted on that. Needs fixing. - I used a NULL event context in dcom_get_pipe(). This is equivalent to what we did already, but should be fixed to use a callers event context. Jelmer, can you think of a clean way to do that? I also cleaned up a couple of things: - libnet_context_destroy() makes no sense. I removed it. - removed some unused vars in various places (This used to be commit 3a3025485bdb8f600ab528c0b4b4eef0c65e3fc9) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 825adddfee..3c5caac118 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -53,7 +53,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct status = dcerpc_pipe_connect(private, &(private->c_pipe), binding, iface->uuid, iface->if_version, - credentials); + credentials, dce_call->event_ctx); talloc_free(credentials); if (!NT_STATUS_IS_OK(status)) { -- cgit From 152a6a00c31f52d14a63bfc977ac54713c56c9cd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 24 Jun 2005 01:18:56 +0000 Subject: r7865: changed pidl to take a "const void *" instead of a "void *" for the structure in ndr_push_*() and ndr_print_*(). The push and print functions really should not modify the structure. metze, to make this work I had to change your spoolss hand marshaller. Can you please check it is OK? I think that the IN and OUT sides of that function are not ever called on the same structure, so I think that attempt at remembering the value by assigning to r->in._offered was not doing anything anyway, but please correct me if I have misunderstood it. If you really do need to remember something on those structures I'd suggest the ndr_token_store() and ndr_token_retrieve() functions, which are used by pidl for just this sort of thing. (This used to be commit eee528be97fa43ca53bdc5652b4d29a0a2caf563) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 3c5caac118..9e77347fa7 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -136,7 +136,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT return NT_STATUS_OK; } -static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, void *r) +static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, const void *r) { NTSTATUS status; const struct dcerpc_interface_table *table = dce_call->context->iface->private; -- cgit From f801ad359290c51d3216c755fb2a8344babb484f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 26 Sep 2005 15:59:43 +0000 Subject: r10510: Decrease the amount of data included by includes.h a bit (This used to be commit 03647e1321cf6c9bd6ced3945265f635e9468973) --- source4/rpc_server/remote/dcesrv_remote.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 9e77347fa7..08734493ba 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -21,6 +21,7 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" +#include "credentials.h" struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; -- cgit From 42b81d7c3e8ac9ad4c35d5377decbdd5ab18ffbb Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 27 Sep 2005 10:00:27 +0000 Subject: r10528: Add credentials.h back into includes.h as some compilers don't seem to be able to handle incomplete enum types. (This used to be commit 540155fad3c8e3d79fb631bb3f14273f82130a73) --- source4/rpc_server/remote/dcesrv_remote.c | 1 - 1 file changed, 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 08734493ba..9e77347fa7 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -21,7 +21,6 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" -#include "credentials.h" struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; -- cgit From 79cb46c1af526635c31b03612cd9f0d9ea97a5be Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Sat, 5 Nov 2005 06:36:42 +0000 Subject: r11513: Add the ability to use the local machine account instead of a static password or delegation. Add the ability to delegate for RPC pipes on the RPC proxy backend (the backend itself seems be having problems however). Andrew Bartlett (This used to be commit a7e946bc37e4acfbe2c483b4f1ead0341f9b3d19) --- source4/rpc_server/remote/dcesrv_remote.c | 57 +++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 11 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 9e77347fa7..9ba2419859 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -21,6 +21,8 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" +#include "auth/auth.h" + struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; @@ -31,24 +33,59 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; struct dcesrv_remote_private *private; const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); + const char *user, *pass, *domain; struct cli_credentials *credentials; + BOOL machine_account; - if (!binding) { - DEBUG(0,("You must specify a ncacn binding string\n")); - return NT_STATUS_INVALID_PARAMETER; - } + machine_account = lp_parm_bool(-1, "dcerpc_remote", "use_machine_account", False); private = talloc(dce_call->conn, struct dcesrv_remote_private); if (!private) { return NT_STATUS_NO_MEMORY; } - credentials = cli_credentials_init(private); + private->c_pipe = NULL; + dce_call->context->private = private; + + if (!binding) { + DEBUG(0,("You must specify a ncacn binding string\n")); + return NT_STATUS_INVALID_PARAMETER; + } + + user = lp_parm_string(-1, "dcerpc_remote", "user"); + pass = lp_parm_string(-1, "dcerpc_remote", "password"); + domain = lp_parm_string(-1, "dceprc_remote", "domain"); - cli_credentials_set_username(credentials, lp_parm_string(-1, "dcerpc_remote", "username"), CRED_SPECIFIED); - cli_credentials_set_workstation(credentials, lp_netbios_name(), CRED_SPECIFIED); - cli_credentials_set_domain(credentials, lp_workgroup(), CRED_SPECIFIED); - cli_credentials_set_password(credentials, lp_parm_string(-1, "dcerpc_remote", "password"), CRED_SPECIFIED); + if (user && pass) { + DEBUG(5, ("dcerpc_remote: RPC Proxy: Using specified account\n")); + credentials = cli_credentials_init(private); + if (!credentials) { + return NT_STATUS_NO_MEMORY; + } + cli_credentials_set_conf(credentials); + cli_credentials_set_username(credentials, user, CRED_SPECIFIED); + if (domain) { + cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); + } + cli_credentials_set_password(credentials, pass, CRED_SPECIFIED); + } else if (machine_account) { + DEBUG(5, ("dcerpc_remote: RPC Proxy: Using machine account\n")); + credentials = cli_credentials_init(private); + cli_credentials_set_conf(credentials); + if (domain) { + cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); + } + status = cli_credentials_set_machine_account(credentials); + if (!NT_STATUS_IS_OK(status)) { + return status; + } + } else if (dce_call->conn->auth_state.session_info->credentials) { + DEBUG(5, ("dcerpc_remote: RPC Proxy: Using delegated credentials\n")); + credentials = dce_call->conn->auth_state.session_info->credentials; + } else { + DEBUG(1,("dcerpc_remote: RPC Proxy: You must supply binding, user and password or have delegated credentials\n")); + return NT_STATUS_INVALID_PARAMETER; + } status = dcerpc_pipe_connect(private, &(private->c_pipe), binding, @@ -60,8 +97,6 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return status; } - dce_call->context->private = private; - return NT_STATUS_OK; } -- cgit From acd6a086b341096fcbea1775ce748587fcc8020a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 27 Dec 2005 14:28:01 +0000 Subject: r12510: Change the DCE/RPC interfaces to take a pointer to a dcerpc_interface_table struct rather then a tuple of interface name, UUID and version. This removes the requirement for having a global list of DCE/RPC interfaces, except for these parts of the code that use that list explicitly (ndrdump and the scanner torture test). This should also allow us to remove the hack that put the authservice parameter in the dcerpc_binding struct as it can now be read directly from dcerpc_interface_table. I will now modify some of these functions to take a dcerpc_syntax_id structure rather then a full dcerpc_interface_table. (This used to be commit 8aae0f168e54c01d0866ad6e0da141dbd828574f) --- source4/rpc_server/remote/dcesrv_remote.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 9ba2419859..b4f45614f1 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -31,6 +31,7 @@ struct dcesrv_remote_private { static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface) { NTSTATUS status; + const struct dcerpc_interface_table *table; struct dcesrv_remote_private *private; const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); const char *user, *pass, *domain; @@ -48,7 +49,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct dce_call->context->private = private; if (!binding) { - DEBUG(0,("You must specify a ncacn binding string\n")); + DEBUG(0,("You must specify a DCE/RPC binding string\n")); return NT_STATUS_INVALID_PARAMETER; } @@ -56,6 +57,12 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct pass = lp_parm_string(-1, "dcerpc_remote", "password"); domain = lp_parm_string(-1, "dceprc_remote", "domain"); + table = idl_iface_by_uuid(iface->uuid); /* FIXME: What about if_version ? */ + if (!table) { + dce_call->fault_code = DCERPC_FAULT_UNK_IF; + return NT_STATUS_NET_WRITE_FAULT; + } + if (user && pass) { DEBUG(5, ("dcerpc_remote: RPC Proxy: Using specified account\n")); credentials = cli_credentials_init(private); @@ -88,8 +95,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct } status = dcerpc_pipe_connect(private, - &(private->c_pipe), binding, - iface->uuid, iface->if_version, + &(private->c_pipe), binding, table, credentials, dce_call->event_ctx); talloc_free(credentials); @@ -272,13 +278,10 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const ch static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) { - const struct dcerpc_interface_list *l; + const struct dcerpc_interface_table *tbl = idl_iface_by_name(name); - for (l=librpc_dcerpc_pipes();l;l=l->next) { - if (strcmp(l->table->name, name)==0) { - return remote_fill_interface(iface, l->table); - } - } + if (tbl) + return remote_fill_interface(iface, tbl); return False; } -- cgit From d658de65d32e6746ac51aeb4da7aa74b3da40c2b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 27 Dec 2005 16:22:35 +0000 Subject: r12512: Use GUID structs in API functions everywhere rather then converting back and forth between GUID structs and strings in several places. (This used to be commit 3564e2f967ef72d6301b4f7e9a311cebcded4d75) --- source4/rpc_server/remote/dcesrv_remote.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index b4f45614f1..4cd4b2b507 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -57,7 +57,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct pass = lp_parm_string(-1, "dcerpc_remote", "password"); domain = lp_parm_string(-1, "dceprc_remote", "domain"); - table = idl_iface_by_uuid(iface->uuid); /* FIXME: What about if_version ? */ + table = idl_iface_by_uuid(&iface->uuid); /* FIXME: What about if_version ? */ if (!table) { dce_call->fault_code = DCERPC_FAULT_UNK_IF; return NT_STATUS_NET_WRITE_FAULT; @@ -262,13 +262,13 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct d return True; } -static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const char *uuid, uint32_t if_version) +static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const struct GUID *uuid, uint32_t if_version) { const struct dcerpc_interface_list *l; for (l=librpc_dcerpc_pipes();l;l=l->next) { if (l->table->if_version == if_version && - strcmp(l->table->uuid, uuid)==0) { + GUID_equal(&l->table->uuid, uuid)==0) { return remote_fill_interface(iface, l->table); } } -- cgit From aa9f67163cd2df2a815ef585edad1951343b82c8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 30 Dec 2005 22:46:16 +0000 Subject: r12620: Get rid of automatically generated lists of init functions of subsystems. This allows Samba libraries to be used by other projects (and parts of Samba to be built as shared libraries). (This used to be commit 44f0aba715bfedc7e1ee3d07e9a101a91dbd84b3) --- source4/rpc_server/remote/dcesrv_remote.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 4cd4b2b507..f7de3031ce 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -309,5 +309,8 @@ NTSTATUS dcerpc_server_remote_init(void) return ret; } + /* We need the full DCE/RPC interface table */ + dcerpc_table_init(); + return ret; } -- cgit From 046a54f96394fe49226ab2b48fdeb7c07937ea57 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 30 Dec 2005 23:18:27 +0000 Subject: r12622: Move table.c prototypes to seperate header to prevent circular dependencies with proto.h (This used to be commit 9e0ba380374db028358158b9e4457dd930b5ab13) --- source4/rpc_server/remote/dcesrv_remote.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index f7de3031ce..4517847b74 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -22,6 +22,7 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" #include "auth/auth.h" +#include "librpc/rpc/dcerpc_table.h" struct dcesrv_remote_private { -- cgit From 42da534d66c14c60844568246a2862da7b49f1d5 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 26 Mar 2006 00:59:17 +0000 Subject: r14735: Use dcerpc_syntax_id rather then seperate GUID + if_version everywhere (This used to be commit a316b33057f3ec8532677980e093cd327d33f257) --- source4/rpc_server/remote/dcesrv_remote.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 4517847b74..60dddfbfb3 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -58,7 +58,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct pass = lp_parm_string(-1, "dcerpc_remote", "password"); domain = lp_parm_string(-1, "dceprc_remote", "domain"); - table = idl_iface_by_uuid(&iface->uuid); /* FIXME: What about if_version ? */ + table = idl_iface_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */ if (!table) { dce_call->fault_code = DCERPC_FAULT_UNK_IF; return NT_STATUS_NET_WRITE_FAULT; @@ -248,8 +248,7 @@ static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const stru static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct dcerpc_interface_table *if_tabl) { iface->name = if_tabl->name; - iface->uuid = if_tabl->uuid; - iface->if_version = if_tabl->if_version; + iface->syntax_id = if_tabl->syntax_id; iface->bind = remote_op_bind; iface->unbind = remote_op_unbind; @@ -268,8 +267,8 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const st const struct dcerpc_interface_list *l; for (l=librpc_dcerpc_pipes();l;l=l->next) { - if (l->table->if_version == if_version && - GUID_equal(&l->table->uuid, uuid)==0) { + if (l->table->syntax_id.if_version == if_version && + GUID_equal(&l->table->syntax_id.uuid, uuid)==0) { return remote_fill_interface(iface, l->table); } } -- cgit From 13dbee3ffea6065a826f010e50c9b4eb2c6ad109 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 7 Nov 2006 00:48:36 +0000 Subject: r19598: Ahead of a merge to current lorikeet-heimdal: Break up auth/auth.h not to include the world. Add credentials_krb5.h with the kerberos dependent prototypes. Andrew Bartlett (This used to be commit 2b569c42e0fbb596ea82484d0e1cb22e193037b9) --- source4/rpc_server/remote/dcesrv_remote.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 60dddfbfb3..b15d830c6d 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -22,6 +22,7 @@ #include "includes.h" #include "rpc_server/dcerpc_server.h" #include "auth/auth.h" +#include "auth/credentials/credentials.h" #include "librpc/rpc/dcerpc_table.h" -- cgit From f32d15f8c7bab7e4830fc082ad6ad9d6e7070691 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 6 Dec 2006 09:25:26 +0000 Subject: r20047: patch from Julien Kerihuel to make the "remote" rpc proxy work for outlook and exchange metze (This used to be commit 00875f806eca4165cb098b0e01e33c74fdea2bf5) --- source4/rpc_server/remote/dcesrv_remote.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index b15d830c6d..d2aabc8033 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -30,6 +30,11 @@ struct dcesrv_remote_private { struct dcerpc_pipe *c_pipe; }; +static NTSTATUS remote_op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, void *r) +{ + return NT_STATUS_OK; +} + static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface) { NTSTATUS status; @@ -256,6 +261,7 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct d iface->ndr_pull = remote_op_ndr_pull; iface->dispatch = remote_op_dispatch; + iface->reply = remote_op_reply; iface->ndr_push = remote_op_ndr_push; iface->private = if_tabl; -- cgit From e99ea0a1e1d5666a3a63beba968f9ca23bc33227 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 12 Dec 2006 07:46:06 +0000 Subject: r20114: from Julien Kerihuel , thanks!: I've attached the patch which fix this problem. I've only added DCERPC_NDR_REF_ALLOC to the connection flags. This way it is processed correctly by ndr_pull_init_flags and added to the ndr flags of the pull structure. metze (This used to be commit ed4c7ce547c61907291d19c172d5eb6f4c4981fe) --- source4/rpc_server/remote/dcesrv_remote.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index d2aabc8033..3bc3f79bb5 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -167,6 +167,8 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT ndr_print_function_debug(call->ndr_print, name, NDR_IN | NDR_SET_VALUES, r); } + private->c_pipe->conn->flags |= DCERPC_NDR_REF_ALLOC; + /* we didn't use the return code of this function as we only check the last_fault_code */ dcerpc_ndr_request(private->c_pipe, NULL, table, opnum, mem_ctx,r); -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/rpc_server/remote/dcesrv_remote.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 3bc3f79bb5..2071aa2199 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -6,7 +6,7 @@ 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 2 of the License, or + 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, @@ -15,8 +15,7 @@ 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, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" -- cgit From 698e7c5f2ae23656c50b95b5ca7151396d215ffb Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 18 Aug 2007 10:30:40 +0000 Subject: r24535: rename struct dcerpc_interface_call -> struct ndr_interface_call and move it to librpc/ndr/libndr.h metze (This used to be commit abd5551aabae1820baaa52a963e8c7aa9605914e) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 2071aa2199..4e65684c22 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -156,7 +156,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT struct dcesrv_remote_private *private = dce_call->context->private; uint16_t opnum = dce_call->pkt.u.request.opnum; const struct dcerpc_interface_table *table = dce_call->context->iface->private; - const struct dcerpc_interface_call *call; + const struct ndr_interface_call *call; const char *name; name = table->calls[opnum].name; -- cgit From b8cdadced4d2a26a63b8bbe397c12df949783ed4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 19 Aug 2007 20:46:45 +0000 Subject: r24551: rename dcerpc_interface_table -> ndr_interface_table rename dcerpc_interface_list -> ndr_interface_list and move them to libndr.h metze (This used to be commit 4adbebef5df2f833d2d4bfcdda72a34179d52f5c) --- source4/rpc_server/remote/dcesrv_remote.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 4e65684c22..9a929e951c 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -37,7 +37,7 @@ static NTSTATUS remote_op_reply(struct dcesrv_call_state *dce_call, TALLOC_CTX * static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface) { NTSTATUS status; - const struct dcerpc_interface_table *table; + const struct ndr_interface_table *table; struct dcesrv_remote_private *private; const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); const char *user, *pass, *domain; @@ -124,7 +124,7 @@ static void remote_op_unbind(struct dcesrv_connection_context *context, const st static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r) { NTSTATUS status; - const struct dcerpc_interface_table *table = dce_call->context->iface->private; + const struct ndr_interface_table *table = dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; dce_call->fault_code = 0; @@ -155,7 +155,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT { struct dcesrv_remote_private *private = dce_call->context->private; uint16_t opnum = dce_call->pkt.u.request.opnum; - const struct dcerpc_interface_table *table = dce_call->context->iface->private; + const struct ndr_interface_table *table = dce_call->context->iface->private; const struct ndr_interface_call *call; const char *name; @@ -188,7 +188,7 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, const void *r) { NTSTATUS status; - const struct dcerpc_interface_table *table = dce_call->context->iface->private; + const struct ndr_interface_table *table = dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; /* unravel the NDR for the packet */ @@ -204,7 +204,7 @@ static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CT static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const struct dcesrv_interface *iface) { int i; - const struct dcerpc_interface_table *table = iface->private; + const struct ndr_interface_table *table = iface->private; for (i=0;iendpoints->count;i++) { NTSTATUS ret; @@ -252,7 +252,7 @@ static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const stru return NT_STATUS_OK; } -static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct dcerpc_interface_table *if_tabl) +static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct ndr_interface_table *if_tabl) { iface->name = if_tabl->name; iface->syntax_id = if_tabl->syntax_id; @@ -272,7 +272,7 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct d static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const struct GUID *uuid, uint32_t if_version) { - const struct dcerpc_interface_list *l; + const struct ndr_interface_list *l; for (l=librpc_dcerpc_pipes();l;l=l->next) { if (l->table->syntax_id.if_version == if_version && @@ -286,7 +286,7 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const st static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) { - const struct dcerpc_interface_table *tbl = idl_iface_by_name(name); + const struct ndr_interface_table *tbl = idl_iface_by_name(name); if (tbl) return remote_fill_interface(iface, tbl); -- cgit From f14bd1a90ab47a418c0ec2492990a417a0bb3bf6 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 19 Aug 2007 21:23:03 +0000 Subject: r24557: rename 'dcerpc_table_' -> 'ndr_table_' metze (This used to be commit 84651aee81aaabbebf52ffc3fbcbabb2eec6eed5) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 9a929e951c..e494c3644a 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -318,7 +318,7 @@ NTSTATUS dcerpc_server_remote_init(void) } /* We need the full DCE/RPC interface table */ - dcerpc_table_init(); + ndr_table_init(); return ret; } -- cgit From bd93ed4680b3a86348b0d84a93d20f3daafbe8ad Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 21 Aug 2007 19:35:43 +0000 Subject: r24606: move librpc/rpc/table.c -> librpc/ndr/ndr_table.c and rename the containing functions to have a ndr_ prefix metze (This used to be commit cb234d43ae693af5d8a921a15c9bcac3c6f0359a) --- source4/rpc_server/remote/dcesrv_remote.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index e494c3644a..6ddffa1d6c 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -22,7 +22,7 @@ #include "rpc_server/dcerpc_server.h" #include "auth/auth.h" #include "auth/credentials/credentials.h" -#include "librpc/rpc/dcerpc_table.h" +#include "librpc/ndr/ndr_table.h" struct dcesrv_remote_private { @@ -63,7 +63,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct pass = lp_parm_string(-1, "dcerpc_remote", "password"); domain = lp_parm_string(-1, "dceprc_remote", "domain"); - table = idl_iface_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */ + table = ndr_table_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */ if (!table) { dce_call->fault_code = DCERPC_FAULT_UNK_IF; return NT_STATUS_NET_WRITE_FAULT; @@ -274,7 +274,7 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const st { const struct ndr_interface_list *l; - for (l=librpc_dcerpc_pipes();l;l=l->next) { + for (l=ndr_table_list();l;l=l->next) { if (l->table->syntax_id.if_version == if_version && GUID_equal(&l->table->syntax_id.uuid, uuid)==0) { return remote_fill_interface(iface, l->table); @@ -286,7 +286,7 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const st static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) { - const struct ndr_interface_table *tbl = idl_iface_by_name(name); + const struct ndr_interface_table *tbl = ndr_table_by_name(name); if (tbl) return remote_fill_interface(iface, tbl); -- cgit From ffeee68e4b72dd94fee57366bd8d38b8c284c3d4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 12:42:09 +0000 Subject: r25026: Move param/param.h out of includes.h (This used to be commit abe8349f9b4387961ff3665d8c589d61cd2edf31) --- source4/rpc_server/remote/dcesrv_remote.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 6ddffa1d6c..e51a847ee2 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -23,6 +23,7 @@ #include "auth/auth.h" #include "auth/credentials/credentials.h" #include "librpc/ndr/ndr_table.h" +#include "param/param.h" struct dcesrv_remote_private { @@ -114,7 +115,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct static void remote_op_unbind(struct dcesrv_connection_context *context, const struct dcesrv_interface *iface) { - struct dcesrv_remote_private *private = context->private; + struct dcesrv_remote_private *private = (struct dcesrv_remote_private *)context->private; talloc_free(private->c_pipe); @@ -124,7 +125,7 @@ static void remote_op_unbind(struct dcesrv_connection_context *context, const st static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r) { NTSTATUS status; - const struct ndr_interface_table *table = dce_call->context->iface->private; + const struct ndr_interface_table *table = (const struct ndr_interface_table *)dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; dce_call->fault_code = 0; -- cgit From 98b57d5eb61094a9c88e2f7d90d3e21b7e74e9d8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 16:46:30 +0000 Subject: r25035: Fix some more warnings, use service pointer rather than service number in more places. (This used to be commit df9cebcb97e20564359097148665bd519f31bc6f) --- source4/rpc_server/remote/dcesrv_remote.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index e51a847ee2..2b481919d1 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -40,12 +40,12 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; const struct ndr_interface_table *table; struct dcesrv_remote_private *private; - const char *binding = lp_parm_string(-1, "dcerpc_remote", "binding"); + const char *binding = lp_parm_string(NULL, "dcerpc_remote", "binding"); const char *user, *pass, *domain; struct cli_credentials *credentials; BOOL machine_account; - machine_account = lp_parm_bool(-1, "dcerpc_remote", "use_machine_account", False); + machine_account = lp_parm_bool(NULL, "dcerpc_remote", "use_machine_account", false); private = talloc(dce_call->conn, struct dcesrv_remote_private); if (!private) { @@ -60,9 +60,9 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_INVALID_PARAMETER; } - user = lp_parm_string(-1, "dcerpc_remote", "user"); - pass = lp_parm_string(-1, "dcerpc_remote", "password"); - domain = lp_parm_string(-1, "dceprc_remote", "domain"); + user = lp_parm_string(NULL, "dcerpc_remote", "user"); + pass = lp_parm_string(NULL, "dcerpc_remote", "password"); + domain = lp_parm_string(NULL, "dceprc_remote", "domain"); table = ndr_table_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */ if (!table) { @@ -224,7 +224,7 @@ static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) { int i; - const char **ifaces = str_list_make(dce_ctx, lp_parm_string(-1,"dcerpc_remote","interfaces"),NULL); + const char **ifaces = str_list_make(dce_ctx, lp_parm_string(NULL,"dcerpc_remote","interfaces"),NULL); if (!ifaces) { DEBUG(3,("remote_op_init_server: no interfaces configured\n")); -- cgit From 37d53832a4623653f706e77985a79d84bd7c6694 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 28 Sep 2007 01:17:46 +0000 Subject: r25398: Parse loadparm context to all lp_*() functions. (This used to be commit 3fcc960839c6e5ca4de2c3c042f12f369ac5f238) --- source4/rpc_server/remote/dcesrv_remote.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 2b481919d1..7434a32128 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -76,7 +76,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct if (!credentials) { return NT_STATUS_NO_MEMORY; } - cli_credentials_set_conf(credentials); + cli_credentials_set_conf(credentials, global_loadparm); cli_credentials_set_username(credentials, user, CRED_SPECIFIED); if (domain) { cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); @@ -85,7 +85,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct } else if (machine_account) { DEBUG(5, ("dcerpc_remote: RPC Proxy: Using machine account\n")); credentials = cli_credentials_init(private); - cli_credentials_set_conf(credentials); + cli_credentials_set_conf(credentials, global_loadparm); if (domain) { cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); } -- cgit From 60a1046c5c5783799bd64fe18e03534670f83d82 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 29 Sep 2007 18:00:19 +0000 Subject: r25430: Add the loadparm context to all parametric options. (This used to be commit fd697d77c9fe67a00939a1f04b35c451316fff58) --- source4/rpc_server/remote/dcesrv_remote.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 7434a32128..40eab55c92 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -40,12 +40,12 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; const struct ndr_interface_table *table; struct dcesrv_remote_private *private; - const char *binding = lp_parm_string(NULL, "dcerpc_remote", "binding"); + const char *binding = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "binding"); const char *user, *pass, *domain; struct cli_credentials *credentials; BOOL machine_account; - machine_account = lp_parm_bool(NULL, "dcerpc_remote", "use_machine_account", false); + machine_account = lp_parm_bool(global_loadparm, NULL, "dcerpc_remote", "use_machine_account", false); private = talloc(dce_call->conn, struct dcesrv_remote_private); if (!private) { @@ -60,9 +60,9 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_INVALID_PARAMETER; } - user = lp_parm_string(NULL, "dcerpc_remote", "user"); - pass = lp_parm_string(NULL, "dcerpc_remote", "password"); - domain = lp_parm_string(NULL, "dceprc_remote", "domain"); + user = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "user"); + pass = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "password"); + domain = lp_parm_string(global_loadparm, NULL, "dceprc_remote", "domain"); table = ndr_table_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */ if (!table) { @@ -224,7 +224,7 @@ static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) { int i; - const char **ifaces = str_list_make(dce_ctx, lp_parm_string(NULL,"dcerpc_remote","interfaces"),NULL); + const char **ifaces = str_list_make(dce_ctx, lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "interfaces"),NULL); if (!ifaces) { DEBUG(3,("remote_op_init_server: no interfaces configured\n")); -- cgit From 05e7c481465e3065effaf21b43636d6605d7c313 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Oct 2007 22:25:41 +0000 Subject: r25553: Convert to standard bool type. (This used to be commit b7371f1a191fb86834c0d586d094f39f0b04544b) --- source4/rpc_server/remote/dcesrv_remote.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 40eab55c92..f009323ae2 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -43,7 +43,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct const char *binding = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "binding"); const char *user, *pass, *domain; struct cli_credentials *credentials; - BOOL machine_account; + bool machine_account; machine_account = lp_parm_bool(global_loadparm, NULL, "dcerpc_remote", "use_machine_account", false); @@ -253,7 +253,7 @@ static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const stru return NT_STATUS_OK; } -static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct ndr_interface_table *if_tabl) +static bool remote_fill_interface(struct dcesrv_interface *iface, const struct ndr_interface_table *if_tabl) { iface->name = if_tabl->name; iface->syntax_id = if_tabl->syntax_id; @@ -268,10 +268,10 @@ static BOOL remote_fill_interface(struct dcesrv_interface *iface, const struct n iface->private = if_tabl; - return True; + return true; } -static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const struct GUID *uuid, uint32_t if_version) +static bool remote_op_interface_by_uuid(struct dcesrv_interface *iface, const struct GUID *uuid, uint32_t if_version) { const struct ndr_interface_list *l; @@ -282,17 +282,17 @@ static BOOL remote_op_interface_by_uuid(struct dcesrv_interface *iface, const st } } - return False; + return false; } -static BOOL remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) +static bool remote_op_interface_by_name(struct dcesrv_interface *iface, const char *name) { const struct ndr_interface_table *tbl = ndr_table_by_name(name); if (tbl) return remote_fill_interface(iface, tbl); - return False; + return false; } NTSTATUS dcerpc_server_remote_init(void) -- cgit From 529763a9aa192a6785ba878aceeb1683c2510913 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 9 Nov 2007 19:24:51 +0100 Subject: r25920: ndr: change NTSTAUS into enum ndr_err_code (samba4 callers) lib/messaging/ lib/registry/ lib/ldb-samba/ librpc/rpc/ auth/auth_winbind.c auth/gensec/ auth/kerberos/ dsdb/repl/ dsdb/samdb/ dsdb/schema/ torture/ cluster/ctdb/ kdc/ ntvfs/ipc/ torture/rap/ ntvfs/ utils/getntacl.c ntptr/ smb_server/ libcli/wrepl/ wrepl_server/ libcli/cldap/ libcli/dgram/ libcli/ldap/ libcli/raw/ libcli/nbt/ libnet/ winbind/ rpc_server/ metze (This used to be commit 6223c7fddc972687eb577e04fc1c8e0604c35435) --- source4/rpc_server/remote/dcesrv_remote.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index f009323ae2..f91334510c 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -124,7 +124,7 @@ static void remote_op_unbind(struct dcesrv_connection_context *context, const st static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_pull *pull, void **r) { - NTSTATUS status; + enum ndr_err_code ndr_err; const struct ndr_interface_table *table = (const struct ndr_interface_table *)dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; @@ -141,8 +141,8 @@ static NTSTATUS remote_op_ndr_pull(struct dcesrv_call_state *dce_call, TALLOC_CT } /* unravel the NDR for the packet */ - status = table->calls[opnum].ndr_pull(pull, NDR_IN, *r); - if (!NT_STATUS_IS_OK(status)) { + ndr_err = table->calls[opnum].ndr_pull(pull, NDR_IN, *r); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { dcerpc_log_packet(table, opnum, NDR_IN, &dce_call->pkt.u.request.stub_and_verifier); dce_call->fault_code = DCERPC_FAULT_NDR; @@ -188,13 +188,13 @@ static NTSTATUS remote_op_dispatch(struct dcesrv_call_state *dce_call, TALLOC_CT static NTSTATUS remote_op_ndr_push(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct ndr_push *push, const void *r) { - NTSTATUS status; + enum ndr_err_code ndr_err; const struct ndr_interface_table *table = dce_call->context->iface->private; uint16_t opnum = dce_call->pkt.u.request.opnum; /* unravel the NDR for the packet */ - status = table->calls[opnum].ndr_push(push, NDR_OUT, r); - if (!NT_STATUS_IS_OK(status)) { + ndr_err = table->calls[opnum].ndr_push(push, NDR_OUT, r); + if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { dce_call->fault_code = DCERPC_FAULT_NDR; return NT_STATUS_NET_WRITE_FAULT; } -- cgit From 57f20ccd242e45ff91850341594aa040d113c19e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 4 Dec 2007 20:05:00 +0100 Subject: r26296: Store loadparm context in DCE/RPC server context. (This used to be commit fc1f4d2d65d4c983cba5421e7ffb64dd75482860) --- source4/rpc_server/remote/dcesrv_remote.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index f91334510c..613b53519a 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -40,12 +40,12 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct NTSTATUS status; const struct ndr_interface_table *table; struct dcesrv_remote_private *private; - const char *binding = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "binding"); + const char *binding = lp_parm_string(dce_call->conn->dce_ctx->lp_ctx, NULL, "dcerpc_remote", "binding"); const char *user, *pass, *domain; struct cli_credentials *credentials; bool machine_account; - machine_account = lp_parm_bool(global_loadparm, NULL, "dcerpc_remote", "use_machine_account", false); + machine_account = lp_parm_bool(dce_call->conn->dce_ctx->lp_ctx, NULL, "dcerpc_remote", "use_machine_account", false); private = talloc(dce_call->conn, struct dcesrv_remote_private); if (!private) { @@ -60,9 +60,9 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct return NT_STATUS_INVALID_PARAMETER; } - user = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "user"); - pass = lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "password"); - domain = lp_parm_string(global_loadparm, NULL, "dceprc_remote", "domain"); + user = lp_parm_string(dce_call->conn->dce_ctx->lp_ctx, NULL, "dcerpc_remote", "user"); + pass = lp_parm_string(dce_call->conn->dce_ctx->lp_ctx, NULL, "dcerpc_remote", "password"); + domain = lp_parm_string(dce_call->conn->dce_ctx->lp_ctx, NULL, "dceprc_remote", "domain"); table = ndr_table_by_uuid(&iface->syntax_id.uuid); /* FIXME: What about if_version ? */ if (!table) { @@ -76,7 +76,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct if (!credentials) { return NT_STATUS_NO_MEMORY; } - cli_credentials_set_conf(credentials, global_loadparm); + cli_credentials_set_conf(credentials, dce_call->conn->dce_ctx->lp_ctx); cli_credentials_set_username(credentials, user, CRED_SPECIFIED); if (domain) { cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); @@ -85,7 +85,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct } else if (machine_account) { DEBUG(5, ("dcerpc_remote: RPC Proxy: Using machine account\n")); credentials = cli_credentials_init(private); - cli_credentials_set_conf(credentials, global_loadparm); + cli_credentials_set_conf(credentials, dce_call->conn->dce_ctx->lp_ctx); if (domain) { cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); } @@ -224,7 +224,7 @@ static NTSTATUS remote_register_one_iface(struct dcesrv_context *dce_ctx, const static NTSTATUS remote_op_init_server(struct dcesrv_context *dce_ctx, const struct dcesrv_endpoint_server *ep_server) { int i; - const char **ifaces = str_list_make(dce_ctx, lp_parm_string(global_loadparm, NULL, "dcerpc_remote", "interfaces"),NULL); + const char **ifaces = str_list_make(dce_ctx, lp_parm_string(dce_ctx->lp_ctx, NULL, "dcerpc_remote", "interfaces"),NULL); if (!ifaces) { DEBUG(3,("remote_op_init_server: no interfaces configured\n")); -- cgit From 4c4323009fa83f00ed319de59a3aad48fcd65994 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 7 Dec 2007 02:37:04 +0100 Subject: r26327: Explicit loadparm_context for RPC client functions. (This used to be commit eeb2251d22b3d6e0379444a73af69d1014692b07) --- source4/rpc_server/remote/dcesrv_remote.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 613b53519a..3b5c0a02ae 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -103,7 +103,8 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct status = dcerpc_pipe_connect(private, &(private->c_pipe), binding, table, - credentials, dce_call->event_ctx); + credentials, dce_call->event_ctx, + dce_call->conn->dce_ctx->lp_ctx); talloc_free(credentials); if (!NT_STATUS_IS_OK(status)) { -- cgit From a2cea02584256e2cf59da5420e8e080e70c66939 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 13 Dec 2007 22:46:17 +0100 Subject: r26430: require explicit specification of loadparm context. (This used to be commit 1b947fe0e6e16318e5a8127bb4932d6b5d20bcf6) --- source4/rpc_server/remote/dcesrv_remote.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/rpc_server/remote/dcesrv_remote.c') diff --git a/source4/rpc_server/remote/dcesrv_remote.c b/source4/rpc_server/remote/dcesrv_remote.c index 3b5c0a02ae..cd32160d88 100644 --- a/source4/rpc_server/remote/dcesrv_remote.c +++ b/source4/rpc_server/remote/dcesrv_remote.c @@ -89,7 +89,7 @@ static NTSTATUS remote_op_bind(struct dcesrv_call_state *dce_call, const struct if (domain) { cli_credentials_set_domain(credentials, domain, CRED_SPECIFIED); } - status = cli_credentials_set_machine_account(credentials); + status = cli_credentials_set_machine_account(credentials, dce_call->conn->dce_ctx->lp_ctx); if (!NT_STATUS_IS_OK(status)) { return status; } -- cgit