[SCM] Samba Shared Repository - branch master updated

[email protected] (Andreas Schneider)
Newsgroups gmane.network.samba.cvs
Message-ID <[email protected]>
The branch, master has been updated
       via  5adb169 s4-torture: Add LZX compressed cabinet test
       via  6361559 s4-torture: Add MSZIP compressed cabinet test
       via  9ddf9bf s4-torture: Add a validation test for uncompressed Cabinet files
       via  d5dd99a s4-torture: Introduce Cabinet ndr testsuite
       via  e91895f librpc: Add ndr_cab_get_compression() for Cabinet compression evaluation
       via  983dac4 librpc: Add autogenerated file offset calculation for Cabinet files
       via  59ae0e5 librpc: Add autogenerated total cabinet size for Cabinet files
       via  4cc4fca librpc: Add autogenerated checksum calculation for Cabinet files
       via  88e1c4d librpc: Introduce cab.idl
       via  20eadb5 s3-rpcclient: Add AsyncCorePrinterDriverInstalled command
       via  53be405 s3-rpcclient: Add rpcclient IRemoteWinspool commands
       via  bc0aa24 s3-rpc_cli: Support the use of the object_uuid in rpc_cli interfaces
      from  60fd6a3 WHATSNEW: document new inherit owner option

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 5adb1693bd4e796320ed0fc215aaff82e614a6ad
Author: Günther Deschner <[email protected]>
Date:   Fri Sep 23 17:19:59 2016 +0200

    s4-torture: Add LZX compressed cabinet test
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    
    Autobuild-User(master): Andreas Schneider <[email protected]>
    Autobuild-Date(master): Fri Nov 25 00:17:02 CET 2016 on sn-devel-144

commit 6361559f41e7dc2bb5251683b3bb7debab080799
Author: Günther Deschner <[email protected]>
Date:   Fri Sep 23 17:19:25 2016 +0200

    s4-torture: Add MSZIP compressed cabinet test
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 9ddf9bfb41b6e1b569126892f6acb8e18e14ed23
Author: Günther Deschner <[email protected]>
Date:   Fri Sep 23 17:20:30 2016 +0200

    s4-torture: Add a validation test for uncompressed Cabinet files
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit d5dd99a95f5fc199eb0caf849177c93e613e590d
Author: Günther Deschner <[email protected]>
Date:   Fri Sep 23 17:18:12 2016 +0200

    s4-torture: Introduce Cabinet ndr testsuite
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit e91895f41158a40c09bf145234b0cf45df0ea8c5
Author: Günther Deschner <[email protected]>
Date:   Tue Sep 20 00:20:18 2016 +0200

    librpc: Add ndr_cab_get_compression() for Cabinet compression evaluation
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 983dac44f282cc570fb4a576416bd851c18eddd0
Author: Günther Deschner <[email protected]>
Date:   Sat Sep 24 02:51:20 2016 +0200

    librpc: Add autogenerated file offset calculation for Cabinet files
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 59ae0e5f3423d08c30af990199bb23411949e82a
Author: Günther Deschner <[email protected]>
Date:   Wed Sep 21 01:46:54 2016 +0200

    librpc: Add autogenerated total cabinet size for Cabinet files
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 4cc4fca23e892250f44a8b6240ab2a488919f6a3
Author: Günther Deschner <[email protected]>
Date:   Fri Sep 16 00:15:30 2016 +0200

    librpc: Add autogenerated checksum calculation for Cabinet files
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 88e1c4dc44388f554dd3cf09ec932009586a227f
Author: Günther Deschner <[email protected]>
Date:   Thu Sep 15 13:36:35 2016 +0200

    librpc: Introduce cab.idl
    
    This allows processing of Windows Cabinet files (required for the MS-PAR
    print protocol implementation)
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 20eadb5f9a8f68e90c6d33ac78b65255a7631797
Author: Günther Deschner <[email protected]>
Date:   Tue Nov 22 12:07:23 2016 +0100

    s3-rpcclient: Add AsyncCorePrinterDriverInstalled command
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit 53be405e8e958bb4ef9012753634572d89aee23d
Author: Günther Deschner <[email protected]>
Date:   Tue Jan 15 15:22:43 2013 +0100

    s3-rpcclient: Add rpcclient IRemoteWinspool commands
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

