From: Stefan Metzmacher Date: Tue, 17 Sep 2024 20:21:23 +0000 (+0200) Subject: s3:rpc_client: implement rpccli_bh_get_binding() X-Git-Tag: tdb-1.4.13~1105 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fffc6e0f37a2d6a6612e17ad6fa777ae6a8eb3b6;p=thirdparty%2Fsamba.git s3:rpc_client: implement rpccli_bh_get_binding() Signed-off-by: Stefan Metzmacher Reviewed-by: Ralph Boehme --- diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c index c1819ad991d..9e9b9fe38b2 100644 --- a/source3/rpc_client/cli_pipe.c +++ b/source3/rpc_client/cli_pipe.c @@ -2105,8 +2105,17 @@ bool rpccli_is_connected(struct rpc_pipe_client *rpc_cli) struct rpccli_bh_state { struct rpc_pipe_client *rpc_cli; + struct dcerpc_binding *binding; }; +static const struct dcerpc_binding *rpccli_bh_get_binding(struct dcerpc_binding_handle *h) +{ + struct rpccli_bh_state *hs = dcerpc_binding_handle_data(h, + struct rpccli_bh_state); + + return hs->binding; +} + static bool rpccli_bh_is_connected(struct dcerpc_binding_handle *h) { struct rpccli_bh_state *hs = dcerpc_binding_handle_data(h, @@ -2401,6 +2410,7 @@ static void rpccli_bh_do_ndr_print(struct dcerpc_binding_handle *h, static const struct dcerpc_binding_handle_ops rpccli_bh_ops = { .name = "rpccli", + .get_binding = rpccli_bh_get_binding, .is_connected = rpccli_bh_is_connected, .set_timeout = rpccli_bh_set_timeout, .transport_session_key = rpccli_bh_transport_session_key, @@ -2420,8 +2430,10 @@ struct dcerpc_binding_handle *rpccli_bh_create(struct rpc_pipe_client *c, const struct GUID *object, const struct ndr_interface_table *table) { - struct dcerpc_binding_handle *h; - struct rpccli_bh_state *hs; + struct dcerpc_binding_handle *h = NULL; + struct rpccli_bh_state *hs = NULL; + struct dcerpc_binding *b = NULL; + NTSTATUS status; h = dcerpc_binding_handle_create(c, &rpccli_bh_ops, @@ -2435,6 +2447,34 @@ struct dcerpc_binding_handle *rpccli_bh_create(struct rpc_pipe_client *c, } hs->rpc_cli = c; + status = dcerpc_parse_binding(hs, "", &b); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(h); + return NULL; + } + status = dcerpc_binding_set_transport(b, c->transport->transport); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(h); + return NULL; + } + status = dcerpc_binding_set_string_option(b, "host", c->desthost); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(h); + return NULL; + } + status = dcerpc_binding_set_string_option(b, "target_hostname", c->desthost); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(h); + return NULL; + } + status = dcerpc_binding_set_abstract_syntax(b, &table->syntax_id); + if (!NT_STATUS_IS_OK(status)) { + TALLOC_FREE(h); + return NULL; + } + + hs->binding = b; + return h; }