summaryrefslogtreecommitdiff
path: root/source3/registry/reg_api.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2006-12-05 07:36:14 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:16:22 -0500
commit5b1f85a83277e153a47761afe8a231ac5d67c2d9 (patch)
treec2dbd10fde8c43007a8f75428a57213ee17159e3 /source3/registry/reg_api.c
parent1710dd1fe248ff82613e50ebb97be079e4f31bf4 (diff)
downloadsamba-5b1f85a83277e153a47761afe8a231ac5d67c2d9.tar.gz
samba-5b1f85a83277e153a47761afe8a231ac5d67c2d9.tar.bz2
samba-5b1f85a83277e153a47761afe8a231ac5d67c2d9.zip
r20037: Reduce code size slightly by shuffling stuff around
(This used to be commit 0742faaacd496f9cc4581a1fad74217024383661)
Diffstat (limited to 'source3/registry/reg_api.c')
-rw-r--r--source3/registry/reg_api.c94
1 files changed, 40 insertions, 54 deletions
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c
index 7abf0538f8..7d8cd993a3 100644
--- a/source3/registry/reg_api.c
+++ b/source3/registry/reg_api.c
@@ -62,81 +62,67 @@ WERROR reg_openhive(TALLOC_CTX *mem_ctx, const char *hive,
const struct nt_user_token *token,
struct registry_key **pkey)
{
- struct registry_key *key;
- WERROR err;
-
+ SMB_ASSERT(hive != NULL);
SMB_ASSERT(hive[0] != '\0');
SMB_ASSERT(strchr(hive, '\\') == NULL);
- if (!(key = TALLOC_ZERO_P(mem_ctx, struct registry_key))) {
- return WERR_NOMEM;
- }
-
- if (!(key->token = dup_nt_token(key, token))) {
- TALLOC_FREE(key);
- return WERR_NOMEM;
- }
-
- err = regkey_open_internal(key, &key->key, hive, token,
- desired_access);
-
- if (!W_ERROR_IS_OK(err)) {
- TALLOC_FREE(key);
- return err;
- }
-
- *pkey = key;
- return WERR_OK;
-
+ return regkey_open_onelevel(mem_ctx, NULL, hive, token, desired_access,
+ pkey);
}
WERROR reg_openkey(TALLOC_CTX *mem_ctx, struct registry_key *parent,
const char *name, uint32 desired_access,
struct registry_key **pkey)
{
- struct registry_key *key;
+ struct registry_key *direct_parent = parent;
WERROR err;
- char *path;
+ char *p, *path, *to_free;
+ size_t len;
- if (!(key = TALLOC_ZERO_P(mem_ctx, struct registry_key))) {
+ if (!(path = SMB_STRDUP(name))) {
return WERR_NOMEM;
}
+ to_free = path;
- if (!(key->token = dup_nt_token(key, parent->token))) {
- TALLOC_FREE(key);
- return WERR_NOMEM;
- }
+ len = strlen(path);
- if (name[0] == '\0') {
- /*
- * Make a copy of the parent
- */
- path = talloc_strdup(key, parent->key->name);
- }
- else {
- /*
- * Normal subpath open
- */
- path = talloc_asprintf(key, "%s\\%s", parent->key->name,
- name);
+ if ((len > 0) && (path[len-1] == '\\')) {
+ path[len-1] = '\0';
}
- if (!path) {
- TALLOC_FREE(key);
- return WERR_NOMEM;
- }
+ while ((p = strchr(path, '\\')) != NULL) {
+ char *name_component;
+ struct registry_key *tmp;
- err = regkey_open_internal(key, &key->key, path, parent->token,
- desired_access);
- TALLOC_FREE(path);
+ if (!(name_component = SMB_STRNDUP(path, (p - path)))) {
+ err = WERR_NOMEM;
+ goto error;
+ }
- if (!W_ERROR_IS_OK(err)) {
- TALLOC_FREE(key);
- return err;
+ err = regkey_open_onelevel(mem_ctx, direct_parent,
+ name_component, parent->token,
+ SEC_RIGHTS_ENUM_SUBKEYS, &tmp);
+ SAFE_FREE(name_component);
+
+ if (!W_ERROR_IS_OK(err)) {
+ goto error;
+ }
+ if (direct_parent != parent) {
+ TALLOC_FREE(direct_parent);
+ }
+
+ direct_parent = tmp;
+ path = p+1;
}
- *pkey = key;
- return WERR_OK;
+ err = regkey_open_onelevel(mem_ctx, direct_parent, path, parent->token,
+ desired_access, pkey);
+ error:
+ if (direct_parent != parent) {
+ TALLOC_FREE(direct_parent);
+ }
+ SAFE_FREE(to_free);
+ return err;
}
WERROR reg_enumkey(TALLOC_CTX *mem_ctx, struct registry_key *key,