commit bc0aa242c5c1aafab2ba9eff953ace2c34bceee4
Author: Günther Deschner <[email protected]>
Date:   Wed Jan 23 10:34:12 2013 +0100

    s3-rpc_cli: Support the use of the object_uuid in rpc_cli interfaces
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/cab.idl                                |  135 +
 librpc/idl/wscript_build                          |   11 +-
 librpc/ndr/ndr_cab.c                              |  246 ++
 lib/dbwrap/dbwrap_cache.h => librpc/ndr/ndr_cab.h |   18 +-
 librpc/wscript_build                              |    7 +
 source3/rpc_client/cli_pipe.c                     |   11 +-
 source3/rpcclient/cmd_iremotewinspool.c           |  177 +
 source3/rpcclient/rpcclient.c                     |    2 +
 source3/rpcclient/wscript_build                   |    2 +
 source4/librpc/wscript_build                      |   72 +-
 source4/torture/ndr/cabinet.c                     | 4323 +++++++++++++++++++++
 source4/torture/ndr/ndr.c                         |    1 +
 source4/torture/wscript_build                     |    1 +
 13 files changed, 4980 insertions(+), 26 deletions(-)
 create mode 100644 librpc/idl/cab.idl
 create mode 100644 librpc/ndr/ndr_cab.c
 copy lib/dbwrap/dbwrap_cache.h => librpc/ndr/ndr_cab.h (70%)
 create mode 100644 source3/rpcclient/cmd_iremotewinspool.c
 create mode 100644 source4/torture/ndr/cabinet.c


Changeset truncated at 500 lines:

