witness: autogenerate the marshalling of the witness_notifyResponse_message.
authorGünther Deschner <gd@samba.org>
Thu, 25 Jun 2015 14:24:06 +0000 (16:24 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 3 Jul 2015 00:00:27 +0000 (02:00 +0200)
Guenther

Signed-off-by: Günther Deschner <gd@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
librpc/idl/witness.idl
librpc/ndr/ndr_witness.c [new file with mode: 0644]
librpc/ndr/ndr_witness.h [new file with mode: 0644]
librpc/wscript_build
source3/rpcclient/cmd_witness.c

index e56686998f83e9190ad46c6f9c5aa529dc775f7c..febae2524a0e2f2cef96bbc17cbee1adcab7cbb3 100644 (file)
@@ -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 (file)
index 0000000..40586f4
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 (file)
index 0000000..e4dd3df
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+
+_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);
index 133666d547cb56d251c2e436dc0326e7388a39bf..212733aa284196bd38cd7804da6d4e0f269a5635 100644 (file)
@@ -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'
     )
 
index 315fa50bbe4f2523b48dab6298bdd1623bfa4f08..fa6f5bb411ab8954ed351b7af930dff7eeece837 100644 (file)
@@ -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);