diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-05-10 23:33:56 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:16:37 -0500 |
commit | 2f2fc84a7c6724f6eab39bf301be70ba5bec15cc (patch) | |
tree | 13eb42b0238a5744bb2f368f8e686d350287afe5 /source4/librpc/ndr/ndr.c | |
parent | 398a3130f5166d4a4d455529ae3048316510f867 (diff) | |
download | samba-2f2fc84a7c6724f6eab39bf301be70ba5bec15cc.tar.gz samba-2f2fc84a7c6724f6eab39bf301be70ba5bec15cc.tar.xz samba-2f2fc84a7c6724f6eab39bf301be70ba5bec15cc.zip |
r6720: added support for the remaining 2 types of CLDAP netlogon
response.
To work around the fact that the type of the returned data is not
encoded in the packet, this required adding ndr_pull_union_blob()
which allows us to pull a blob into a union with a specified switch
value, in this case the switch value comes from the calling NtVer field.
(This used to be commit bd27e626c27be72913d1a1569ee6e2e2711df84e)
Diffstat (limited to 'source4/librpc/ndr/ndr.c')
-rw-r--r-- | source4/librpc/ndr/ndr.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/source4/librpc/ndr/ndr.c b/source4/librpc/ndr/ndr.c index 79af5967c7..7beb64942a 100644 --- a/source4/librpc/ndr/ndr.c +++ b/source4/librpc/ndr/ndr.c @@ -325,6 +325,23 @@ void ndr_print_debug(ndr_print_fn_t fn, const char *name, void *ptr) } /* + a useful helper function for printing idl unions via DEBUG() +*/ +void ndr_print_union_debug(ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr) +{ + struct ndr_print *ndr; + + ndr = talloc_zero(NULL, struct ndr_print); + if (!ndr) return; + ndr->print = ndr_print_debug_helper; + ndr->depth = 1; + ndr->flags = 0; + ndr_print_set_switch_value(ndr, ptr, level); + fn(ndr, name, ptr); + talloc_free(ndr); +} + +/* a useful helper function for printing idl function calls via DEBUG() */ void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int flags, void *ptr) @@ -781,6 +798,28 @@ NTSTATUS ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, vo } /* + pull a union from a blob using NDR, given the union discriminator +*/ +NTSTATUS ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, + uint32_t level, ndr_pull_flags_fn_t fn) +{ + struct ndr_pull *ndr; + NTSTATUS status; + + ndr = ndr_pull_init_blob(blob, mem_ctx); + if (!ndr) { + return NT_STATUS_NO_MEMORY; + } + ndr_pull_set_switch_value(ndr, p, level); + status = fn(ndr, NDR_SCALARS|NDR_BUFFERS, p); + if (!NT_STATUS_IS_OK(status)) return status; + if (ndr->offset != ndr->data_size) { + return NT_STATUS_BUFFER_TOO_SMALL; + } + return status; +} + +/* push a struct to a blob using NDR */ NTSTATUS ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, |