librpc/rpc: add dcerpc_binding_set_pointer_option()
authorStefan Metzmacher <metze@samba.org>
Thu, 16 Jan 2014 10:10:46 +0000 (11:10 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 10:43:20 +0000 (12:43 +0200)
This allows the caller to set a talloc pointer
as [<name>:pointer:<pid>:<type>=<address>]
(e.g. [connection:pointer:12345:struct smbXcli_conn=0xf0123456789abcde])
option of a dcerpc_binding.

Callers have to be careful to keep the pointer valid!

Signed-off-by: Stefan Metzmacher <metze@samba.org>
librpc/rpc/binding.c
librpc/rpc/rpc_common.h

index 1ae32e03dc25734ed23768cb877035d20a50c00c..677f66c1b144f8f36b1e20df70e5355768e2b186 100644 (file)
@@ -994,6 +994,33 @@ _PUBLIC_ void *_dcerpc_binding_get_pointer_option(const struct dcerpc_binding *b
        return (void *)vp;
 }
 
+_PUBLIC_ NTSTATUS _dcerpc_binding_set_pointer_option(struct dcerpc_binding *b,
+                                                    const char *name,
+                                                    const char *type,
+                                                    const void *vp)
+{
+       char tsbuf[256];
+       char vsbuf[20];
+       const char *vs = NULL;
+
+       if (strlen(name) > 100) {
+               return NT_STATUS_INVALID_PARAMETER_MIX;
+       }
+
+       if (strlen(type) > 100) {
+               return NT_STATUS_INVALID_PARAMETER_MIX;
+       }
+
+       snprintf(tsbuf, sizeof(tsbuf), "%s:pointer:%d:%s", name, getpid(), type);
+
+       if (vp != NULL) {
+               snprintf(vsbuf, sizeof(vsbuf), "%p", vp);
+               vs = vsbuf;
+       }
+
+       return dcerpc_binding_set_string_option(b, tsbuf, vs);
+}
+
 _PUBLIC_ uint32_t dcerpc_binding_get_flags(const struct dcerpc_binding *b)
 {
        return b->flags;
index a9711e38e4eb68d51d943dcd287d6a52bbbdce92..1fbdb665f9f3e95ebbc61cdce3e358c834009f9b 100644 (file)
@@ -159,6 +159,12 @@ void *_dcerpc_binding_get_pointer_option(const struct dcerpc_binding *b,
                                         const char *type);
 #define dcerpc_binding_get_pointer_option(b, name, type) \
        talloc_get_type(_dcerpc_binding_get_pointer_option(b, name, #type), type)
+NTSTATUS _dcerpc_binding_set_pointer_option(struct dcerpc_binding *b,
+                                           const char *name,
+                                           const char *type,
+                                           const void *vp);
+#define dcerpc_binding_set_pointer_option(b, name, type, vp) \
+       _dcerpc_binding_set_pointer_option(b, name, #type, vp)
 uint32_t dcerpc_binding_get_flags(const struct dcerpc_binding *b);
 NTSTATUS dcerpc_binding_set_flags(struct dcerpc_binding *b,
                                  uint32_t additional,