summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/libnet/libnet_conf.c53
-rw-r--r--source3/utils/net_conf.c20
2 files changed, 58 insertions, 15 deletions
diff --git a/source3/libnet/libnet_conf.c b/source3/libnet/libnet_conf.c
index ca25a5cc50..a67a361f6e 100644
--- a/source3/libnet/libnet_conf.c
+++ b/source3/libnet/libnet_conf.c
@@ -384,6 +384,59 @@ done:
return werr;
}
+WERROR libnet_smbconf_getshares(TALLOC_CTX *mem_ctx, uint32_t *num_shares,
+ char ***share_names)
+{
+ uint32_t count;
+ TALLOC_CTX *tmp_ctx;
+ WERROR werr = WERR_OK;
+ struct registry_key *key = NULL;
+ char *subkey_name = NULL;
+ char **tmp_share_names = NULL;
+
+ if ((num_shares == NULL) || (share_names == NULL)) {
+ werr = WERR_INVALID_PARAM;
+ goto done;
+ }
+
+ tmp_ctx = talloc_new(mem_ctx);
+ if (tmp_ctx == NULL) {
+ werr = WERR_NOMEM;
+ goto done;
+ }
+
+ werr = libnet_smbconf_reg_open_basepath(tmp_ctx,
+ SEC_RIGHTS_ENUM_SUBKEYS,
+ &key);
+ if (!W_ERROR_IS_OK(werr)) {
+ goto done;
+ }
+
+ for (count = 0;
+ W_ERROR_IS_OK(werr = reg_enumkey(tmp_ctx, key, count,
+ &subkey_name, NULL));
+ count++)
+ {
+ tmp_share_names = TALLOC_REALLOC_ARRAY(tmp_ctx, tmp_share_names,
+ char *, count + 1);
+ tmp_share_names[count] = talloc_strdup(tmp_ctx, subkey_name);
+ }
+ if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+ goto done;
+ }
+
+ werr = WERR_OK;
+
+ *num_shares = count - 1;
+ if (count > 0) {
+ *share_names = talloc_move(mem_ctx, &tmp_share_names);
+ }
+
+done:
+ TALLOC_FREE(tmp_ctx);
+ return werr;
+}
+
/**
* get a definition of a share (service) from configuration.
*/
diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c
index 9a7c8c9097..5c0d6c6376 100644
--- a/source3/utils/net_conf.c
+++ b/source3/utils/net_conf.c
@@ -459,9 +459,8 @@ static int net_conf_listshares(int argc, const char **argv)
{
WERROR werr = WERR_OK;
int ret = -1;
- struct registry_key *key;
- uint32 idx = 0;
- char *subkey_name = NULL;
+ uint32_t count, num_shares = 0;
+ char **share_names = NULL;
TALLOC_CTX *ctx;
ctx = talloc_init("listshares");
@@ -471,23 +470,14 @@ static int net_conf_listshares(int argc, const char **argv)
goto done;
}
- werr = libnet_smbconf_reg_open_basepath(ctx, SEC_RIGHTS_ENUM_SUBKEYS,
- &key);
+ werr = libnet_smbconf_getshares(ctx, &num_shares, &share_names);
if (!W_ERROR_IS_OK(werr)) {
goto done;
}
- for (idx = 0;
- W_ERROR_IS_OK(werr = reg_enumkey(ctx, key, idx,
- &subkey_name, NULL));
- idx++)
+ for (count = 0; count <= num_shares; count++)
{
- d_printf("%s\n", subkey_name);
- }
- if (! W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
- d_fprintf(stderr, "Error enumerating subkeys: %s\n",
- dos_errstr(werr));
- goto done;
+ d_printf("%s\n", share_names[count]);
}
ret = 0;