[SCM] Samba Shared Repository - branch master updated

Jelmer Vernooij jelmer at samba.org
Sun Oct 3 07:31:35 MDT 2010


The branch, master has been updated
       via  e2eae17 Make sure REG_SZ is properly written to a .reg file (not as hex(1)), fix trailing comma REG_BINARY.
       via  a8adadb Fix issues addressed by Jelmer:
       via  6e881dd Fix patchfile_dotreg to write proper .reg files: 'hex(1..B):', 'dword:', etc
       via  2d4500d Fix registry editor to be compatible with Windows 7.
       via  90d8287 5 uint32_t's should be set, not 5 bytes.
       via  b3d2345 The root key should be created as a root key, not subkey.
       via  bc2098c Do not include the closing doublequote in .reg files.
       via  deebc93 Fix hex():00,00,00 bugs and strtol dword bugs, these values are explicitly hex.
       via  1ed8964 Make sure we write the value stored in value, not line (doublequoted).
       via  a23aa3f Make sure that regf only writes to disk every five seconds or when flushed or destroyed
       via  927e4db Fix .reg file format parsing.
       via  4356f09 Fix registry parsing of strings to also support the windows method.
      from  4a768fb s3: I thought I had compiled this....

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


- Log -----------------------------------------------------------------
commit e2eae17961ef7fd3457c126bc19b3ef54149be00
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Sun Oct 3 06:36:49 2010 +0200

    Make sure REG_SZ is properly written to a .reg file (not as hex(1)), fix trailing comma REG_BINARY.
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit a8adadbe5b5118d6768953d35b21475b06474412
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Sun Oct 3 06:19:12 2010 +0200

    Fix issues addressed by Jelmer:
    
     * Add a comment about why the reg_strhex_to_data_blob was added
     * Fix int which should've been a boolean
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit 6e881dd86ac9e99fed2091b8ba3d677200d8fc3b
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Sun Oct 3 06:11:31 2010 +0200

    Fix patchfile_dotreg to write proper .reg files: 'hex(1..B):', 'dword:', etc
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit 2d4500deea1c0ef9be9906dc7566072877193fc5
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Fri Sep 3 11:04:17 2010 +0200

    Fix registry editor to be compatible with Windows 7.
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit 90d82870b0fb0bc82b6a5a7f7619c0876db97113
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Mon Aug 30 15:27:05 2010 +0200

    5 uint32_t's should be set, not 5 bytes.
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit b3d2345bd1b963f30d08067275b51bd7eaa9e1a9
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Mon Aug 30 15:05:25 2010 +0200

    The root key should be created as a root key, not subkey.
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit bc2098c45920087c49770892db1e50c76d71d8a4
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Mon Aug 30 12:21:29 2010 +0200

    Do not include the closing doublequote in .reg files.
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit deebc934edb9a0a70e7615b1161d7a60fcb1d78f
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Wed Jul 28 14:46:38 2010 +0200

    Fix hex():00,00,00 bugs and strtol dword bugs, these values are explicitly hex.
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit 1ed896407f8109348de7f138c1f00dddeb19df67
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Tue Jul 27 17:21:48 2010 +0200

    Make sure we write the value stored in value, not line (doublequoted).
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit a23aa3f5f150d06c1943e5031a239d58ef7b068c
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Tue Jul 27 11:13:24 2010 +0200

    Make sure that regf only writes to disk every five seconds or when flushed or destroyed
    
    Brings speed up on a large .reg import from 17.5s to 0.95s, over 18 times faster
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit 927e4db0909b54dd94df51d92266ba8dbe09e214
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Mon Jul 26 22:10:43 2010 +0200

    Fix .reg file format parsing.
    
     * multiline data
     * doublequoted value name
     * handle windows format CRLF
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