diff --git a/librpc/idl/cab.idl b/librpc/idl/cab.idl
new file mode 100644
index 0000000..2174bce
--- /dev/null
+++ b/librpc/idl/cab.idl
@@ -0,0 +1,135 @@
+#include "idl_types.h"
+
+import "misc.idl";
+
+/*
+   IDL structures defining Cabinet files
+
+   more info can be found at:
+   https://msdn.microsoft.com/en-us/library/bb267310.aspx#cabinet_format
+*/
+
+[
+	pointer_default(unique),
+	helper("../librpc/ndr/ndr_cab.h"),
+	helpstring("Cabinet structure"),
+	uuid("12345678-0000-0000-0000-00000000")
+]
+	interface cab
+{
+
+	/*
+	 * flags.cfhdrPREV_CABINET is set if this cabinet file is not the first in
+	 * a set of cabinet files. When this bit is set, the szCabinetPrev and
+	 * szDiskPrev fields are present in this CFHEADER.
+	 *
+	 * flags.cfhdrNEXT_CABINET is set if this cabinet file is not the last in a
+	 * set of cabinet files. When this bit is set, the szCabinetNext and
+	 * szDiskNext fields are present in this CFHEADER.
+	 *
+	 * flags.cfhdrRESERVE_PRESENT is set if this cabinet file contains any
+	 * reserved fields. When this bit is set, the cbCFHeader, cbCFFolder, and
+	 * cbCFData fields are present in this CFHEADER.
+	 */
+
+	typedef [bitmap16bit] bitmap {
+		cfhdrPREV_CABINET	= 0x0001,
+		cfhdrNEXT_CABINET	= 0x0002,
+		cfhdrRESERVE_PRESENT	= 0x0004
+	} cf_flags;
+
+	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
+		[charset(DOS),value("MSCF")] uint8 signature[4];
+		[value(0)] uint32 reserved1;	/* reserved */
+		uint32 cbCabinet;		/* size of this cabinet file in bytes */
+		[value(0)] uint32 reserved2;	/* reserved */
+		[value(cFolders*8+36)] uint32 coffFiles;		/* offset of the first CFFILE entry */
+		[value(0)] uint32 reserved3;	/* reserved */
+		[value(3)] uint8 versionMinor;	/* cabinet file format version, minor */
+		[value(1)] uint8 versionMajor;	/* cabinet file format version, major */
+		uint16 cFolders;		/* number of CFFOLDER entries in this cabinet */
+		uint16 cFiles;			/* number of CFFILE entries in this cabinet */
+		cf_flags flags;			/* cabinet file option indicators */
+		uint16 setID;			/* must be the same for all cabinets in a set */
+		uint16 iCabinet;		/* number of this cabinet file in a set */
+#if 0
+		[range(0,60000)] uint16 cbCFHeader;	/* (optional) size of per-cabinet reserved area */
+		[range(0,255)] uint8 cbCFFolder;	/* (optional) size of per-folder reserved area */
+		[range(0,255)] uint8 cbCFData;		/* (optional) size of per-datablock reserved area */
+		uint8 abReserve[];		/* (optional) per-cabinet reserved area */
+		uint8 szCabinetPrev[];		/* (optional) name of previous cabinet file */
+		uint8 szDiskPrev[];		/* (optional) name of previous disk */
+		uint8 szCabinetNext[];		/* (optional) name of next cabinet file */
+		uint8 szDiskNext[];		/* (optional) name of next disk */
+#endif
+	} CFHEADER;
+
+	typedef enum {
+		CF_COMPRESS_NONE = 0,
+		CF_COMPRESS_MSZIP = 1,
+		CF_COMPRESS_LZX = 4611
+	} cf_compress_type;
+
+	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
+		uint32 coffCabStart;	/* offset of the first CFDATA block in this folder */
+		uint16 cCFData;		/* number of CFDATA blocks in this folder */
+		cf_compress_type typeCompress;	/* compression type indicator */
+#if 0
+		uint8 abReserve[];	/* (optional) per-folder reserved area */
+#endif
+	} CFFOLDER;
+
+	const int ifoldCONTINUED_FROM_PREV	= 0xFFFD;
+	const int ifoldCONTINUED_TO_NEXT	= 0xFFFE;
+	const int ifoldCONTINUED_PREV_AND_NEXT	= 0xFFFF;
+
+	typedef [bitmap16bit] bitmap {
+		_A_RDONLY	= 0x01,  /* file is read-only */
+		_A_HIDDEN	= 0x02,  /* file is hidden */
+		_A_SYSTEM	= 0x04,  /* file is a system file */
+		_A_ARCH		= 0x20,  /* file modified since last backup */
+		_A_EXEC		= 0x40,  /* run after extraction */
+		_A_NAME_IS_UTF	= 0x80  /* szName[] contains UTF */
+	} cf_attributes;
+
+	typedef [noprint,flag(NDR_NOALIGN)] struct {
+		uint16 date;
+	} cf_date;
+
+	typedef [noprint,flag(NDR_NOALIGN)] struct {
+		uint16 time;
+	} cf_time;
+
+	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN),gensize] struct {
+		uint32 cbFile;		/* uncompressed size of this file in bytes */
+		uint32 uoffFolderStart;	/* uncompressed offset of this file in the folder */
+		uint16 iFolder;		/* index into the CFFOLDER area */
+		cf_date date;		/* date stamp for this file */
+		cf_time time;		/* time stamp for this file */
+		cf_attributes attribs;	/* attribute flags for this file */
+		[flag(r->attribs & _A_NAME_IS_UTF ? STR_UTF8|STR_NULLTERM : STR_ASCII|STR_NULLTERM)] string szName;
+	} CFFILE;
+
+	typedef [public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
+		[value(ndr_cab_generate_checksum(r))] uint32 csum;		/* checksum of this CFDATA entry */
+		uint16 cbData;		/* number of compressed bytes in this block */
+		uint16 cbUncomp;	/* number of uncompressed bytes in this block */
+#if 0
+		uint8 abReserve[];	/* (optional) per-datablock reserved area */
+#endif
+		uint8 ab[cbData];	/* compressed data bytes */
+	} CFDATA;
+
+	typedef [nopush,nopull,public,flag(NDR_PAHEX|NDR_LITTLE_ENDIAN|NDR_NOALIGN)] struct {
+		CFHEADER cfheader;
+		CFFOLDER cffolders[cfheader.cFolders];
+		CFFILE cffiles[cfheader.cFiles];
+		[noprint,value(ndr_count_cfdata(r))] uint32 cfdata_count;
+		CFDATA cfdata[cfdata_count];
+	} cab_file;
+
+	void decode_cab_file(
+		[in] cab_file file
+		);
+
+}
diff --git a/librpc/idl/wscript_build b/librpc/idl/wscript_build
index 13b29b2..1f09ae0 100644
--- a/librpc/idl/wscript_build
+++ b/librpc/idl/wscript_build
@@ -34,8 +34,15 @@ bld.SAMBA_PIDL_LIST('PIDL',
                     output_dir='../gen_ndr')
 
 bld.SAMBA_PIDL_LIST('PIDL',
-                    '''rap.idl ntprinting.idl preg.idl ioctl.idl printcap.idl
-                       fsrvp_state.idl''',
+                    '''
+                    rap.idl
+                    ntprinting.idl
+                    preg.idl
+                    ioctl.idl
+                    printcap.idl
+                    fsrvp_state.idl
+                    cab.idl
+                    ''',
                     options='--header --ndr-parser',
                     output_dir='../gen_ndr')
 
