[SCM] Samba Shared Repository - branch master updated

Matthias Dieter Wallnöfer mdw at samba.org
Sun Mar 21 16:44:01 MDT 2010


The branch, master has been updated
       via  872d233... s4:regtree - fix counter variables to be "unsigned"
       via  61761cb... s4:registry - "LDB backend" - "reg_ldb_unpack_value"
       via  7b54964... s4:registry - "LDB backend" - "reg_key_get_info"
       via  773faa5... s4:registry - "LDB backend" - "ldb_get_default_value"
       via  b7f129f... s4:registry - "LDB backend" - make the key argument "const" of ldb_get_default_value
       via  ea621ef... s4:registry - "LDB backend" - fix indentation
      from  56940a2... Fix an uninitialized variable

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


- Log -----------------------------------------------------------------
commit 872d2330a4d0d2608993fab9e9c0b0c3aa3921f8
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Sun Mar 21 23:41:50 2010 +0100

    s4:regtree - fix counter variables to be "unsigned"

commit 61761cbac8f609c9ee7c6d391739c50bd4844340
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Sun Mar 21 23:36:09 2010 +0100

    s4:registry - "LDB backend" - "reg_ldb_unpack_value"
    
    When the name isn't found it is the default value. Call it "" to be consistent.

commit 7b54964a253b031ba0351fecbfc271a68b76c25b
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Sun Mar 21 22:01:06 2010 +0100

    s4:registry - "LDB backend" - "reg_key_get_info"
    
    Consider also the default value (if it exists) as value. That means:
    - count it when setting "num_values"
    - take also his buffer length as a candidate for the maximum value buffer length
    
    This is what Windows does.

commit 773faa50632b8cee0008fe5d2c277c924b121756
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Sun Mar 21 22:57:31 2010 +0100

    s4:registry - "LDB backend" - "ldb_get_default_value"
    
    There exist also key objects (the hives) which don't contain a "key" entry at
    all. This prevented to display their default value (my fault).

commit b7f129f5c4686ac22940a09f306c813ce4212aef
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Sun Mar 21 22:02:19 2010 +0100

    s4:registry - "LDB backend" - make the key argument "const" of ldb_get_default_value

commit ea621efee79721afff8238c94ee8c95045820d0b
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Sun Mar 21 21:51:06 2010 +0100

    s4:registry - "LDB backend" - fix indentation

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

Summary of changes:
 source4/lib/registry/ldb.c           |   42 ++++++++++++++++++++++++++++-----
 source4/lib/registry/tools/regtree.c |    7 +++--
 2 files changed, 39 insertions(+), 10 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/registry/ldb.c b/source4/lib/registry/ldb.c
index 46b340d..7ceaa5b 100644
--- a/source4/lib/registry/ldb.c
+++ b/source4/lib/registry/ldb.c
@@ -48,7 +48,7 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
 	if (name != NULL) {
 		*name = talloc_strdup(mem_ctx,
 				      ldb_msg_find_attr_as_string(msg, "value",
-				      NULL));
+				      ""));
 	}
 
 	value_type = ldb_msg_find_attr_as_uint(msg, "type", 0);
@@ -486,9 +486,10 @@ static WERROR ldb_get_subkey_by_id(TALLOC_CTX *mem_ctx,
 	return WERR_OK;
 }
 
