diff options
author | Volker Lendecke <vlendec@samba.org> | 2007-04-09 10:38:55 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:19:16 -0500 |
commit | a40df6f92d42676a9184fb2c20a11d5662ca5b3a (patch) | |
tree | 98091de9917888e317ae98b4d14e5e27d699be96 /source3/registry/reg_api.c | |
parent | 4838055e5f300ec5c9e09ac5ebb9d661fa9a7cd1 (diff) | |
download | samba-a40df6f92d42676a9184fb2c20a11d5662ca5b3a.tar.gz samba-a40df6f92d42676a9184fb2c20a11d5662ca5b3a.tar.bz2 samba-a40df6f92d42676a9184fb2c20a11d5662ca5b3a.zip |
r22135: Check in most of Michael Adam's net conf utility. A good share of this patch
is moving functions around to fix some linker dependencies for the registry.
Michael, I've renamed your auth_utils2.c to token_utils.c.
Thanks!
Volker
(This used to be commit 9de16f25c1c3e0b203da47391772ef2e2fe291ac)
Diffstat (limited to 'source3/registry/reg_api.c')
-rw-r--r-- | source3/registry/reg_api.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c index 7d8cd993a3..9057932538 100644 --- a/source3/registry/reg_api.c +++ b/source3/registry/reg_api.c @@ -496,3 +496,63 @@ WERROR reg_deletevalue(struct registry_key *key, const char *name) return WERR_OK; } + +/* + * Utility function to open a complete registry path including the hive + * prefix. This should become the replacement function for + * regkey_open_internal. + */ + +WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, const struct nt_user_token *token, + struct registry_key **pkey) +{ + struct registry_key *hive, *key; + char *path, *p; + WERROR err; + + if (!(path = SMB_STRDUP(orig_path))) { + return WERR_NOMEM; + } + + p = strchr(path, '\\'); + + if ((p == NULL) || (p[1] == '\0')) { + /* + * No key behind the hive, just return the hive + */ + + err = reg_openhive(mem_ctx, path, desired_access, token, + &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + SAFE_FREE(path); + *pkey = hive; + return WERR_OK; + } + + *p = '\0'; + + err = reg_openhive(mem_ctx, path, SEC_RIGHTS_ENUM_SUBKEYS, token, + &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + + err = reg_openkey(mem_ctx, hive, p+1, desired_access, &key); + + TALLOC_FREE(hive); + SAFE_FREE(path); + + if (!W_ERROR_IS_OK(err)) { + return err; + } + + *pkey = key; + return WERR_OK; +} + +/* END */ |