frsrpc.idl: make the chunk array in frsrpc_CommPktChunkCtr dynamic
authorStefan Metzmacher <metze@samba.org>
Tue, 21 Jul 2009 14:48:06 +0000 (16:48 +0200)
committerStefan Metzmacher <metze@samba.org>
Tue, 21 Jul 2009 17:11:24 +0000 (19:11 +0200)
We add an extra num_chunks to the frsrpc_CommPktChunkCtr structure
and use hand modified ndr_push/pull functions to let it not appear
on the wire.

metze

librpc/idl/frsrpc.idl
librpc/ndr/ndr_frsrpc.c [new file with mode: 0644]
librpc/ndr/ndr_frsrpc.h [new file with mode: 0644]
source4/librpc/config.mk

index 54f143c1f1a96b211b4fcc506a776a89e11af2c7..233fbcb174496ced9f1faf9f6d8c066c13b5a495 100644 (file)
@@ -7,6 +7,7 @@ import "misc.idl";
   version(1.1),
   endpoint("ncacn_ip_tcp:", "ncalrpc:"),
   helpstring("File Replication Service"),
+  helper("../librpc/ndr/ndr_frsrpc.h"),
   pointer_default(unique)
 ] 
 interface frsrpc
@@ -304,14 +305,14 @@ interface frsrpc
                        [value(0xFFFFFFFF)] uint32 bop;
        } frsrpc_CommPktChunkData;
 
