summaryrefslogtreecommitdiff
path: root/source4/lib/registry/ldb.c
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-01-07 14:11:29 -0600
committerStefan Metzmacher <metze@samba.org>2008-01-07 08:18:07 -0600
commit47f6bbf8cf5bdd03c72c59d00e3e1eab8895590e (patch)
treeffbfa1586fa70dd22422e8e697985af51ec75fd4 /source4/lib/registry/ldb.c
parent7f8276b06d5000d12c0d64167853a033b924af32 (diff)
downloadsamba-47f6bbf8cf5bdd03c72c59d00e3e1eab8895590e.tar.gz
samba-47f6bbf8cf5bdd03c72c59d00e3e1eab8895590e.tar.bz2
samba-47f6bbf8cf5bdd03c72c59d00e3e1eab8895590e.zip
r26689: registry: Return max_subkeynamelen, max_valnamelen and max_valbufsize in getkeyinfo().
(This used to be commit b06896d2378e536f5044dbe500a5232a89d6d0b5)
Diffstat (limited to 'source4/lib/registry/ldb.c')
-rw-r--r--source4/lib/registry/ldb.c52
1 files changed, 49 insertions, 3 deletions
diff --git a/source4/lib/registry/ldb.c b/source4/lib/registry/ldb.c
index c9697ddb4c..1e345ba9f3 100644
--- a/source4/lib/registry/ldb.c
+++ b/source4/lib/registry/ldb.c
@@ -41,16 +41,19 @@ static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx, struct ldb_message *msg,
DATA_BLOB *data)
{
const struct ldb_val *val;
+ uint32_t value_type;
+
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);
if (type != NULL)
- *type = ldb_msg_find_attr_as_uint(msg, "type", 0);
+ *type = value_type;
val = ldb_msg_find_ldb_val(msg, "data");
- switch (*type)
+ switch (value_type)
{
case REG_SZ:
case REG_EXPAND_SZ:
@@ -483,7 +486,10 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
const char **classname,
uint32_t *num_subkeys,
uint32_t *num_values,
- NTTIME *last_change_time)
+ NTTIME *last_change_time,
+ uint32_t *max_subkeynamelen,
+ uint32_t *max_valnamelen,
+ uint32_t *max_valbufsize)
{
struct ldb_key_data *kd = talloc_get_type(key, struct ldb_key_data);
@@ -504,6 +510,46 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
if (last_change_time != NULL)
*last_change_time = 0;
+ if (max_subkeynamelen != NULL) {
+ int i;
+ struct ldb_message_element *el;
+ W_ERROR_NOT_OK_RETURN(cache_subkeys(kd));
+
+ *max_subkeynamelen = 0;
+
+ for (i = 0; i < kd->subkey_count; i++) {
+ el = ldb_msg_find_element(kd->subkeys[i], "key");
+ *max_subkeynamelen = MAX(*max_subkeynamelen, el->values[0].length);
+ }
+ }
+
+ if (max_valnamelen != NULL || max_valbufsize != NULL) {
+ int i;
+ struct ldb_message_element *el;
+ W_ERROR_NOT_OK_RETURN(cache_values(kd));
+
+ if (max_valbufsize != NULL)
+ *max_valbufsize = 0;
+
+ if (max_valnamelen != NULL)
+ *max_valnamelen = 0;
+
+ for (i = 0; i < kd->value_count; i++) {
+ if (max_valnamelen != NULL) {
+ el = ldb_msg_find_element(kd->values[i], "value");
+ *max_valnamelen = MAX(*max_valnamelen, el->values[0].length);
+ }
+
+ if (max_valbufsize != NULL) {
+ DATA_BLOB data;
+ reg_ldb_unpack_value(mem_ctx, kd->values[i], NULL,
+ NULL, &data);
+ *max_valbufsize = MAX(*max_valbufsize, data.length);
+ talloc_free(data.data);
+ }
+ }
+ }
+
return WERR_OK;
}