The branch, v3-6-test has been updated
       via  4b414fb s3:net-man: registry enumerate_recursive
       via  60dc766 s3:net-man: registry deletekey & deletekey_recursive
       via  c890198 s3:net-man: missing dot
       via  6c165c8 s3:net registry: polish output of net registry 
enumerate[_recursive]
       via  d4faa39 s3:net: registry: use recursive implementation for enumerate
       via  901544f s3:net: registry: add new command enumerate_recursive
      from  b08149c s3: improve WHATSNEW around kerberos changes

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit 4b414fbdf8741f0eada3593c9f4f86fa86d363ef
Author: Gregor Beck <[email protected]>
Date:   Tue May 31 18:26:12 2011 +0200

    s3:net-man: registry enumerate_recursive
    
    Signed-off-by: Michael Adam <[email protected]>
    
    Autobuild-User: Michael Adam <[email protected]>
    Autobuild-Date: Wed Jun  1 17:16:05 CEST 2011 on sn-devel-104

commit 60dc766070bd04735cf33b27fb207a8107831257
Author: Gregor Beck <[email protected]>
Date:   Tue May 31 18:25:53 2011 +0200

    s3:net-man: registry deletekey & deletekey_recursive
    
    Signed-off-by: Michael Adam <[email protected]>

commit c890198f9635332525c22783ee72088fd8b0e8c8
Author: Gregor Beck <[email protected]>
Date:   Tue May 31 18:15:38 2011 +0200

    s3:net-man: missing dot
    
    Signed-off-by: Michael Adam <[email protected]>

commit 6c165c84e3482264d9bd6475cb6bc08ad170e268
Author: Michael Adam <[email protected]>
Date:   Mon May 30 16:54:47 2011 +0200

    s3:net registry: polish output of net registry enumerate[_recursive]
    
    so that net registry enumerate output is as before, and
    net registry enumerate_recursive is formatted more nicely
    (cherry picked from commit 0d746f653e76de52985d543a15fd6ee3bf2f4823)
    
    Fix bug: #8193

commit d4faa39a76c0c594683fdb6496edbc5f967b24a6
Author: Gregor Beck <[email protected]>
Date:   Mon May 30 10:24:16 2011 +0200

    s3:net: registry: use recursive implementation for enumerate
    
    Signed-off-by: Michael Adam <[email protected]>
    (cherry picked from commit 5ec479fa0c9db4072541d46345164542d037cfc9)
    
    Fix bug: #8193

commit 901544fcc736457f234c250850819cc2cf3fcc14
Author: Gregor Beck <[email protected]>
Date:   Mon May 30 08:58:34 2011 +0200

    s3:net: registry: add new command enumerate_recursive
    
    Signed-off-by: Michael Adam <[email protected]>
    (cherry picked from commit 22011ddc9e72c8a201e3ca6e01745a68738d5916)
    
    Fix bug: #8193

-----------------------------------------------------------------------

Summary of changes:
 docs-xml/manpages-3/net.8.xml |   17 +++++-
 source3/utils/net_registry.c  |  135 ++++++++++++++++++++++++++++++++++-------
 2 files changed, 128 insertions(+), 24 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/manpages-3/net.8.xml b/docs-xml/manpages-3/net.8.xml
index 18c74ef..fac9ba6 100644
--- a/docs-xml/manpages-3/net.8.xml
+++ b/docs-xml/manpages-3/net.8.xml
@@ -1854,8 +1854,10 @@ Manipulate Samba's registry.
 <para>The registry commands are:
 <simplelist>
 <member>net registry enumerate   - Enumerate registry keys and values.</member>
+<member>net registry enumerate_recursive - Enumerate registry key and its 
subkeys.</member>
 <member>net registry createkey   - Create a new registry key.</member>
 <member>net registry deletekey   - Delete a registry key.</member>
+<member>net registry deletekey_recursive - Delete a registry key with 
subkeys.</member>
 <member>net registry getvalue    - Print a registry value.</member>
 <member>net registry getvalueraw - Print a registry value (raw 
format).</member>
 <member>net registry setvalue    - Set a new registry value.</member>
@@ -1878,7 +1880,13 @@ string.</member>
 
 <refsect3>
   <title>REGISTRY ENUMERATE <replaceable>key</replaceable> </title>
-  <para>Enumerate subkeys and values of <emphasis>key</emphasis>
+  <para>Enumerate subkeys and values of <emphasis>key</emphasis>.
+  </para>
+</refsect3>
+
+<refsect3>
+  <title>REGISTRY ENUMERATE_RECURSIVE <replaceable>key</replaceable> </title>
+  <para>Enumerate values of <emphasis>key</emphasis> and its subkeys.
   </para>
 </refsect3>
 
@@ -1890,6 +1898,13 @@ string.</member>
 
 <refsect3>
   <title>REGISTRY DELETEKEY <replaceable>key</replaceable> </title>
+  <para>Delete the given <emphasis>key</emphasis> and its
+  values from the registry, if it has no subkeys.
+  </para>
+</refsect3>
+
+<refsect3>
+  <title>REGISTRY DELETEKEY_RECURSIVE <replaceable>key</replaceable> </title>
   <para>Delete the given <emphasis>key</emphasis> and all of its
   subkeys and values from the registry.
   </para>
diff --git a/source3/utils/net_registry.c b/source3/utils/net_registry.c
index dcc88a9..0acd8c4 100644
--- a/source3/utils/net_registry.c
+++ b/source3/utils/net_registry.c
@@ -122,23 +122,88 @@ done:
        return werr;
 }
 