commit 4356f09d7f4f84fc16b03d84a8de359272368574
Author: Wilco Baan Hofman <wilco at baanhofman.nl>
Date:   Mon Jul 26 20:16:44 2010 +0200

    Fix registry parsing of strings to also support the windows method.
    
    Specifically: dword:00000000, hex:00,00,00,00, hex(0..B):00,00,00,00
    
    Signed-off-by: Jelmer Vernooij <jelmer at samba.org>

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

Summary of changes:
 source4/lib/registry/patchfile_dotreg.c |  259 +++++++++++++++++++++++++------
 source4/lib/registry/regf.c             |  140 +++++++++++++++--
 source4/lib/registry/util.c             |   81 +++++++++-
 source4/setup/provision.reg             |    6 +-
 4 files changed, 415 insertions(+), 71 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/registry/patchfile_dotreg.c b/source4/lib/registry/patchfile_dotreg.c
index 70437a1..b08900f 100644
--- a/source4/lib/registry/patchfile_dotreg.c
+++ b/source4/lib/registry/patchfile_dotreg.c
@@ -3,7 +3,7 @@
    Reading .REG files
 
    Copyright (C) Jelmer Vernooij 2004-2007
-   Copyright (C) Wilco Baan Hofman 2006-2008
+   Copyright (C) Wilco Baan Hofman 2006-2010
 
    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
@@ -20,7 +20,10 @@
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-/* FIXME Newer .REG files, created by Windows XP and above use unicode UCS-2 */
+/* FIXME:
+ * - Newer .REG files, created by Windows XP and above use unicode UCS-2
+ * - @="" constructions should write value with empty name.
+*/
 
 #include "includes.h"
 #include "lib/registry/registry.h"
@@ -37,6 +40,63 @@ struct dotreg_data {
 	int fd;
 };
 
