From 0f7e503d21562a8c8aee3de609bdcade790bc7a0 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 20 Sep 2010 02:42:10 +0200 Subject: s3:registry: move higher level function reg_open_path to new module reg_api_util The reg_api.c code should just export functions that direclty relate to winreg api calls. --- source3/registry/reg_api.c | 56 ------------------------- source3/registry/reg_api_util.c | 83 ++++++++++++++++++++++++++++++++++++++ source3/registry/reg_api_util.h | 35 ++++++++++++++++ source3/registry/reg_util_legacy.c | 1 + 4 files changed, 119 insertions(+), 56 deletions(-) create mode 100644 source3/registry/reg_api_util.c create mode 100644 source3/registry/reg_api_util.h (limited to 'source3/registry') diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c index ab5d86c231..8d27240cd8 100644 --- a/source3/registry/reg_api.c +++ b/source3/registry/reg_api.c @@ -778,62 +778,6 @@ WERROR reg_deleteallvalues(struct registry_key *key) return WERR_OK; } -/* - * Utility function to open a complete registry path including the hive prefix. - */ - -WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, - uint32 desired_access, const struct security_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, KEY_ENUMERATE_SUB_KEYS, 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; -} - /* * Utility function to delete a registry key with all its subkeys. * Note that reg_deletekey returns ACCESS_DENIED when called on a diff --git a/source3/registry/reg_api_util.c b/source3/registry/reg_api_util.c new file mode 100644 index 0000000000..243665606c --- /dev/null +++ b/source3/registry/reg_api_util.c @@ -0,0 +1,83 @@ +/* + * Unix SMB/CIFS implementation. + * Virtual Windows Registry Layer + * Copyright (C) Volker Lendecke 2006 + * Copyright (C) Michael Adam 2007-2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* + * Higher level utility functions on top of reg_api.c + */ + +#include "includes.h" +#include "registry.h" +#include "reg_api_util.h" + +/** + * Utility function to open a complete registry path including the hive prefix. + */ +WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, const struct security_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, KEY_ENUMERATE_SUB_KEYS, 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; +} + diff --git a/source3/registry/reg_api_util.h b/source3/registry/reg_api_util.h new file mode 100644 index 0000000000..c7dd77e66a --- /dev/null +++ b/source3/registry/reg_api_util.h @@ -0,0 +1,35 @@ +/* + * Unix SMB/CIFS implementation. + * Virtual Windows Registry Layer + * Copyright (C) Volker Lendecke 2006 + * Copyright (C) Michael Adam 2007-2010 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +/* + * Higher level utility functions on top of reg_api.c + */ + +#ifndef _REG_API_UTIL_H +#define _REG_API_UTIL_H + +/** + * Utility function to open a complete registry path including the hive prefix. + */ +WERROR reg_open_path(TALLOC_CTX *mem_ctx, const char *orig_path, + uint32 desired_access, const struct security_token *token, + struct registry_key **pkey); + +#endif /* _REG_API_UTIL_H */ diff --git a/source3/registry/reg_util_legacy.c b/source3/registry/reg_util_legacy.c index 3a3f0207e2..29b0889402 100644 --- a/source3/registry/reg_util_legacy.c +++ b/source3/registry/reg_util_legacy.c @@ -22,6 +22,7 @@ #include "includes.h" #include "registry.h" #include "reg_util_legacy.h" +#include "reg_api_util.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_REGISTRY -- cgit