From 82c4b92661428bf8eda383004f6e74b86e5572b5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?G=C3=BCnther=20Deschner?= Date: Thu, 25 Jun 2015 16:24:06 +0200 Subject: [PATCH] witness: autogenerate the marshalling of the witness_notifyResponse_message. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Guenther Signed-off-by: Günther Deschner Reviewed-by: Stefan Metzmacher --- librpc/idl/witness.idl | 11 ++-- librpc/ndr/ndr_witness.c | 110 ++++++++++++++++++++++++++++++++++++++++ librpc/ndr/ndr_witness.h | 23 +++++++++ librpc/wscript_build | 2 +- source3/rpcclient/cmd_witness.c | 2 + 5 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 librpc/ndr/ndr_witness.c create mode 100644 librpc/ndr/ndr_witness.h diff --git a/librpc/idl/witness.idl b/librpc/idl/witness.idl index e56686998f8..febae2524a0 100644 --- a/librpc/idl/witness.idl +++ b/librpc/idl/witness.idl @@ -7,6 +7,7 @@ import "misc.idl"; version(1.1), pointer_default(unique), helpstring("SMB Witness Service"), + helper("../librpc/ndr/ndr_witness.h"), endpoint("ncacn_ip_tcp:") ] interface witness @@ -71,7 +72,7 @@ interface witness /*****************/ /* Function 0x03 */ - typedef [v1_enum] enum { + typedef [v1_enum,public] enum { WITNESS_NOTIFY_RESOURCE_CHANGE = 1, WITNESS_NOTIFY_CLIENT_MOVE = 2, WITNESS_NOTIFY_SHARE_MOVE = 3, @@ -118,13 +119,11 @@ interface witness [default,flag(NDR_REMAINING)] DATA_BLOB data; } witness_notifyResponse_message; - typedef [flag(NDR_PAHEX)] struct { + typedef [flag(NDR_PAHEX),gensize,public,nopush,nopull] struct { witness_notifyResponse_type type; - [value(messages->length)] uint32 length; + [value(ndr_size_witness_notifyResponse(r, ndr->flags)-20)] uint32 length; uint32 num; - /* [switch_is(type), size_is(num)] witness_notifyResponse_message *messages; */ - /* [size_is(length)] uint8 *messages; */ - [subcontext(4), subcontext_size(length), flag(NDR_REMAINING)] DATA_BLOB *messages; + [subcontext(4), subcontext_size(length), flag(NDR_REMAINING), switch_is(type)] witness_notifyResponse_message messages[num]; } witness_notifyResponse; [public] WERROR witness_AsyncNotify( diff --git a/librpc/ndr/ndr_witness.c b/librpc/ndr/ndr_witness.c new file mode 100644 index 00000000000..40586f41b13 --- /dev/null +++ b/librpc/ndr/ndr_witness.c @@ -0,0 +1,110 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling witness structures + + Copyright (C) Guenther Deschner 2015 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "librpc/gen_ndr/ndr_witness.h" + +_PUBLIC_ enum ndr_err_code ndr_push_witness_notifyResponse(struct ndr_push *ndr, int ndr_flags, const struct witness_notifyResponse *r) +{ + uint32_t cntr_messages_0; + { + uint32_t _flags_save_STRUCT = ndr->flags; + ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX); + NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags); + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_push_align(ndr, 4)); + NDR_CHECK(ndr_push_witness_notifyResponse_type(ndr, NDR_SCALARS, r->type)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_witness_notifyResponse(r, ndr->flags) - 20)); + NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num)); + NDR_CHECK(ndr_push_unique_ptr(ndr, r->messages)); + if (r->messages) { + uint32_t _flags_save_witness_notifyResponse_message = ndr->flags; + ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); + { + struct ndr_push *_ndr_messages; + NDR_CHECK(ndr_push_subcontext_start(ndr, &_ndr_messages, 4, ndr_size_witness_notifyResponse(r, ndr->flags) - 20)); + for (cntr_messages_0 = 0; cntr_messages_0 < (r->num); cntr_messages_0++) { + NDR_CHECK(ndr_push_set_switch_value(_ndr_messages, &r->messages[cntr_messages_0], r->type)); + NDR_CHECK(ndr_push_witness_notifyResponse_message(_ndr_messages, NDR_SCALARS, &r->messages[cntr_messages_0])); + } + NDR_CHECK(ndr_push_subcontext_end(ndr, _ndr_messages, 4, ndr_size_witness_notifyResponse(r, ndr->flags) - 20)); + } + ndr->flags = _flags_save_witness_notifyResponse_message; + } + NDR_CHECK(ndr_push_trailer_align(ndr, 4)); + } + if (ndr_flags & NDR_BUFFERS) { + } + ndr->flags = _flags_save_STRUCT; + } + return NDR_ERR_SUCCESS; +} + +_PUBLIC_ enum ndr_err_code ndr_pull_witness_notifyResponse(struct ndr_pull *ndr, int ndr_flags, struct witness_notifyResponse *r) +{ + uint32_t size_messages_0 = 0; + uint32_t cntr_messages_0; + TALLOC_CTX *_mem_save_messages_0; + { + uint32_t _flags_save_STRUCT = ndr->flags; + ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX); + NDR_PULL_CHECK_FLAGS(ndr, ndr_flags); + if (ndr_flags & NDR_SCALARS) { + NDR_CHECK(ndr_pull_align(ndr, 4)); + NDR_CHECK(ndr_pull_witness_notifyResponse_type(ndr, NDR_SCALARS, &r->type)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->length)); + NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num)); + { + uint32_t _flags_save_witness_notifyResponse_message = ndr->flags; + uint32_t _ptr_messages; + ndr_set_flags(&ndr->flags, LIBNDR_FLAG_REMAINING); + NDR_CHECK(ndr_pull_generic_ptr(ndr, &_ptr_messages)); + if (_ptr_messages) { + NDR_PULL_ALLOC(ndr, r->messages); + } else { + r->messages = NULL; + } + if (r->messages) { + size_messages_0 = r->num; + NDR_PULL_ALLOC_N(ndr, r->messages, size_messages_0); + _mem_save_messages_0 = NDR_PULL_GET_MEM_CTX(ndr); + NDR_PULL_SET_MEM_CTX(ndr, r->messages, 0); + { + struct ndr_pull *_ndr_messages; + NDR_CHECK(ndr_pull_subcontext_start(ndr, &_ndr_messages, 4, r->length)); + for (cntr_messages_0 = 0; cntr_messages_0 < (size_messages_0); cntr_messages_0++) { + NDR_CHECK(ndr_pull_set_switch_value(_ndr_messages, &r->messages[cntr_messages_0], r->type)); + NDR_CHECK(ndr_pull_witness_notifyResponse_message(_ndr_messages, NDR_SCALARS, &r->messages[cntr_messages_0])); + } + NDR_CHECK(ndr_pull_subcontext_end(ndr, _ndr_messages, 4, r->length)); + } + } + NDR_PULL_SET_MEM_CTX(ndr, _mem_save_messages_0, 0); + ndr->flags = _flags_save_witness_notifyResponse_message; + } + NDR_CHECK(ndr_pull_trailer_align(ndr, 4)); + } + if (ndr_flags & NDR_BUFFERS) { + } + ndr->flags = _flags_save_STRUCT; + } + return NDR_ERR_SUCCESS; +} diff --git a/librpc/ndr/ndr_witness.h b/librpc/ndr/ndr_witness.h new file mode 100644 index 00000000000..e4dd3df63c6 --- /dev/null +++ b/librpc/ndr/ndr_witness.h @@ -0,0 +1,23 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling witness structures + + Copyright (C) Guenther Deschner 2015 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +_PUBLIC_ enum ndr_err_code ndr_push_witness_notifyResponse(struct ndr_push *ndr, int ndr_flags, const struct witness_notifyResponse *r); +_PUBLIC_ enum ndr_err_code ndr_pull_witness_notifyResponse(struct ndr_pull *ndr, int ndr_flags, struct witness_notifyResponse *r); diff --git a/librpc/wscript_build b/librpc/wscript_build index 133666d547c..212733aa284 100644 --- a/librpc/wscript_build +++ b/librpc/wscript_build @@ -321,7 +321,7 @@ bld.SAMBA_SUBSYSTEM('NDR_FSRVP', ) bld.SAMBA_SUBSYSTEM('NDR_WITNESS', - source='gen_ndr/ndr_witness.c', + source='gen_ndr/ndr_witness.c ndr/ndr_witness.c', public_deps='ndr' ) diff --git a/source3/rpcclient/cmd_witness.c b/source3/rpcclient/cmd_witness.c index 315fa50bbe4..fa6f5bb411a 100644 --- a/source3/rpcclient/cmd_witness.c +++ b/source3/rpcclient/cmd_witness.c @@ -475,6 +475,7 @@ static WERROR cmd_witness_AsyncNotify(struct rpc_pipe_client *cli, } d_printf(" with %d messages\n", response->num); +#if 0 if (read_response) { unsigned n; const uint8_t *pos = response->messages->data; @@ -483,6 +484,7 @@ static WERROR cmd_witness_AsyncNotify(struct rpc_pipe_client *cli, read_response(frame, &pos); } } +#endif done: talloc_free(frame); -- 2.11.4.GIT