svn commit: samba r25370 - in branches: SAMBA_3_2/source/registry SAMBA_3_2_0/source/registry

gd at samba.org gd at samba.org
Thu Sep 27 01:26:24 GMT 2007


Author: gd
Date: 2007-09-27 01:26:19 +0000 (Thu, 27 Sep 2007)
New Revision: 25370

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25370

Log:
Allow to delete registry keys recursively without deleting the final key.

Guenther

Modified:
   branches/SAMBA_3_2/source/registry/reg_api.c
   branches/SAMBA_3_2_0/source/registry/reg_api.c


Changeset:
Modified: branches/SAMBA_3_2/source/registry/reg_api.c
===================================================================
--- branches/SAMBA_3_2/source/registry/reg_api.c	2007-09-27 00:42:15 UTC (rev 25369)
+++ branches/SAMBA_3_2/source/registry/reg_api.c	2007-09-27 01:26:19 UTC (rev 25370)
@@ -701,15 +701,15 @@
 	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 
  * key that has subkeys.
  */
-WERROR reg_deletekey_recursive(TALLOC_CTX *ctx,
-			       struct registry_key *parent, 
-			       const char *path)
+WERROR reg_deletekey_recursive_internal(TALLOC_CTX *ctx,
+					struct registry_key *parent,
+					const char *path,
+					BOOL del_key)
 {
 	TALLOC_CTX *mem_ctx = NULL;
 	WERROR werr = WERR_OK;
@@ -731,21 +731,42 @@
 	while (W_ERROR_IS_OK(werr = reg_enumkey(mem_ctx, key, 0,
 						&subkey_name, NULL))) 
 	{
-		werr = reg_deletekey_recursive(mem_ctx, key, subkey_name);
+		werr = reg_deletekey_recursive_internal(mem_ctx, key,
+							subkey_name,
+							True);
 		if (!W_ERROR_IS_OK(werr)) {
 			goto done;
 		}
 	}
 	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
-		DEBUG(1, ("reg_deletekey_recursive: Error enumerating "
-			  "subkeys: %s\n", dos_errstr(werr)));
+		DEBUG(1, ("reg_deletekey_recursive_internal: "
+			  "Error enumerating subkeys: %s\n",
+			  dos_errstr(werr)));
 		goto done;
 	}
 
-	/* now delete the actual key */
-	werr = reg_deletekey(parent, path);
-	
+	werr = WERR_OK;
+
+	if (del_key) {
+		/* now delete the actual key */
+		werr = reg_deletekey(parent, path);
+	}
+
 done:
 	TALLOC_FREE(mem_ctx);
 	return werr;
 }
+
+WERROR reg_deletekey_recursive(TALLOC_CTX *ctx,
+			       struct registry_key *parent,
+			       const char *path)
+{
+	return reg_deletekey_recursive_internal(ctx, parent, path, True);
+}
+
+WERROR reg_deletesubkeys_recursive(TALLOC_CTX *ctx,
+				   struct registry_key *parent,
+				   const char *path)
+{
+	return reg_deletekey_recursive_internal(ctx, parent, path, False);
+}

Modified: branches/SAMBA_3_2_0/source/registry/reg_api.c
===================================================================
--- branches/SAMBA_3_2_0/source/registry/reg_api.c	2007-09-27 00:42:15 UTC (rev 25369)
+++ branches/SAMBA_3_2_0/source/registry/reg_api.c	2007-09-27 01:26:19 UTC (rev 25370)
@@ -701,15 +701,15 @@
 	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 
  * key that has subkeys.
  */
-WERROR reg_deletekey_recursive(TALLOC_CTX *ctx,
-			       struct registry_key *parent, 
-			       const char *path)
+WERROR reg_deletekey_recursive_internal(TALLOC_CTX *ctx,
+					struct registry_key *parent,
+					const char *path,
+					BOOL del_key)
 {
 	TALLOC_CTX *mem_ctx = NULL;
 	WERROR werr = WERR_OK;
@@ -731,21 +731,42 @@
 	while (W_ERROR_IS_OK(werr = reg_enumkey(mem_ctx, key, 0,
 						&subkey_name, NULL))) 
 	{
-		werr = reg_deletekey_recursive(mem_ctx, key, subkey_name);
+		werr = reg_deletekey_recursive_internal(mem_ctx, key,
+							subkey_name,
+							True);
 		if (!W_ERROR_IS_OK(werr)) {
 			goto done;
 		}
 	}
 	if (!W_ERROR_EQUAL(WERR_NO_MORE_ITEMS, werr)) {
-		DEBUG(1, ("reg_deletekey_recursive: Error enumerating "
-			  "subkeys: %s\n", dos_errstr(werr)));
+		DEBUG(1, ("reg_deletekey_recursive_internal: "
+			  "Error enumerating subkeys: %s\n",
+			  dos_errstr(werr)));
 		goto done;
 	}
 
-	/* now delete the actual key */
-	werr = reg_deletekey(parent, path);
-	
+	werr = WERR_OK;
+
+	if (del_key) {
+		/* now delete the actual key */
+		werr = reg_deletekey(parent, path);
+	}
+
 done:
 	TALLOC_FREE(mem_ctx);
 	return werr;
 }
+
+WERROR reg_deletekey_recursive(TALLOC_CTX *ctx,
+			       struct registry_key *parent,
+			       const char *path)
+{
+	return reg_deletekey_recursive_internal(ctx, parent, path, True);
+}
+
+WERROR reg_deletesubkeys_recursive(TALLOC_CTX *ctx,
+				   struct registry_key *parent,
+				   const char *path)
+{
+	return reg_deletekey_recursive_internal(ctx, parent, path, False);
+}



More information about the samba-cvs mailing list