]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:rpc_client: implement rpccli_bh_get_binding()
authorStefan Metzmacher <metze@samba.org>
Tue, 17 Sep 2024 20:21:23 +0000 (22:21 +0200)
committerJule Anger <janger@samba.org>
Thu, 12 Jun 2025 11:27:15 +0000 (11:27 +0000)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit fffc6e0f37a2d6a6612e17ad6fa777ae6a8eb3b6)

source3/rpc_client/cli_pipe.c

index c1819ad991d048c02eeba08e8f5de54ed190edb1..9e9b9fe38b2c8083dd299c29958093b56ea7a33b 100644 (file)
@@ -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;
 }