diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2004-10-29 13:38:37 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:05:02 -0500 |
commit | 9dc3f789c41cc63a784e087dc0f061e495e04bab (patch) | |
tree | 5e7aaa87ad933cd792327e92654a48249f36c877 /source4/lib/registry/common | |
parent | 9ba6c3885acb79d9c35e600f9a67f8ed0200edfd (diff) | |
download | samba-9dc3f789c41cc63a784e087dc0f061e495e04bab.tar.gz samba-9dc3f789c41cc63a784e087dc0f061e495e04bab.tar.bz2 samba-9dc3f789c41cc63a784e087dc0f061e495e04bab.zip |
r3369: More registry updates
We now pass the RPC-WINREG torture test.
Also, constructions like the following work now:
regtree <-> smbd <-> NTUSER.DAT
(This used to be commit df952e95cd1cbbfb62b4620e9452993aaef44ad3)
Diffstat (limited to 'source4/lib/registry/common')
-rw-r--r-- | source4/lib/registry/common/reg_interface.c | 76 |
1 files changed, 73 insertions, 3 deletions
diff --git a/source4/lib/registry/common/reg_interface.c b/source4/lib/registry/common/reg_interface.c index 044dc9a0ad..09267a6370 100644 --- a/source4/lib/registry/common/reg_interface.c +++ b/source4/lib/registry/common/reg_interface.c @@ -340,7 +340,7 @@ WERROR reg_key_num_subkeys(struct registry_key *key, int *count) talloc_destroy(mem_ctx); *count = i; - if(W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) return WERR_OK; + if(W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) error = WERR_OK; return error; } @@ -351,8 +351,26 @@ WERROR reg_key_num_values(struct registry_key *key, int *count) { if(!key) return WERR_INVALID_PARAM; - - return key->hive->functions->num_values(key, count); + + if (key->hive->functions->num_values) { + return key->hive->functions->num_values(key, count); + } + + if(key->hive->functions->get_value_by_index) { + int i; + WERROR error; + struct registry_value *dest; + TALLOC_CTX *mem_ctx = talloc_init("num_subkeys"); + + for(i = 0; W_ERROR_IS_OK(error = key->hive->functions->get_value_by_index(mem_ctx, key, i, &dest)); i++); + talloc_destroy(mem_ctx); + + *count = i; + if(W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) error = WERR_OK; + return error; + } + + return WERR_NOT_SUPPORTED; } WERROR reg_key_get_subkey_by_index(TALLOC_CTX *mem_ctx, struct registry_key *key, int idx, struct registry_key **subkey) @@ -646,3 +664,55 @@ WERROR reg_key_flush(struct registry_key *key) /* No need for flushing, apparently */ return WERR_OK; } + +WERROR reg_key_subkeysizes(struct registry_key *key, uint32 *max_subkeylen, uint32 *max_subkeysize) +{ + int i = 0; + struct registry_key *subkey; + WERROR error; + TALLOC_CTX *mem_ctx = talloc_init("subkeysize"); + + *max_subkeylen = *max_subkeysize = 0; + + do { + error = reg_key_get_subkey_by_index(mem_ctx, key, i, &subkey); + + if (W_ERROR_IS_OK(error)) { + *max_subkeysize = MAX(*max_subkeysize, 0xFF); + *max_subkeylen = MAX(*max_subkeylen, strlen(subkey->name)); + } + + i++; + } while (W_ERROR_IS_OK(error)); + + talloc_destroy(mem_ctx); + + return WERR_OK; +} + +WERROR reg_key_valuesizes(struct registry_key *key, uint32 *max_valnamelen, uint32 *max_valbufsize) +{ + int i = 0; + struct registry_value *value; + WERROR error; + TALLOC_CTX *mem_ctx = talloc_init("subkeysize"); + + *max_valnamelen = *max_valbufsize = 0; + + do { + error = reg_key_get_value_by_index(mem_ctx, key, i, &value); + + if (W_ERROR_IS_OK(error)) { + if (value->name) { + *max_valnamelen = MAX(*max_valnamelen, strlen(value->name)); + } + *max_valbufsize = MAX(*max_valbufsize, value->data_len); + } + + i++; + } while (W_ERROR_IS_OK(error)); + + talloc_destroy(mem_ctx); + + return WERR_OK; +} |