diff --git a/librpc/ndr/ndr_cab.c b/librpc/ndr/ndr_cab.c
new file mode 100644
index 0000000..0d2b36b
--- /dev/null
+++ b/librpc/ndr/ndr_cab.c
@@ -0,0 +1,246 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   routines for marshalling/unmarshalling cab structures
+
+   Copyright (C) Guenther Deschner 2016
+
+   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_cab.h"
+
+_PUBLIC_ void ndr_print_cf_time(struct ndr_print *ndr, const char *name, const struct cf_time *r)
+{
+	uint8_t hour = 0, minute = 0, seconds = 0;
+	char *s;
+	if (r == NULL) { ndr_print_null(ndr); return; }
+	hour = r->time >> 11;
+	minute = (r->time >> 5) & 0x3f;
+	seconds = (r->time << 1) & 0x3e;
+	s = talloc_asprintf(ndr, "%02d:%02d:%02d", hour, minute, seconds);
+	if (s == NULL) { return; }
+	ndr_print_string(ndr, "time", s);
+	talloc_free(s);
+}
+
+_PUBLIC_ void ndr_print_cf_date(struct ndr_print *ndr, const char *name, const struct cf_date *r)
+{
+	uint16_t year = 0;
+	uint8_t month = 0, day = 0;
+	char *s;
+	if (r == NULL) { ndr_print_null(ndr); return; }
+	year = (r->date >> 9);
+	year += 1980;
+	month = (r->date >> 5 & 0xf);
+	day = (r->date & 0x1f);
+	s = talloc_asprintf(ndr, "%02d/%02d/%04d", day, month, year);
+	if (s == NULL) { return; }
+	ndr_print_string(ndr, "date", s);
+	talloc_free(s);
+}
+
+uint32_t ndr_count_cfdata(const struct cab_file *r)
+{
+	uint32_t count = 0, i;
+
+	for (i = 0; i < r->cfheader.cFolders; i++) {
+		count += r->cffolders[i].cCFData;
+	}
+
+	return count;
+}
+
+static uint32_t ndr_cab_compute_checksum(uint8_t *data, uint32_t length, uint32_t seed)
+{
+	int num_ulong;
+	uint32_t checksum;
+	uint8_t *pb;
+	uint32_t ul;
+
+	num_ulong = length / 4;
+	checksum = seed;
+	pb = data;
+
+	while (num_ulong-- > 0) {
+		ul = *pb++;
+		ul |= (((uint32_t)(*pb++)) <<  8);
+		ul |= (((uint32_t)(*pb++)) << 16);
+		ul |= (((uint32_t)(*pb++)) << 24);
+
+		checksum ^= ul;
+	}
+
+	ul = 0;
+
+	switch (length % 4) {
+	case 3:
+		ul |= (((uint32_t)(*pb++)) << 16);
+	case 2:
+		ul |= (((uint32_t)(*pb++)) <<  8);
+	case 1:
+		ul |= *pb++;
+	default:
+		break;
+	}
+
+	checksum ^= ul;
+
+	return checksum;
+}
+
+uint32_t ndr_cab_generate_checksum(const struct CFDATA *r)
+{
+	uint32_t csumPartial;
+
+	csumPartial = ndr_cab_compute_checksum(&r->ab[0], r->cbData, 0);
+
+	return ndr_cab_compute_checksum((uint8_t *)discard_const(&r->cbData),
+					sizeof(r->cbData) + sizeof(r->cbUncomp),
+					csumPartial);
+}
+
+static uint32_t ndr_size_cab_file(const struct cab_file *r)
+{
+	uint32_t size = 0;
+	int i;
+
+	/* header */
+	size += 36;
+
+	/* folder */
+	for (i = 0; i < r->cfheader.cFolders; i++) {
+		size += 8;
+	}
+
+	/* files */
+	for (i = 0; i < r->cfheader.cFiles; i++) {
+		size += ndr_size_CFFILE(&r->cffiles[i], 0);
+	}
+
+	/* data */
+	for (i = 0; i < ndr_count_cfdata(r); i++) {
+		size += 8 + r->cfdata[i].cbData;
+	}
+
+	return size;
+}
+
+enum cf_compress_type ndr_cab_get_compression(const struct cab_file *r)
+{
+	if (r->cfheader.cFolders == 0) {
+		return CF_COMPRESS_NONE;
+	}
+
+	return r->cffolders[0].typeCompress;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_cab_file(struct ndr_push *ndr, int ndr_flags, const struct cab_file *r)
+{
+	uint32_t cntr_cffolders_0;
+	uint32_t cntr_cffiles_0;
+	uint32_t cntr_cfdata_0;
+	{
+		uint32_t _flags_save_STRUCT = ndr->flags;
+		ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX|LIBNDR_FLAG_LITTLE_ENDIAN|LIBNDR_FLAG_NOALIGN);
+		NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+		if (ndr_flags & NDR_SCALARS) {
+			uint32_t next_offset = 0;
+			NDR_CHECK(ndr_push_align(ndr, 4));
+			NDR_CHECK(ndr_push_CFHEADER(ndr, NDR_SCALARS, &r->cfheader));
+			for (cntr_cffolders_0 = 0; cntr_cffolders_0 < (r->cfheader.cFolders); cntr_cffolders_0++) {
+				NDR_CHECK(ndr_push_CFFOLDER(ndr, NDR_SCALARS, &r->cffolders[cntr_cffolders_0]));
+			}
+			for (cntr_cffiles_0 = 0; cntr_cffiles_0 < (r->cfheader.cFiles); cntr_cffiles_0++) {
+				uint32_t offset = ndr->offset + 4;
+				NDR_CHECK(ndr_push_CFFILE(ndr, NDR_SCALARS, &r->cffiles[cntr_cffiles_0]));
+				if (cntr_cffiles_0 > 0) {
+					next_offset += r->cffiles[cntr_cffiles_0 - 1].cbFile;
+				}
+				SIVAL(ndr->data, offset, next_offset);
+			}
+#if 0
+			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_count_cfdata(r)));
+#endif
+			for (cntr_cfdata_0 = 0; cntr_cfdata_0 < (ndr_count_cfdata(r)); cntr_cfdata_0++) {
+				NDR_CHECK(ndr_push_CFDATA(ndr, NDR_SCALARS, &r->cfdata[cntr_cfdata_0]));
+			}
+			NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+		}
+		if (ndr_flags & NDR_BUFFERS) {
+		}
+		ndr->flags = _flags_save_STRUCT;
+	}
+
+	SIVAL(ndr->data, 8, ndr_size_cab_file(r));
+
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_cab_file(struct ndr_pull *ndr, int ndr_flags, struct cab_file *r)
+{
+	uint32_t size_cffolders_0 = 0;
+	uint32_t cntr_cffolders_0;
+	TALLOC_CTX *_mem_save_cffolders_0 = NULL;
+	uint32_t size_cffiles_0 = 0;
+	uint32_t cntr_cffiles_0;
+	TALLOC_CTX *_mem_save_cffiles_0 = NULL;
+	uint32_t size_cfdata_0 = 0;
+	uint32_t cntr_cfdata_0;
+	TALLOC_CTX *_mem_save_cfdata_0 = NULL;
+	{
+		uint32_t _flags_save_STRUCT = ndr->flags;
+		ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX|LIBNDR_FLAG_LITTLE_ENDIAN|LIBNDR_FLAG_NOALIGN);
+		NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+		if (ndr_flags & NDR_SCALARS) {
+			NDR_CHECK(ndr_pull_align(ndr, 4));
+			NDR_CHECK(ndr_pull_CFHEADER(ndr, NDR_SCALARS, &r->cfheader));
+			size_cffolders_0 = r->cfheader.cFolders;
+			NDR_PULL_ALLOC_N(ndr, r->cffolders, size_cffolders_0);
+			_mem_save_cffolders_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->cffolders, 0);
+			for (cntr_cffolders_0 = 0; cntr_cffolders_0 < (size_cffolders_0); cntr_cffolders_0++) {
+				NDR_CHECK(ndr_pull_CFFOLDER(ndr, NDR_SCALARS, &r->cffolders[cntr_cffolders_0]));
+			}
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_cffolders_0, 0);
+			size_cffiles_0 = r->cfheader.cFiles;
+			NDR_PULL_ALLOC_N(ndr, r->cffiles, size_cffiles_0);
+			_mem_save_cffiles_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->cffiles, 0);
+			for (cntr_cffiles_0 = 0; cntr_cffiles_0 < (size_cffiles_0); cntr_cffiles_0++) {
+				NDR_CHECK(ndr_pull_CFFILE(ndr, NDR_SCALARS, &r->cffiles[cntr_cffiles_0]));
+			}
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_cffiles_0, 0);
+#if 0
+			NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->cfdata_count));
+#else
+			r->cfdata_count = ndr_count_cfdata(r);
+#endif
+			size_cfdata_0 = r->cfdata_count;
+			NDR_PULL_ALLOC_N(ndr, r->cfdata, size_cfdata_0);
+			_mem_save_cfdata_0 = NDR_PULL_GET_MEM_CTX(ndr);
+			NDR_PULL_SET_MEM_CTX(ndr, r->cfdata, 0);
+			for (cntr_cfdata_0 = 0; cntr_cfdata_0 < (size_cfdata_0); cntr_cfdata_0++) {
+				NDR_CHECK(ndr_pull_CFDATA(ndr, NDR_SCALARS, &r->cfdata[cntr_cfdata_0]));
+			}
+			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_cfdata_0, 0);
+			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/lib/dbwrap/dbwrap_cache.h b/librpc/ndr/ndr_cab.h
similarity index 70%
copy from lib/dbwrap/dbwrap_cache.h
copy to librpc/ndr/ndr_cab.h
index e69d58e..7987153 100644
--- a/lib/dbwrap/dbwrap_cache.h
+++ b/librpc/ndr/ndr_cab.h
@@ -1,7 +1,9 @@
 /*
    Unix SMB/CIFS implementation.
-   Database interface wrapper around ctdbd
-   Copyright (C) Volker Lendecke 2012
+
+   routines for marshalling/unmarshalling cab structures
+
+   Copyright (C) Guenther Deschner 2016
 
    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
@@ -17,12 +19,6 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef __DBWRAP_CACHE_H__
-#define __DBWRAP_CACHE_H__
-
-#include "dbwrap.h"
-
-struct db_context *db_open_cache(TALLOC_CTX *mem_ctx,
-				 struct db_context *backing);
-
-#endif /* __DBWRAP_CACHE_H__ */
+uint32_t ndr_count_cfdata(const struct cab_file *r);
+uint32_t ndr_cab_generate_checksum(const struct CFDATA *r);
+enum cf_compress_type ndr_cab_get_compression(const struct cab_file *r);
diff --git a/librpc/wscript_build b/librpc/wscript_build
index 1c7cc0a..2b4cc05 100644
--- a/librpc/wscript_build
+++ b/librpc/wscript_build
@@ -423,6 +423,13 @@ bld.SAMBA_SUBSYSTEM('NDR_PREG',
     public_deps='ndr'
     )
 
