From: Andrew Bartlett Date: Wed, 27 Nov 2019 03:01:02 +0000 (+1300) Subject: librpc/ndr: Add ndr_push_steal_switch_value() X-Git-Tag: ldb-2.1.0~266 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1a15710a4c1c96c9d9fdf932357749cc5ed4d7a;p=thirdparty%2Fsamba.git librpc/ndr: Add ndr_push_steal_switch_value() 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 Reviewed-by: Gary Lockyer --- diff --git a/librpc/ABI/ndr-1.0.0.sigs b/librpc/ABI/ndr-1.0.0.sigs index ffb3d0763fc..144e65fba75 100644 --- a/librpc/ABI/ndr-1.0.0.sigs +++ b/librpc/ABI/ndr-1.0.0.sigs @@ -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) diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index 392ab76cc94..a35283a18b0 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -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); diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 0272509a01f..379bc081fd2 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -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);