diff options
author | Michael Adam <obnox@samba.org> | 2007-06-22 11:43:50 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:23:32 -0500 |
commit | cc4f37f92820a5092d17e7b2e2b349644a0820d5 (patch) | |
tree | 0412d47fc1b2d8d96cb847e9f0dc45e95578ebc8 /source3 | |
parent | 3618a077085f9384eac901e26524bb474ed0a679 (diff) | |
download | samba-cc4f37f92820a5092d17e7b2e2b349644a0820d5.tar.gz samba-cc4f37f92820a5092d17e7b2e2b349644a0820d5.tar.bz2 samba-cc4f37f92820a5092d17e7b2e2b349644a0820d5.zip |
r23585: Add a "drop" function to "net conf" that clears the
whole configuration stored in registry.
Michael
(This used to be commit 6d8973762ef2773ec64ed790f900253120e00d38)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/utils/net_conf.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c index 23a6c9fa8f..8a906a6c27 100644 --- a/source3/utils/net_conf.c +++ b/source3/utils/net_conf.c @@ -54,6 +54,12 @@ static int net_conf_listshares_usage(int argc, const char **argv) return -1; } +static int net_conf_drop_usage(int argc, const char **argv) +{ + d_printf("USAGE: net conf drop\n"); + return -1; +} + static int net_conf_showshare_usage(int argc, const char **argv) { d_printf("USAGE: net conf showshare <sharename>\n"); @@ -368,6 +374,56 @@ done: return werr; } +static WERROR drop_smbconf_internal(TALLOC_CTX *ctx) +{ + char *path, *p; + WERROR werr = WERR_OK; + NT_USER_TOKEN *token; + struct registry_key *parent_key = NULL; + struct registry_key *new_key = NULL; + TALLOC_CTX* tmp_ctx = NULL; + enum winreg_CreateAction action; + + tmp_ctx = talloc_new(ctx); + if (tmp_ctx == NULL) { + werr = WERR_NOMEM; + goto done; + } + + if (!(token = registry_create_admin_token(tmp_ctx))) { + /* what is the appropriate error code here? */ + werr = WERR_CAN_NOT_COMPLETE; + goto done; + } + + path = talloc_strdup(tmp_ctx, KEY_SMBCONF); + if (path == NULL) { + d_fprintf(stderr, "ERROR: out of memory!\n"); + werr = WERR_NOMEM; + goto done; + } + p = strrchr(path, '\\'); + *p = '\0'; + werr = reg_open_path(tmp_ctx, path, REG_KEY_WRITE, token, &parent_key); + + if (!W_ERROR_IS_OK(werr)) { + goto done; + } + + werr = reg_deletekey_recursive(tmp_ctx, parent_key, p+1); + + if (!W_ERROR_IS_OK(werr)) { + goto done; + } + + werr = reg_createkey(tmp_ctx, parent_key, p+1, REG_KEY_WRITE, + &new_key, &action); + +done: + TALLOC_FREE(tmp_ctx); + return werr; +} + static int import_process_service(TALLOC_CTX *ctx, struct share_params *share) { @@ -708,6 +764,29 @@ done: return ret; } +int net_conf_drop(int argc, const char **argv) +{ + int ret = -1; + WERROR werr; + + if (argc != 0) { + net_conf_drop_usage(argc, argv); + goto done; + } + + werr = drop_smbconf_internal(NULL); + if (!W_ERROR_IS_OK(werr)) { + d_fprintf(stderr, "Error deleting configuration: %s\n", + dos_errstr(werr)); + goto done; + } + + ret = 0; + +done: + return ret; +} + int net_conf_showshare(int argc, const char **argv) { int ret = -1; @@ -1067,6 +1146,8 @@ int net_conf(int argc, const char **argv) "Import configuration from file in smb.conf format."}, {"listshares", net_conf_listshares, "List the registry shares."}, + {"drop", net_conf_drop, + "Delete the complete configuration from registry."}, {"showshare", net_conf_showshare, "Show the definition of a registry share."}, {"addshare", net_conf_addshare, |