diff options
author | Michael Adam <obnox@samba.org> | 2008-01-17 10:19:12 +0100 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2008-01-17 16:25:11 +0100 |
commit | 99b195a6aa39bdf3f327fe1c7b1295032c3c3caa (patch) | |
tree | 51bac227f1309e34070ee875e700a0b1f2145fa2 /source3/registry/reg_api.c | |
parent | 00f3df3c131ac6054e1a8d0565cd87ab8a49265b (diff) | |
download | samba-99b195a6aa39bdf3f327fe1c7b1295032c3c3caa.tar.gz samba-99b195a6aa39bdf3f327fe1c7b1295032c3c3caa.tar.bz2 samba-99b195a6aa39bdf3f327fe1c7b1295032c3c3caa.zip |
Move reg_create_path() and reg_delete_path() to reg_api.c
Michael
(This used to be commit 4d82cc586c089a16d1d2db214f5e198062890b58)
Diffstat (limited to 'source3/registry/reg_api.c')
-rw-r--r-- | source3/registry/reg_api.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c index 744e5eb6e3..83c5f1a634 100644 --- a/source3/registry/reg_api.c +++ b/source3/registry/reg_api.c @@ -794,3 +794,98 @@ WERROR reg_deletesubkeys_recursive(TALLOC_CTX *ctx, { return reg_deletekey_recursive_internal(ctx, parent, path, false); } + +/* + * Utility function to create a registry key without opening the hive + * before. Assumes the hive already exists. + */ + +WERROR reg_create_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, + const struct nt_user_token *token, + enum winreg_CreateAction *paction, + struct registry_key **pkey) +{ + struct registry_key *hive; + 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; + *paction = REG_OPENED_EXISTING_KEY; + return WERR_OK; + } + + *p = '\0'; + + err = reg_openhive(mem_ctx, path, + (strchr(p+1, '\\') != NULL) ? + SEC_RIGHTS_ENUM_SUBKEYS : SEC_RIGHTS_CREATE_SUBKEY, + token, &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + + err = reg_createkey(mem_ctx, hive, p+1, desired_access, pkey, paction); + SAFE_FREE(path); + TALLOC_FREE(hive); + return err; +} + +/* + * Utility function to create a registry key without opening the hive + * before. Will not delete a hive. + */ + +WERROR reg_delete_path(const struct nt_user_token *token, + const char *orig_path) +{ + struct registry_key *hive; + char *path, *p; + WERROR err; + + if (!(path = SMB_STRDUP(orig_path))) { + return WERR_NOMEM; + } + + p = strchr(path, '\\'); + + if ((p == NULL) || (p[1] == '\0')) { + SAFE_FREE(path); + return WERR_INVALID_PARAM; + } + + *p = '\0'; + + err = reg_openhive(NULL, path, + (strchr(p+1, '\\') != NULL) ? + SEC_RIGHTS_ENUM_SUBKEYS : SEC_RIGHTS_CREATE_SUBKEY, + token, &hive); + if (!W_ERROR_IS_OK(err)) { + SAFE_FREE(path); + return err; + } + + err = reg_deletekey(hive, p+1); + SAFE_FREE(path); + TALLOC_FREE(hive); + return err; +} |