librpc/rpc: add dcerpc_binding_set_string_option()
authorStefan Metzmacher <metze@samba.org>
Thu, 16 Jan 2014 10:10:46 +0000 (11:10 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 13 Feb 2014 10:54:14 +0000 (11:54 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
librpc/rpc/binding.c
librpc/rpc/rpc_common.h

index 277900c73556de8666905ea72e86292ad95f1b23..2866dda56645a1457b020ea9e5aea9f58790c8b3 100644 (file)
@@ -457,6 +457,73 @@ _PUBLIC_ const char *dcerpc_binding_get_string_option(const struct dcerpc_bindin
        return NULL;
 }
 
+_PUBLIC_ NTSTATUS dcerpc_binding_set_string_option(struct dcerpc_binding *b,
+                                                  const char *name,
+                                                  const char *value)
+{
+       const char *opt = NULL;
+       char *tmp;
+       size_t name_len = strlen(name);
+       size_t i;
+
+       /*
+        * Note: value == NULL, means delete it.
+        * value != NULL means add or reset.
+        */
+
+       for (i=0; b->options && b->options[i]; i++) {
+               const char *o = b->options[i];
+               int ret;
+
+               ret = strncmp(name, o, name_len);
+               if (ret != 0) {
+                       continue;
+               }
+
+               if (o[name_len] != '=') {
+                       continue;
+               }
+
+               opt = o;
+               break;
+       }
+
+       if (opt == NULL) {
+               const char **n;
+
+               if (value == NULL) {
+                       return NT_STATUS_OK;
+               }
+
+               n = talloc_realloc(b, b->options, const char *, i + 2);
+               if (n == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+               n[i] = NULL;
+               n[i + 1] = NULL;
+               b->options = n;
+       }
+
+       tmp = discard_const_p(char, opt);
+
+       if (value == NULL) {
+               for (;b->options[i];i++) {
+                       b->options[i] = b->options[i+1];
+               }
+               talloc_free(tmp);
+               return NT_STATUS_OK;
+       }
+
+       b->options[i] = talloc_asprintf(b->options, "%s=%s",
+                                       name, value);
+       if (b->options[i] == NULL) {
+               b->options[i] = tmp;
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       return NT_STATUS_OK;
+}
+
 _PUBLIC_ NTSTATUS dcerpc_floor_get_lhs_data(const struct epm_floor *epm_floor,
                                            struct ndr_syntax_id *syntax)
 {
index 89312ce620fd175a74025ba0cbbac85f846ed80a..136f9a90a773fa7e2052b306a2aef9e9737a4b59 100644 (file)
@@ -138,6 +138,9 @@ NTSTATUS dcerpc_parse_binding(TALLOC_CTX *mem_ctx, const char *s, struct dcerpc_
 char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_binding *b);
 const char *dcerpc_binding_get_string_option(const struct dcerpc_binding *b,
                                             const char *name);
+NTSTATUS dcerpc_binding_set_string_option(struct dcerpc_binding *b,
+                                         const char *name,
+                                         const char *value);
 NTSTATUS dcerpc_floor_get_lhs_data(const struct epm_floor *epm_floor, struct ndr_syntax_id *syntax);
 const char *derpc_transport_string_by_transport(enum dcerpc_transport_t t);
 enum dcerpc_transport_t dcerpc_transport_by_name(const char *name);