+bld.SAMBA_SUBSYSTEM('NDR_CAB',
+    source='''
+           gen_ndr/ndr_cab.c
+           ndr/ndr_cab.c
+           ''',
+    public_deps='ndr')
+
 bld.SAMBA_SUBSYSTEM('NDR_FILE_ID',
     source='gen_ndr/ndr_file_id.c',
     public_deps='ndr'
diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
index f288156..5418fbe 100644
--- a/source3/rpc_client/cli_pipe.c
+++ b/source3/rpc_client/cli_pipe.c
@@ -1286,6 +1286,7 @@ struct rpc_api_pipe_req_state {
 	uint8_t op_num;
 	uint32_t call_id;
 	const DATA_BLOB *req_data;
+	const struct GUID *object_uuid;
 	uint32_t req_data_sent;
 	DATA_BLOB req_trailer;
 	uint32_t req_trailer_sent;
@@ -1305,6 +1306,7 @@ static struct tevent_req *rpc_api_pipe_req_send(TALLOC_CTX *mem_ctx,
 					 struct tevent_context *ev,
 					 struct rpc_pipe_client *cli,
 					 uint8_t op_num,
+					 const struct GUID *object_uuid,
 					 const DATA_BLOB *req_data)
 {
 	struct tevent_req *req, *subreq;
@@ -1320,6 +1322,7 @@ static struct tevent_req *rpc_api_pipe_req_send(TALLOC_CTX *mem_ctx,
 	state->ev = ev;
 	state->cli = cli;
 	state->op_num = op_num;
+	state->object_uuid = object_uuid;
 	state->req_data = req_data;
 	state->req_data_sent = 0;
 	state->call_id = get_rpc_call_id();
@@ -1555,6 +1558,12 @@ static NTSTATUS prepare_next_frag(struct rpc_api_pipe_req_state *state,
 	u.request.context_id	= 0;
 	u.request.opnum		= state->op_num;
 


-- 
Samba Shared Repository
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.