-static WERROR ldb_get_default_value(TALLOC_CTX *mem_ctx, struct hive_key *k,
-				  const char **name, uint32_t *data_type,
-				   DATA_BLOB *data)
+static WERROR ldb_get_default_value(TALLOC_CTX *mem_ctx,
+				    const struct hive_key *k,
+				    const char **name, uint32_t *data_type,
+				    DATA_BLOB *data)
 {
 	struct ldb_key_data *kd = talloc_get_type(k, struct ldb_key_data);
 	struct ldb_context *c = kd->ldb;
@@ -496,7 +497,7 @@ static WERROR ldb_get_default_value(TALLOC_CTX *mem_ctx, struct hive_key *k,
 	struct ldb_result *res;
 	int ret;
 
-	ret = ldb_search(c, mem_ctx, &res, kd->dn, LDB_SCOPE_BASE, attrs, "(key=*)");
+	ret = ldb_search(c, mem_ctx, &res, kd->dn, LDB_SCOPE_BASE, attrs, "(dn=*)");
 
 	if (ret != LDB_SUCCESS) {
 		DEBUG(0, ("Error getting default value for '%s': %s\n",
@@ -507,8 +508,10 @@ static WERROR ldb_get_default_value(TALLOC_CTX *mem_ctx, struct hive_key *k,
 	if (res->count == 0 || res->msgs[0]->num_elements == 0)
 		return WERR_BADFILE;
 
-	reg_ldb_unpack_value(mem_ctx,
-		 res->msgs[0], name, data_type, data);
+	if ((data_type != NULL) && (data != NULL)) {
+		reg_ldb_unpack_value(mem_ctx, res->msgs[0], name, data_type,
+				     data);
+	}
 
 	talloc_free(res);
 
@@ -954,6 +957,9 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
 			       uint32_t *max_valbufsize)
 {
 	struct ldb_key_data *kd = talloc_get_type(key, struct ldb_key_data);
+	uint32_t default_value_type = REG_NONE;
+	DATA_BLOB default_value = { NULL, 0 };
+	WERROR werr;
 
 	/* Initialization */
 	if (classname != NULL)
@@ -971,6 +977,16 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
 	if (max_valbufsize != NULL)
 		*max_valbufsize = 0;
 
+	/* We need this to get the default value (if it exists) for counting
+	 * the values under the key and for finding out the longest value buffer
+	 * size. If no default value exists the DATA_BLOB "default_value" will
+	 * remain { NULL, 0 }. */
+	werr = ldb_get_default_value(mem_ctx, key, NULL, &default_value_type,
+				     &default_value);
+	if ((!W_ERROR_IS_OK(werr)) && (!W_ERROR_EQUAL(werr, WERR_BADFILE))) {
+		return werr;
+	}
+
 	if (kd->subkeys == NULL) {
 		W_ERROR_NOT_OK_RETURN(cache_subkeys(kd));
 	}
@@ -984,6 +1000,10 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
 	}
 	if (num_values != NULL) {
 		*num_values = kd->value_count;
+		/* also consider the default value if it exists */
+		if (default_value.data != NULL) {
+			++(*num_values);
+		}
 	}
 
 
@@ -1005,6 +1025,12 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
 		struct ldb_message_element *el;
 		W_ERROR_NOT_OK_RETURN(cache_values(kd));
 
+		/* also consider the default value if it exists */
+		if ((max_valbufsize != NULL) && (default_value.data != NULL)) {
+				*max_valbufsize = MAX(*max_valbufsize,
+						      default_value.length);
+		}
+
 		for (i = 0; i < kd->value_count; i++) {
 			if (max_valnamelen != NULL) {
 				el = ldb_msg_find_element(kd->values[i], "value");
@@ -1028,6 +1054,8 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
 		}
 	}
 
+	talloc_free(default_value.data);
+
 	return WERR_OK;
 }
 
diff --git a/source4/lib/registry/tools/regtree.c b/source4/lib/registry/tools/regtree.c
index 7215828..3a7026b 100644
--- a/source4/lib/registry/tools/regtree.c
+++ b/source4/lib/registry/tools/regtree.c
@@ -33,7 +33,7 @@
  * @param fullpath Whether the full pat hshould be printed or just the last bit
  * @param novals Whether values should not be printed
  */
-static void print_tree(int level, struct registry_key *p,
+static void print_tree(unsigned int level, struct registry_key *p,
 		       const char *name,
 		       bool fullpath, bool novals)
 {
@@ -78,7 +78,7 @@ static void print_tree(int level, struct registry_key *p,
 		for(i = 0; W_ERROR_IS_OK(error = reg_key_get_value_by_index(
 			mem_ctx, p, i, &valuename, &valuetype, &valuedata));
 			i++) {
-			int j;
+			unsigned int j;
 			for(j = 0; j < level+1; j++) putchar(' ');
 			printf("%s\n",  reg_val_description(mem_ctx,
 				lp_iconv_convenience(cmdline_lp_ctx), valuename,
@@ -101,7 +101,8 @@ static void print_tree(int level, struct registry_key *p,
 
 int main(int argc, char **argv)
 {
-	int opt, i;
+	int opt;
+	unsigned int i;
 	const char *file = NULL;
 	const char *remote = NULL;
 	poptContext pc;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list