+static WERROR registry_enumkey(struct registry_key* parent, const char* 
keyname, bool recursive)
+{
+       WERROR werr;
+       TALLOC_CTX *ctx = talloc_stackframe();
+       char*  subkey_name;
+       NTTIME modtime;
+       uint32_t count;
+       char* valname = NULL;
+       struct registry_value *valvalue = NULL;
+       struct registry_key* key = NULL;
+
+       werr = reg_openkey(ctx, parent, keyname, REG_KEY_READ, &key);
+       if (!W_ERROR_IS_OK(werr)) {
+               goto done;
+       }
+
+       if (recursive) {
+               printf("[%s]\n\n", key->key->name);
+       } else {
+               for (count = 0;
+                    werr = reg_enumkey(ctx, key, count, &subkey_name, 
&modtime),
+                    W_ERROR_IS_OK(werr);
+                    count++)
+               {
+                       print_registry_key(subkey_name, &modtime);
+               }
+               if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+                       goto done;
+               }
+       }
+
+       for (count = 0;
+            werr = reg_enumvalue(ctx, key, count, &valname, &valvalue),
+            W_ERROR_IS_OK(werr);
+            count++)
+       {
+               print_registry_value_with_name(valname, valvalue);
+       }
+       if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+               goto done;
+       }
+
+       if (!recursive) {
+               werr = WERR_OK;
+               goto done;
+       }
+
+       for (count = 0;
+            werr = reg_enumkey(ctx, key, count, &subkey_name, &modtime),
+            W_ERROR_IS_OK(werr);
+            count++)
+       {
+               werr = registry_enumkey(key, subkey_name, recursive);
+               if (!W_ERROR_IS_OK(werr)) {
+                       goto done;
+               }
+       }
+       if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+               goto done;
+       }
+
+       werr = WERR_OK;
+
+done:
+       TALLOC_FREE(ctx);
+       return werr;
+}
+
+
+
 /*
  *
  * the main "net registry" function implementations
  *
  */
-
 static int net_registry_enumerate(struct net_context *c, int argc,
                                  const char **argv)
 {
        WERROR werr;
        struct registry_key *key = NULL;
+       char* name = NULL;
        TALLOC_CTX *ctx = talloc_stackframe();
-       char *subkey_name;
-       NTTIME modtime;
-       uint32_t count;
-       char *valname = NULL;
-       struct registry_value *valvalue = NULL;
        int ret = -1;
 
        if (argc != 1 || c->display_usage) {
@@ -151,40 +216,56 @@ static int net_registry_enumerate(struct net_context *c, 
int argc,
                goto done;
        }
 
-       werr = open_key(ctx, argv[0], REG_KEY_READ, &key);
+       werr = open_hive(ctx, argv[0], REG_KEY_READ, &key, &name);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, _("open_key failed: %s\n"), win_errstr(werr));
                goto done;
        }
 
-       for (count = 0;
-            werr = reg_enumkey(ctx, key, count, &subkey_name, &modtime),
-            W_ERROR_IS_OK(werr);
-            count++)
-       {
-               print_registry_key(subkey_name, &modtime);
+       werr = registry_enumkey(key, name, c->opt_reboot);
+       if (W_ERROR_IS_OK(werr)) {
+               ret = 0;
        }
-       if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+done:
+       TALLOC_FREE(ctx);
+       return ret;
+}
+
+static int net_registry_enumerate_recursive(struct net_context *c, int argc,
+                                           const char **argv)
+{
+       WERROR werr;
+       struct registry_key *key = NULL;
+       char* name = NULL;
+       TALLOC_CTX *ctx = talloc_stackframe();
+       int ret = -1;
+
+       if (argc != 1 || c->display_usage) {
+               d_printf("%s\n%s",
+                        _("Usage:"),
+                        _("net registry enumerate <path>\n"));
+               d_printf("%s\n%s",
+                        _("Example:"),
+                        _("net registry enumerate 'HKLM\\Software\\Samba'\n"));
                goto done;
        }
 
-       for (count = 0;
-            werr = reg_enumvalue(ctx, key, count, &valname, &valvalue),
-            W_ERROR_IS_OK(werr);
-            count++)
-       {
-               print_registry_value_with_name(valname, valvalue);
-       }
-       if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
+       werr = open_hive(ctx, argv[0], REG_KEY_READ, &key, &name);
+       if (!W_ERROR_IS_OK(werr)) {
+               d_fprintf(stderr, _("open_key failed: %s\n"), win_errstr(werr));
                goto done;
        }
 
-       ret = 0;
+       werr = registry_enumkey(key, name, true);
+       if (W_ERROR_IS_OK(werr)) {
+               ret = 0;
+       }
 done:
        TALLOC_FREE(ctx);
        return ret;
 }
 
+
 static int net_registry_createkey(struct net_context *c, int argc,
                                  const char **argv)
 {
@@ -1176,6 +1257,14 @@ int net_registry(struct net_context *c, int argc, const 
char **argv)
                           "    Enumerate registry keys and values")
                },
                {
+                       "enumerate_recursive",
+                       net_registry_enumerate_recursive,
+                       NET_TRANSPORT_LOCAL,
+                       N_("Enumerate registry keys and values"),
+                       N_("net registry enumerate_recursive\n"
+                          "    Enumerate registry keys and values")
+               },
+               {
                        "createkey",
                        net_registry_createkey,
                        NET_TRANSPORT_LOCAL,


-- 
Samba Shared Repository

Reply via email to