+/* 
+ * This is basically a copy of data_blob_hex_string_upper, but with comma's 
+ * between the bytes in hex.
+ */
+_PUBLIC_ char *dotreg_data_blob_hex_string(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob)
+{
+	int i;
+	char *hex_string;
+
+	hex_string = talloc_array(mem_ctx, char, (blob->length*3)+1);
+	if (!hex_string) {
+		return NULL;
+	}
+
+	for (i = 0; i < blob->length; i++)
+		slprintf(&hex_string[i*3], 4, "%02X,", blob->data[i]);
+
+	/* Remove last comma and NULL-terminate the string */
+	hex_string[(blob->length*3)-1] = '\0';
+	return hex_string;
+}
+
+/* 
+ * This is basically a copy of reg_val_data_string, except that this function
+ * has no 0x for dwords, everything else is regarded as binary, and binary 
+ * strings are represented with bytes comma-separated.
+ */
+_PUBLIC_ char *reg_val_dotreg_string(TALLOC_CTX *mem_ctx, uint32_t type,
+				   const DATA_BLOB data)
+{
+	char *ret = NULL;
+
+	if (data.length == 0)
+		return talloc_strdup(mem_ctx, "");
+
+	switch (type) {
+		case REG_EXPAND_SZ:
+		case REG_SZ:
+			convert_string_talloc(mem_ctx,
+							  CH_UTF16, CH_UNIX, data.data, data.length,
+							  (void **)&ret, NULL, false);
+			break;
+		case REG_DWORD:
+		case REG_DWORD_BIG_ENDIAN:
+			SMB_ASSERT(data.length == sizeof(uint32_t));
+			ret = talloc_asprintf(mem_ctx, "%08x",
+					      IVAL(data.data, 0));
+			break;
+		default: /* default means treat as binary */
+		case REG_BINARY:
+			ret = dotreg_data_blob_hex_string(mem_ctx, &data);
+			break;
+	}
+
+	return ret;
+}
+
 static WERROR reg_dotreg_diff_add_key(void *_data, const char *key_name)
 {
 	struct dotreg_data *data = (struct dotreg_data *)_data;
@@ -60,11 +120,38 @@ static WERROR reg_dotreg_diff_set_value(void *_data, const char *path,
 					uint32_t value_type, DATA_BLOB value)
 {
 	struct dotreg_data *data = (struct dotreg_data *)_data;
-	char *data_string = reg_val_data_string(NULL, 
+	char *data_string = reg_val_dotreg_string(NULL, 
 						value_type, value);
+	char *data_incl_type;
+
 	W_ERROR_HAVE_NO_MEMORY(data_string);
-	fdprintf(data->fd, "\"%s\"=%s:%s\n",
-		 value_name, str_regtype(value_type), data_string);
+
+	switch (value_type) {
+		case REG_SZ:
+			data_incl_type = talloc_asprintf(data_string, "\"%s\"", 
+					data_string);
+			break;
+		case REG_DWORD:
+			data_incl_type = talloc_asprintf(data_string, 
+					"dword:%s", data_string);
+			break;
+		case REG_BINARY:
+			data_incl_type = talloc_asprintf(data_string, "hex:%s",
+					data_string);
+			break;
+		default:
+			data_incl_type = talloc_asprintf(data_string, "hex(%x):%s", 
+					value_type, data_string);
+			break;
+	}
+
+	if (value_name[0] == '\0') {
+		fdprintf(data->fd, "@=%s\n", data_incl_type);
+	} else {
+		fdprintf(data->fd, "\"%s\"=%s\n",
+			 value_name, data_incl_type);
+	}
+
 	talloc_free(data_string);
 
 	return WERR_OK;
@@ -144,7 +231,12 @@ _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
 	TALLOC_CTX *mem_ctx = talloc_init("reg_dotreg_diff_load");
 	WERROR error;
 	uint32_t value_type;
-	DATA_BLOB value;
+	DATA_BLOB data;
+	bool result;
+	char *type_str = NULL;
+	char *data_str;
+	char *value;
+	bool continue_next_line = 0;
 
 	line = afdgets(fd, mem_ctx, 0);
 	if (!line) {
@@ -155,6 +247,11 @@ _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
 	}
 
 	while ((line = afdgets(fd, mem_ctx, 0))) {
+		/* Remove '\r' if it's a Windows text file */
+		if (line[strlen(line)-1] == '\r') {
+			line[strlen(line)-1] = '\0';
+		}
+
 		/* Ignore comments and empty lines */
 		if (strlen(line) == 0 || line[0] == ';') {
 			talloc_free(line);
@@ -168,11 +265,12 @@ _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
 
 		/* Start of key */
 		if (line[0] == '[') {
-			p = strchr_m(line, ']');
-			if (p[strlen(p)-1] != ']') {
-				DEBUG(0, ("Missing ']'\n"));
-				return WERR_GENERAL_FAILURE;
+			if (line[strlen(line)-1] != ']') {
+				DEBUG(0, ("Missing ']' on line: %s\n", line));
+				talloc_free(line);
+				continue;
 			}
+
 			/* Deleting key */
 			if (line[1] == '-') {
 				curkey = talloc_strndup(line, line+2, strlen(line)-3);
@@ -207,59 +305,130 @@ _PUBLIC_ WERROR reg_dotreg_diff_load(int fd,
 		}
 
 		/* Deleting/Changing value */
-		p = strchr_m(line, '=');
-		if (p == NULL) {
-			DEBUG(0, ("Malformed line\n"));
-			talloc_free(line);
-			continue;
-		}
+		if (continue_next_line) {
+			continue_next_line = 0;
 
-		*p = '\0'; p++;
+			/* Continued data start with two whitespaces */
+			if (line[0] != ' ' || line[1] != ' ') {
+				DEBUG(0, ("Malformed line: %s\n", line));
+				talloc_free(line);
+				continue;
+			}
+			p = line + 2;
 
-		if (curkey == NULL) {
-			DEBUG(0, ("Value change without key\n"));
-			talloc_free(line);
-			continue;
-		}
+			/* Continue again if line ends with a backslash */
+			if (line[strlen(line)-1] == '\\') {
+				line[strlen(line)-1] = '\0';
+				continue_next_line = 1;
+				data_str = talloc_strdup_append(data_str, p);
+				talloc_free(line);
+				continue;
+			}
+			data_str = talloc_strdup_append(data_str, p);
+		} else {
+			p = strchr_m(line, '=');
+			if (p == NULL) {
+				DEBUG(0, ("Malformed line: %s\n", line));
+				talloc_free(line);
+				continue;
+			}
 
-		/* Delete value */
-		if (strcmp(p, "-") == 0) {
-			error = callbacks->del_value(callback_data,
-						     curkey, line);
-			if (!W_ERROR_IS_OK(error)) {
-				DEBUG(0, ("Error deleting value %s in key %s\n",
-					line, curkey));
-				talloc_free(mem_ctx);
-				return error;
+			*p = '\0'; p++;
+
+
+			if (curkey == NULL) {
+				DEBUG(0, ("Value change without key\n"));
+				talloc_free(line);
+				continue;
 			}
 
-			talloc_free(line);
-			continue;
-		}
+			/* Values should be double-quoted */
+			if (line[0] != '"') {
+				DEBUG(0, ("Malformed line\n"));
+				talloc_free(line);
+				continue;
+			}
 
-		q = strchr_m(p, ':');
-		if (q) {
-			*q = '\0';
-			q++;
-		}
+			/* Chop of the quotes and store as value */
+			value = talloc_strndup(mem_ctx, line+1,strlen(line)-2);
 
-		reg_string_to_val(line, 
-				  q?p:"REG_SZ", q?q:p,
-				  &value_type, &value);
+			/* Delete value */
+			if (p[0] == '-') {
+				error = callbacks->del_value(callback_data,
+						     curkey, value);
 
-		error = callbacks->set_value(callback_data, curkey, line,
-					     value_type, value);
+				/* Ignore if key does not exist (WERR_BADFILE)
+				 * Consistent with Windows behaviour */
+				if (!W_ERROR_IS_OK(error) &&
+				    !W_ERROR_EQUAL(error, WERR_BADFILE)) {
+					DEBUG(0, ("Error deleting value %s in key %s\n",
+						value, curkey));
+					talloc_free(mem_ctx);
+					return error;
+				}
+
+				talloc_free(line);
+				talloc_free(value);
+				continue;
+			}
+
+			/* Do not look for colons in strings */
+			if (p[0] == '"') {
+				q = NULL;
+				data_str = talloc_strndup(mem_ctx, p+1,strlen(p)-2);
+			} else {
+				/* Split the value type from the data */
+				q = strchr_m(p, ':');
+				if (q) {
+					*q = '\0';
+					q++;
+					type_str = talloc_strdup(mem_ctx, p);
+					data_str = talloc_strdup(mem_ctx, q);
+				} else {
+					data_str = talloc_strdup(mem_ctx, p);
+				}
+			}
+
+			/* Backslash before the CRLF means continue on next line */
+			if (data_str[strlen(data_str)-1] == '\\') {
+				data_str[strlen(data_str)-1] = '\0';
+				talloc_free(line);
+				continue_next_line = 1;
+				continue;
+			}
+		}
+		DEBUG(9, ("About to write %s with type %s, length %ld: %s\n", value, type_str, (long) strlen(data_str), data_str));
+		result = reg_string_to_val(value,
+				  type_str?type_str:"REG_SZ", data_str,
+				  &value_type, &data);
+		if (!result) {
+			DEBUG(0, ("Error converting string to value for line:\n%s\n",
+					line));
+			return WERR_GENERAL_FAILURE;
+		}
+
+		error = callbacks->set_value(callback_data, curkey, value,
+					     value_type, data);
 		if (!W_ERROR_IS_OK(error)) {
 			DEBUG(0, ("Error setting value for %s in %s\n",
-				line, curkey));
+				value, curkey));
 			talloc_free(mem_ctx);
 			return error;
 		}
 
+		/* Clean up buffers */
+		if (type_str != NULL) {
+			talloc_free(type_str);
+			type_str = NULL;
+		}
+		talloc_free(data_str);
+		talloc_free(value);
 		talloc_free(line);
 	}
 
 	close(fd);
 
+	talloc_free(mem_ctx);
+
 	return WERR_OK;
 }
diff --git a/source4/lib/registry/regf.c b/source4/lib/registry/regf.c
index b62109e..5ca7b7c 100644
--- a/source4/lib/registry/regf.c
+++ b/source4/lib/registry/regf.c
@@ -2,7 +2,7 @@
    Samba CIFS implementation
    Registry backend for REGF files
    Copyright (C) 2005-2007 Jelmer Vernooij, jelmer at samba.org
-   Copyright (C) 2006 Wilco Baan Hofman, wilco at baanhofman.nl
+   Copyright (C) 2006-2010 Wilco Baan Hofman, wilco at baanhofman.nl
 
    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
@@ -49,9 +49,10 @@ struct regf_data {
 	int fd;
 	struct hbin_block **hbins;
 	struct regf_hdr *header;
+	time_t last_write;
 };
 
-static WERROR regf_save_hbin(struct regf_data *data);
+static WERROR regf_save_hbin(struct regf_data *data, bool flush);
 
 struct regf_key_data {
 	struct hive_key key;
@@ -1319,6 +1320,8 @@ static WERROR regf_sl_add_entry(struct regf_data *regf, uint32_t list_offset,
 	if (!strncmp((char *)data.data, "li", 2)) {
 		struct tdr_pull *pull = tdr_pull_init(regf);
 		struct li_block li;
+		struct nk_block sub_nk;
+		int32_t i, j;
 
 		pull->data = data;
 
@@ -1335,10 +1338,30 @@ static WERROR regf_sl_add_entry(struct regf_data *regf, uint32_t list_offset,
 			return WERR_BADFILE;
 		}
 
+		/* 
+		 * Find the position to store the pointer
+		 * Extensive testing reveils that at least on windows 7 subkeys 
+		 * *MUST* be stored in alphabetical order
+		 */
+		for (i = 0; i < li.key_count; i++) {
+			/* Get the nk */
+ 			hbin_get_tdr(regf, li.nk_offset[i], regf,
+					(tdr_pull_fn_t) tdr_pull_nk_block, &sub_nk);
+			if (strcasecmp(name, sub_nk.key_name) < 0) {
+				break;
+			}
+		}
+
 		li.nk_offset = talloc_realloc(regf, li.nk_offset,
 					      uint32_t, li.key_count+1);
 		W_ERROR_HAVE_NO_MEMORY(li.nk_offset);
-		li.nk_offset[li.key_count] = key_offset;
+
+		/* Move everything behind this offset */
+		for (j = li.key_count - 1; j >= i; j--) {
+			li.nk_offset[j+1] = li.nk_offset[j];
+		}
+			
+		li.nk_offset[i] = key_offset;
 		li.key_count++;
 		*ret = hbin_store_tdr_resize(regf,
 					     (tdr_push_fn_t)tdr_push_li_block,
@@ -1348,6 +1371,8 @@ static WERROR regf_sl_add_entry(struct regf_data *regf, uint32_t list_offset,
 	} else if (!strncmp((char *)data.data, "lf", 2)) {
 		struct tdr_pull *pull = tdr_pull_init(regf);
 		struct lf_block lf;
+		struct nk_block sub_nk;
+		int32_t i, j;
 
 		pull->data = data;
 
@@ -1359,11 +1384,31 @@ static WERROR regf_sl_add_entry(struct regf_data *regf, uint32_t list_offset,
 		talloc_free(pull);
 		SMB_ASSERT(!strncmp(lf.header, "lf", 2));
 
+		/* 
+		 * Find the position to store the hash record
+		 * Extensive testing reveils that at least on windows 7 subkeys 
+		 * *MUST* be stored in alphabetical order
+		 */
+		for (i = 0; i < lf.key_count; i++) {
+			/* Get the nk */
+ 			hbin_get_tdr(regf, lf.hr[i].nk_offset, regf,
+					(tdr_pull_fn_t) tdr_pull_nk_block, &sub_nk);
+			if (strcasecmp(name, sub_nk.key_name) < 0) {
+				break;
+			}
+		}
+
 		lf.hr = talloc_realloc(regf, lf.hr, struct hash_record,
 				       lf.key_count+1);
 		W_ERROR_HAVE_NO_MEMORY(lf.hr);
-		lf.hr[lf.key_count].nk_offset = key_offset;
-		lf.hr[lf.key_count].hash = talloc_strndup(lf.hr, name, 4);
+
+		/* Move everything behind this hash record */
+		for (j = lf.key_count - 1; j >= i; j--) {
+			lf.hr[j+1] = lf.hr[j];
+		}
+
+		lf.hr[i].nk_offset = key_offset;
+		lf.hr[i].hash = talloc_strndup(lf.hr, name, 4);
 		W_ERROR_HAVE_NO_MEMORY(lf.hr[lf.key_count].hash);
 		lf.key_count++;
 		*ret = hbin_store_tdr_resize(regf,
@@ -1374,6 +1419,8 @@ static WERROR regf_sl_add_entry(struct regf_data *regf, uint32_t list_offset,
 	} else if (!strncmp((char *)data.data, "lh", 2)) {
 		struct tdr_pull *pull = tdr_pull_init(regf);
 		struct lh_block lh;
+		struct nk_block sub_nk;
+		int32_t i, j;
 
 		pull->data = data;
 
@@ -1385,11 +1432,31 @@ static WERROR regf_sl_add_entry(struct regf_data *regf, uint32_t list_offset,
 		talloc_free(pull);
 		SMB_ASSERT(!strncmp(lh.header, "lh", 2));
 
+		/* 
+		 * Find the position to store the hash record
+		 * Extensive testing reveils that at least on windows 7 subkeys 
+		 * *MUST* be stored in alphabetical order
+		 */
+		for (i = 0; i < lh.key_count; i++) {
+			/* Get the nk */
+ 			hbin_get_tdr(regf, lh.hr[i].nk_offset, regf,
+					(tdr_pull_fn_t) tdr_pull_nk_block, &sub_nk);
+			if (strcasecmp(name, sub_nk.key_name) < 0) {
+				break;
+			}
+		}
+
 		lh.hr = talloc_realloc(regf, lh.hr, struct lh_hash,
 				       lh.key_count+1);
 		W_ERROR_HAVE_NO_MEMORY(lh.hr);
-		lh.hr[lh.key_count].nk_offset = key_offset;
-		lh.hr[lh.key_count].base37 = regf_create_lh_hash(name);
+
+		/* Move everything behind this hash record */
+		for (j = lh.key_count - 1; j >= i; j--) {
+			lh.hr[j+1] = lh.hr[j];
+		}
+
+		lh.hr[i].nk_offset = key_offset;
+		lh.hr[i].base37 = regf_create_lh_hash(name);
 		lh.key_count++;
 		*ret = hbin_store_tdr_resize(regf,
 					     (tdr_push_fn_t)tdr_push_lh_block,
@@ -1621,7 +1688,7 @@ static WERROR regf_del_value(TALLOC_CTX *mem_ctx, struct hive_key *key,
 	hbin_store_tdr_resize(regf, (tdr_push_fn_t) tdr_push_nk_block,
 			      private_data->offset, nk);
 
-	return regf_save_hbin(private_data->hive);
+	return regf_save_hbin(private_data->hive, 0);
 }
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list