-       typedef [flag(NDR_NOALIGN)] struct {
+       typedef [public,flag(NDR_NOALIGN)] struct {
                frsrpc_CommPktChunkType type;
                [subcontext(4),switch_is(type)] frsrpc_CommPktChunkData data;
        } frsrpc_CommPktChunk;
 
-       typedef [gensize,flag(NDR_NOALIGN)] struct {
-               /* TODO: make this dynamic */
-               frsrpc_CommPktChunk chunks[9];
+       typedef [nopull,nopush,flag(NDR_NOALIGN)] struct {
+               uint32 num_chunks; /* this doesn't appear on the wire */
+               frsrpc_CommPktChunk chunks[num_chunks];
        } frsrpc_CommPktChunkCtr;
 
        typedef [v1_enum] enum {
diff --git a/librpc/ndr/ndr_frsrpc.c b/librpc/ndr/ndr_frsrpc.c
new file mode 100644 (file)
index 0000000..c997459
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   helper routines for FRSRPC marshalling
+
+   Copyright (C) Stefan (metze) Metzmacher 2009
+
+   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 "replace.h"
+#include "librpc/gen_ndr/ndr_frsrpc.h"
+
+enum ndr_err_code ndr_push_frsrpc_CommPktChunkCtr(struct ndr_push *ndr,
+                                       int ndr_flags,
+                                       const struct frsrpc_CommPktChunkCtr *r)
+{
+       uint32_t cntr_chunks_0;
+       {
+               uint32_t _flags_save_STRUCT = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+               if (ndr_flags & NDR_SCALARS) {
+                       NDR_CHECK(ndr_push_align(ndr, 2));
+                       for (cntr_chunks_0 = 0; cntr_chunks_0 < r->num_chunks; cntr_chunks_0++) {
+                               NDR_CHECK(ndr_push_frsrpc_CommPktChunk(ndr, NDR_SCALARS, &r->chunks[cntr_chunks_0]));
+                       }
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+               }
+               ndr->flags = _flags_save_STRUCT;
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+#define _TMP_PULL_REALLOC_N(ndr, s, t, n) do { \
+       _NDR_PULL_FIX_CURRENT_MEM_CTX(ndr);\
+       (s) = talloc_realloc(ndr->current_mem_ctx, (s), t, n); \
+       if (!(s)) { \
+               return ndr_pull_error(ndr, NDR_ERR_ALLOC, \
+                                     "Alloc %u * %s failed: %s\n", \
+                                     (unsigned)n, # s, __location__); \
+       } \
+} while (0)
+
+enum ndr_err_code ndr_pull_frsrpc_CommPktChunkCtr(struct ndr_pull *ndr,
+                                       int ndr_flags,
+                                       struct frsrpc_CommPktChunkCtr *r)
+{
+       uint32_t cntr_chunks_0;
+       {
+               uint32_t _flags_save_STRUCT = ndr->flags;
+               ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+               if (ndr_flags & NDR_SCALARS) {
+                       uint32_t remaining = ndr->data_size - ndr->offset;
+                       r->num_chunks = 0;
+                       r->chunks = NULL;
+                       for (cntr_chunks_0 = 0; remaining > 0; cntr_chunks_0++) {
+                               r->num_chunks += 1;
+                               _TMP_PULL_REALLOC_N(ndr, r->chunks,
+                                                   struct frsrpc_CommPktChunk,
+                                                   r->num_chunks);
+                               NDR_CHECK(ndr_pull_frsrpc_CommPktChunk(ndr,
+                                               NDR_SCALARS,
+                                               &r->chunks[cntr_chunks_0]));
+                               remaining = ndr->data_size - ndr->offset;
+                       }
+               }
+               if (ndr_flags & NDR_BUFFERS) {
+               }
+               ndr->flags = _flags_save_STRUCT;
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+size_t ndr_size_frsrpc_CommPktChunkCtr(const struct frsrpc_CommPktChunkCtr *r,
+                                      struct smb_iconv_convenience *ic,
+                                      int flags)
+{
+       flags |= LIBNDR_FLAG_NOALIGN;
+       return ndr_size_struct(r, flags,
+                       (ndr_push_flags_fn_t)ndr_push_frsrpc_CommPktChunkCtr,
+                       ic);
+}
diff --git a/librpc/ndr/ndr_frsrpc.h b/librpc/ndr/ndr_frsrpc.h
new file mode 100644 (file)
index 0000000..e8dc769
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   helper routines for FRSRPC marshalling
+
+   Copyright (C) Stefan (metze) Metzmacher 2009
+
+   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/>.
+*/
+
+#ifndef _LIBRPC_NDR_NDR_FRSRPC_H
+#define _LIBRPC_NDR_NDR_FRSRPC_H
+
+enum ndr_err_code ndr_push_frsrpc_CommPktChunkCtr(struct ndr_push *ndr,
+                                       int ndr_flags,
+                                       const struct frsrpc_CommPktChunkCtr *r);
+enum ndr_err_code ndr_pull_frsrpc_CommPktChunkCtr(struct ndr_pull *ndr,
+                                       int ndr_flags,
+                                       struct frsrpc_CommPktChunkCtr *r);
+size_t ndr_size_frsrpc_CommPktChunkCtr(const struct frsrpc_CommPktChunkCtr *r,
+                                      struct smb_iconv_convenience *ic,
+                                      int flags);
+
+#endif /* _LIBRPC_NDR_NDR_FRSRPC_H */
index 9e3d6b27ea92bdc2d493d872a8a55494c23aef9d..e96cf2c5160224f2e22a1d335efa4dd1aedbd9ba 100644 (file)
@@ -112,7 +112,7 @@ NDR_ROT_OBJ_FILES = ../librpc/gen_ndr/ndr_rot.o
 [SUBSYSTEM::NDR_FRSRPC]
 PUBLIC_DEPENDENCIES = LIBNDR
 
-NDR_FRSRPC_OBJ_FILES = ../librpc/gen_ndr/ndr_frsrpc.o
+NDR_FRSRPC_OBJ_FILES = ../librpc/gen_ndr/ndr_frsrpc.o ../librpc/ndr/ndr_frsrpc.o
 
 [SUBSYSTEM::NDR_FRSAPI]
 PUBLIC_DEPENDENCIES = LIBNDR