librpc/ndr: Add ndr_push_steal_switch_value()
authorAndrew Bartlett <abartlet@samba.org>
Wed, 27 Nov 2019 03:01:02 +0000 (16:01 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 12 Dec 2019 02:30:40 +0000 (02:30 +0000)
This will allow generated code to instead push and pop union values onto the
switch_list stack, which is more memory efficient than creating a single large
list to be scannned and eventually discarded.

Merge into unreleased ABI 1.0.0

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13876

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
librpc/ABI/ndr-1.0.0.sigs
librpc/ndr/libndr.h
librpc/ndr/ndr.c

index ffb3d0763fcacb0fa22ba89a3d0c79f333421875..144e65fba759be96fd679e5c202467166530d6d4 100644 (file)
@@ -215,6 +215,7 @@ ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, cons
 ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *)
 ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *)
 ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *)
+ndr_push_steal_switch_value: uint32_t (struct ndr_push *, const void *)
 ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *)
 ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **)
 ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t)
index 392ab76cc94fb3db02f94cadef8b1ffc7ded5877..a35283a18b019fbe6a4767665e8d66f3e1ca20e2 100644 (file)
@@ -617,6 +617,7 @@ enum ndr_err_code ndr_push_set_switch_value(struct ndr_push *ndr, const void *p,
 enum ndr_err_code ndr_pull_set_switch_value(struct ndr_pull *ndr, const void *p, uint32_t val);
 enum ndr_err_code ndr_print_set_switch_value(struct ndr_print *ndr, const void *p, uint32_t val);
 uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p);
+uint32_t ndr_push_steal_switch_value(struct ndr_push *ndr, const void *p);
 uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p);
 uint32_t ndr_print_get_switch_value(struct ndr_print *ndr, const void *p);
 uint32_t ndr_pull_steal_switch_value(struct ndr_pull *ndr, const void *p);
index 0272509a01fd932cd558bf4b00e21a2e6765382e..379bc081fd2f5d3e0bd2e3a7b2f10a383f233244 100644 (file)
@@ -1238,6 +1238,20 @@ _PUBLIC_ uint32_t ndr_push_get_switch_value(struct ndr_push *ndr, const void *p)
        return ndr_token_peek(&ndr->switch_list, p);
 }
 
+/* retrieve a switch value (for push) and remove it from the list */
+_PUBLIC_ uint32_t ndr_push_steal_switch_value(struct ndr_push *ndr, const void *p)
+{
+       enum ndr_err_code status;
+       uint32_t v;
+
+       status = ndr_token_retrieve(&ndr->switch_list, p, &v);
+       if (!NDR_ERR_CODE_IS_SUCCESS(status)) {
+               return 0;
+       }
+
+       return v;
+}
+
 _PUBLIC_ uint32_t ndr_pull_get_switch_value(struct ndr_pull *ndr, const void *p)
 {
        return ndr_token_peek(&ndr->switch_list, p);