[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-61-g2f4b821

Michael Adam obnox at samba.org
Thu Feb 26 12:23:55 GMT 2009


The branch, master has been updated
       via  2f4b8213206aebd7b101b9623f7cd0786a65f310 (commit)
       via  270ab5544b9e2a26e00ccb4e27e24996bf2e9238 (commit)
       via  ae8c584218fd25016f9baf3106eb25a2faf15a97 (commit)
       via  b5fbe06d746f3e5f004b7006812014dfd269c250 (commit)
       via  97508eefb78598fcf15c07b4c0cb92dbf21c30f7 (commit)
       via  61bdfd09edbdea38486bbca3c148d224c7d523fc (commit)
       via  13ceeeedbc188f4c68f1c733f0d2ffe1f5978b42 (commit)
       via  2fb944bde1b16179b4d7dd9aafa66d18d742b4e4 (commit)
       via  741e902888fe6f6b8109b9bb8ccca48554d00670 (commit)
       via  4b444e4ac4ca0a00a01f22f04bcf01e78593c3a9 (commit)
       via  d73dafb5fe4339611e3e61f5622a6f8c4b81b1c1 (commit)
       via  20e40d3b7da084a00cd417c63c79d0bc102462b8 (commit)
       via  602bfeb3605767c2d938f547ddebe5693776028c (commit)
       via  51795b723eedecbbcb89c822c68ee51151bc6592 (commit)
       via  6c197ffa3090b88663b2507006022fcd438de54c (commit)
       via  e026d217bf0d7641ec4f53ede8c6f8eda144a489 (commit)
       via  0b22f8b99c0291f2e45166124358844127fb8edf (commit)
       via  149d94dd8f5513af9f75d568507c880c63b9187e (commit)
       via  d2fc3abeeac89fac345ef8218685e490b1a470e6 (commit)
       via  1ce0035abbff4625621c0ef16af3902959cd342f (commit)
       via  b384d0d49d1c3748c03e86f84ad7f1e4a6bc55b2 (commit)
       via  69be6f5c1d11a7beae41d27fa0d429020cbaf363 (commit)
       via  8a74b535c88f7f4adb348e8eb2dccdb1d0f1921c (commit)
       via  3c15d053f543132d434fa0249e3eeeccfeaed43b (commit)
       via  ea2b74090dc58d9d6ac9e78746994d0ebce7ca9e (commit)
       via  cd8bfd3a84a02cdaf74813bb7c09dc9a02621aa6 (commit)
       via  63ed47c9e4c846d52c7a56b137d5059b1700007a (commit)
       via  763f41f39c2b3c3488992297bc1c0e1ab785ad07 (commit)
       via  060abd7e38bff8cecf5821e9a9878f18c04a7a1d (commit)
       via  63b576424db89739f40e45ac4802634d34456ee6 (commit)
       via  8c1e4034fe2ac956cec3854586d3d2fcec268697 (commit)
       via  62b53507d29b0679647f429c8d969167fe25122f (commit)
       via  e05b7a8627a085ebd2418bc52152130a97725535 (commit)
       via  58fc61217db68e553119bc49369362672590c19d (commit)
       via  b56f449d6b1cdc527dc553cf0fe774b51a272642 (commit)
      from  6cdcfa3fc14eb25c0da072aa549d06e0c33d4598 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2f4b8213206aebd7b101b9623f7cd0786a65f310
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 02:59:07 2009 +0100

    s3:registry: tighten the subkey loop in reg_deletekey_recursive()
    
    and loop from the end to the beginning so that we don't need
    to rehash the subkeys...
    
    This gets "net conf drop" with 2000 shares down to 14 seconds
    on my box.
    
    Michael

commit 270ab5544b9e2a26e00ccb4e27e24996bf2e9238
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 02:57:59 2009 +0100

    s3:registry: use delete_reg_subkey() in reg_deletekey()
    
    This further speeds up net conf drop.
    
    Michael

commit ae8c584218fd25016f9baf3106eb25a2faf15a97
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 02:56:50 2009 +0100

    s3:registry: implement delete_subkey in the smbconf backend
    
    delegating the call to the db backend
    
    Michael

commit b5fbe06d746f3e5f004b7006812014dfd269c250
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 02:56:00 2009 +0100

    s3:registry: implement delete_subkey in the db backend
    
    Michael

commit 97508eefb78598fcf15c07b4c0cb92dbf21c30f7
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 02:54:50 2009 +0100

    s3:registry: add a delete_subkey method to the backend ops.
    
    This is to provide a more atomic means of deleting a subkey of a key.
    
    Michael

commit 61bdfd09edbdea38486bbca3c148d224c7d523fc
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 01:43:58 2009 +0100

    s3:registry: refactor deletion of various subkey lists out of regdb_store_keys()
    
    Micheal

commit 13ceeeedbc188f4c68f1c733f0d2ffe1f5978b42
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 01:22:03 2009 +0100

    s3:registry: streamline and cleanup regdb_set_secdesc() somewhat.
    
    Michael

commit 2fb944bde1b16179b4d7dd9aafa66d18d742b4e4
Author: Michael Adam <obnox at samba.org>
Date:   Thu Feb 26 01:16:07 2009 +0100

    s3:registry: refactor deletion of value/secdesc/subkey list tdb records out
    
    of regdb_store_values().
    
    Michael

commit 741e902888fe6f6b8109b9bb8ccca48554d00670
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 23:13:07 2009 +0100

    s3:registry: streamline reg_deletekey() somewhat.
    
    use W_ERROR_... macros and separate assignments from checks
    
    Michael

commit 4b444e4ac4ca0a00a01f22f04bcf01e78593c3a9
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 22:06:47 2009 +0100

    s3:registry: use create_reg_subkey() in reg_createkey().
    
    Instead of calling store_reg_keys()
    
    On my box, importing 2000 shares into an empty smbconf key
    now takes some 32 seconds.
    
    Michael

commit d73dafb5fe4339611e3e61f5622a6f8c4b81b1c1
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 22:04:58 2009 +0100

    s3:registry: implement create_subkey for the smbconf backend
    
    by delegating to the db backend
    
    Michael

commit 20e40d3b7da084a00cd417c63c79d0bc102462b8
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 22:04:07 2009 +0100

    s3:registry: implement create_subkey for the db backend.
    
    Michael

commit 602bfeb3605767c2d938f547ddebe5693776028c
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 21:59:54 2009 +0100

    s3:registry: add a create_subkey method to the backend ops.
    
    This is to provide a more atomic means of adding a subkey of a key.
    
    Michael

commit 51795b723eedecbbcb89c822c68ee51151bc6592
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 16:55:28 2009 +0100

    libcli/util/werror.h: add macro W_ERROR_NOT_OK_GOTO(x, y)
    
    a goto destination can be specified as a second parameter.
    
    Michael

commit 6c197ffa3090b88663b2507006022fcd438de54c
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 16:53:05 2009 +0100

    s3: move definition of W_ERROR_NOT_OK_GOTO_DONE down to libcli/util/werror.h
    
    Michael

commit e026d217bf0d7641ec4f53ede8c6f8eda144a489
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 14:49:30 2009 +0100

    s3:net rpc registry: use regsubkey_ctr_init() instead of using talloc directly.
    
    Michael

commit 0b22f8b99c0291f2e45166124358844127fb8edf
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 09:53:16 2009 +0100

    s3:registry: hash the list of subkeys in the regsubkey_ctr
    
    This removes many loops over all the arrays
    (from regsubkey_ctr_key_exists) and thus
    reduces "net conf drop" from 1m55 to 48seconds
    and "net conf import" from 1m55 to 58 seconds
    for 2000 shares on my box.
    
    Michael

commit 149d94dd8f5513af9f75d568507c880c63b9187e
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 00:33:24 2009 +0100

    s3:registry: remove definition of regsubkey_ctr from the surface.
    
    All access is now through accessor functions in reg_objects.c
    This allows for performance tuning under the hood in the next step.
    
    Michael

commit d2fc3abeeac89fac345ef8218685e490b1a470e6
Author: Michael Adam <obnox at samba.org>
Date:   Wed Feb 25 00:32:21 2009 +0100

    s3:profiles: use regsubkey_ctr_init() instead of using talloc directly.
    
    Michael

commit 1ce0035abbff4625621c0ef16af3902959cd342f
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:28:48 2009 +0100

    s3:registry: use regsubkey_ctr_init() in reg_eventlog.c
    
    Michael

commit b384d0d49d1c3748c03e86f84ad7f1e4a6bc55b2
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:23:04 2009 +0100

    s3:services_db: use regsubkey_ctr_init() instead of using talloc directly
    
    Michael

commit 69be6f5c1d11a7beae41d27fa0d429020cbaf363
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:19:35 2009 +0100

    s3:registry: use regsubkey_ctr_get_seqnum() in reg_backend_db.c
    
    Michael

commit 8a74b535c88f7f4adb348e8eb2dccdb1d0f1921c
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:19:08 2009 +0100

    s3:registry: use regsubkey_ctr_set_seqnum() in reg_backend_db.c
    
    Michael

commit 3c15d053f543132d434fa0249e3eeeccfeaed43b
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:18:20 2009 +0100

    s3:registry: use regsubkey_ctr_init() in reg_backend_db.c
    
    instead of using talloc directly.
    
    Michael

commit ea2b74090dc58d9d6ac9e78746994d0ebce7ca9e
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:17:05 2009 +0100

    s3:registry: use regsubkey_ctr_init() in reg_api.c
    
    instead of using talloc on struct regsubkey_ctr.
    
    Michael

commit cd8bfd3a84a02cdaf74813bb7c09dc9a02621aa6
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:15:55 2009 +0100

    s3:registry: add regsubkey_ctr_get_seqnum() to hide implementation
    
    Michael

commit 63ed47c9e4c846d52c7a56b137d5059b1700007a
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 23:10:35 2009 +0100

    s3:registry: add regsubkey_ctr_set_seqnum to hide implementation from caller.
    
    Michael

commit 763f41f39c2b3c3488992297bc1c0e1ab785ad07
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 22:43:47 2009 +0100

    s3:registry: add a regsubkey_ctr_init function for allocating a regsubkey_ctr
    
    Michael

commit 060abd7e38bff8cecf5821e9a9878f18c04a7a1d
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 22:41:40 2009 +0100

    s3:registry: fix a comment
    
    Michael

commit 63b576424db89739f40e45ac4802634d34456ee6
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 22:16:40 2009 +0100

    s3:registry: don't directly access key->subkeys->subkeys[] in  reg_backend_db.c
    
    Use the reg_objects accessor regsubkey_ctr_specific_key() instead.
    
    Michael

commit 8c1e4034fe2ac956cec3854586d3d2fcec268697
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 21:12:26 2009 +0100

    s3:registry: don't directly access key->subkeys->subkeys[] in  reg_api.c
    
    Use the reg_objects accessor regsubkey_ctr_specific_key() instead.
    
    Michael

commit 62b53507d29b0679647f429c8d969167fe25122f
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 17:42:50 2009 +0100

    s3:registry: don't directly access key->subkeys->num_subkeys in reg_backend_db.
    
    Use the reg_objects api instead.
    
    Michael

commit e05b7a8627a085ebd2418bc52152130a97725535
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 17:30:23 2009 +0100

    s3:registry: don't directly access key->subkeys->num_subkeys in reg_api.c
    
    Use the reg_objects api instead.
    
    Michael

commit 58fc61217db68e553119bc49369362672590c19d
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 15:19:18 2009 +0100

    s3:registry: replace typedef "REGSUBKEY_CTR" by "struct regsubkey_ctr"
    
    This paves the way for hiding the typedef and the implementation from the
    surface.
    
    Michael

commit b56f449d6b1cdc527dc553cf0fe774b51a272642
Author: Michael Adam <obnox at samba.org>
Date:   Tue Feb 24 17:51:09 2009 +0100

    Revert "Fix a O(n^2) algorithm in regdb_fetch_keys()"
    
    This reverts commit a13f065bad0f4d21a67e68b743f17f45bf0a4691.
    
    This fix is reverted, because the speedup is going to move
    further down into reg_objects.c. The unsorted list of subkey names
    is going to be indexed: This O(n^2) search bites us in more places.
    This re-establishes the abstraction of reg_objects.c.
    
    Michael

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

Summary of changes:
 libcli/util/werror.h                           |   12 +
 source3/include/proto.h                        |   27 +-
 source3/include/reg_objects.h                  |   16 +-
 source3/include/regfio.h                       |    2 +-
 source3/libnet/libnet_join.c                   |    6 -
 source3/registry/reg_api.c                     |  143 ++++-----
 source3/registry/reg_backend_current_version.c |    2 +-
 source3/registry/reg_backend_db.c              |  411 ++++++++++++++++--------
 source3/registry/reg_backend_hkpt_params.c     |    2 +-
 source3/registry/reg_backend_netlogon_params.c |    2 +-
 source3/registry/reg_backend_perflib.c         |    2 +-
 source3/registry/reg_backend_printing.c        |   20 +-
 source3/registry/reg_backend_prod_options.c    |    2 +-
 source3/registry/reg_backend_shares.c          |    4 +-
 source3/registry/reg_backend_smbconf.c         |   16 +-
 source3/registry/reg_backend_tcpip_params.c    |    2 +-
 source3/registry/reg_dispatcher.c              |   24 ++-
 source3/registry/reg_eventlog.c                |   18 +-
 source3/registry/reg_objects.c                 |  175 +++++++++--
 source3/registry/regfio.c                      |    2 +-
 source3/services/services_db.c                 |   12 +-
 source3/utils/net_rpc_registry.c               |   11 +-
 source3/utils/profiles.c                       |    8 +-
 23 files changed, 606 insertions(+), 313 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/util/werror.h b/libcli/util/werror.h
index 4b34b14..15251a4 100644
--- a/libcli/util/werror.h
+++ b/libcli/util/werror.h
@@ -60,6 +60,18 @@ typedef uint32_t WERROR;
 	}\
 } while (0)
 
+#define W_ERROR_NOT_OK_GOTO_DONE(x) do { \
+	if (!W_ERROR_IS_OK(x)) {\
+		goto done;\
+	}\
+} while (0)
+
+#define W_ERROR_NOT_OK_GOTO(x, y) do {\
+	if (!W_ERROR_IS_OK(x)) {\
+		goto y;\
+	}\
+} while(0)
+
 /* these are win32 error codes. There are only a few places where
    these matter for Samba, primarily in the NT printing code */
 #define WERR_OK W_ERROR(0)
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 3fb57e4..27b4ce9 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5053,11 +5053,11 @@ WERROR regdb_transaction_start(void);
 WERROR regdb_transaction_commit(void);
 WERROR regdb_transaction_cancel(void);
 int regdb_get_seqnum(void);
-bool regdb_store_keys(const char *key, REGSUBKEY_CTR *ctr);
-int regdb_fetch_keys(const char *key, REGSUBKEY_CTR *ctr);
+bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr);
+int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr);
 int regdb_fetch_values( const char* key, REGVAL_CTR *values );
 bool regdb_store_values( const char *key, REGVAL_CTR *values );
-bool regdb_subkeys_need_update(REGSUBKEY_CTR *subkeys);
+bool regdb_subkeys_need_update(struct regsubkey_ctr *subkeys);
 bool regdb_values_need_update(REGVAL_CTR *values);
 
 /* The following definitions come from registry/reg_backend_hkpt_params.c  */
@@ -5093,9 +5093,11 @@ void reghook_dump_cache( int debuglevel );
 
 /* The following definitions come from registry/reg_dispatcher.c  */
 
-bool store_reg_keys( REGISTRY_KEY *key, REGSUBKEY_CTR *subkeys );
+bool store_reg_keys( REGISTRY_KEY *key, struct regsubkey_ctr *subkeys );
 bool store_reg_values( REGISTRY_KEY *key, REGVAL_CTR *val );
-int fetch_reg_keys( REGISTRY_KEY *key, REGSUBKEY_CTR *subkey_ctr );
+WERROR create_reg_subkey(REGISTRY_KEY *key, const char *subkey);
+WERROR delete_reg_subkey(REGISTRY_KEY *key, const char *subkey);
+int fetch_reg_keys( REGISTRY_KEY *key, struct regsubkey_ctr *subkey_ctr );
 int fetch_reg_values( REGISTRY_KEY *key, REGVAL_CTR *val );
 bool regkey_access_check( REGISTRY_KEY *key, uint32 requested, uint32 *granted,
 			  const struct nt_user_token *token );
@@ -5103,7 +5105,7 @@ WERROR regkey_get_secdesc(TALLOC_CTX *mem_ctx, REGISTRY_KEY *key,
 			  struct security_descriptor **psecdesc);
 WERROR regkey_set_secdesc(REGISTRY_KEY *key,
 			  struct security_descriptor *psecdesc);
-bool reg_subkeys_need_update(REGISTRY_KEY *key, REGSUBKEY_CTR *subkeys);
+bool reg_subkeys_need_update(REGISTRY_KEY *key, struct regsubkey_ctr *subkeys);
 bool reg_values_need_update(REGISTRY_KEY *key, REGVAL_CTR *values);
 
 /* The following definitions come from registry/reg_eventlog.c  */
@@ -5129,11 +5131,14 @@ WERROR registry_init_smbconf(const char *keyname);
 
 /* The following definitions come from registry/reg_objects.c  */
 
-WERROR regsubkey_ctr_addkey( REGSUBKEY_CTR *ctr, const char *keyname );
-int regsubkey_ctr_delkey( REGSUBKEY_CTR *ctr, const char *keyname );
-bool regsubkey_ctr_key_exists( REGSUBKEY_CTR *ctr, const char *keyname );
-int regsubkey_ctr_numkeys( REGSUBKEY_CTR *ctr );
-char* regsubkey_ctr_specific_key( REGSUBKEY_CTR *ctr, uint32 key_index );
+WERROR regsubkey_ctr_init(TALLOC_CTX *mem_ctx, struct regsubkey_ctr **ctr);
+WERROR regsubkey_ctr_set_seqnum(struct regsubkey_ctr *ctr, int seqnum);
+int regsubkey_ctr_get_seqnum(struct regsubkey_ctr *ctr);
+WERROR regsubkey_ctr_addkey( struct regsubkey_ctr *ctr, const char *keyname );
+WERROR regsubkey_ctr_delkey( struct regsubkey_ctr *ctr, const char *keyname );
+bool regsubkey_ctr_key_exists( struct regsubkey_ctr *ctr, const char *keyname );
+int regsubkey_ctr_numkeys( struct regsubkey_ctr *ctr );
+char* regsubkey_ctr_specific_key( struct regsubkey_ctr *ctr, uint32 key_index );
 int regval_ctr_numvals( REGVAL_CTR *ctr );
 REGISTRY_VALUE* dup_registry_value( REGISTRY_VALUE *val );
 void free_registry_value( REGISTRY_VALUE *val );
diff --git a/source3/include/reg_objects.h b/source3/include/reg_objects.h
index d9159dd..a03ac1b 100644
--- a/source3/include/reg_objects.h
+++ b/source3/include/reg_objects.h
@@ -66,11 +66,7 @@ typedef struct {
 
 /* container for registry subkey names */
 
-typedef struct {
-	uint32          num_subkeys;
-	char            **subkeys;
-	int seqnum;
-} REGSUBKEY_CTR;
+struct regsubkey_ctr;
 
 /*
  *
@@ -132,9 +128,11 @@ typedef struct {
  
 typedef struct {
 	/* functions for enumerating subkeys and values */	
-	int 	(*fetch_subkeys)( const char *key, REGSUBKEY_CTR *subkeys);
+	int 	(*fetch_subkeys)( const char *key, struct regsubkey_ctr *subkeys);
 	int 	(*fetch_values) ( const char *key, REGVAL_CTR *val );
-	bool 	(*store_subkeys)( const char *key, REGSUBKEY_CTR *subkeys );
+	bool 	(*store_subkeys)( const char *key, struct regsubkey_ctr *subkeys );
+	WERROR	(*create_subkey)(const char *key, const char *subkey);
+	WERROR	(*delete_subkey)(const char *key, const char *subkey);
 	bool 	(*store_values)( const char *key, REGVAL_CTR *val );
 	bool	(*reg_access_check)( const char *keyname, uint32 requested,
 				     uint32 *granted,
@@ -143,7 +141,7 @@ typedef struct {
 			      struct security_descriptor **psecdesc);
 	WERROR (*set_secdesc)(const char *key,
 			      struct security_descriptor *sec_desc);
-	bool	(*subkeys_need_update)(REGSUBKEY_CTR *subkeys);
+	bool	(*subkeys_need_update)(struct regsubkey_ctr *subkeys);
 	bool	(*values_need_update)(REGVAL_CTR *values);
 } REGISTRY_OPS;
 
@@ -164,7 +162,7 @@ typedef struct _RegistryKey {
 
 struct registry_key {
 	REGISTRY_KEY *key;
-	REGSUBKEY_CTR *subkeys;
+	struct regsubkey_ctr *subkeys;
 	REGVAL_CTR *values;
 	struct nt_user_token *token;
 };
diff --git a/source3/include/regfio.h b/source3/include/regfio.h
index 63516a3..0e957d5 100644
--- a/source3/include/regfio.h
+++ b/source3/include/regfio.h
@@ -214,7 +214,7 @@ int           regfio_close( REGF_FILE *r );
 REGF_NK_REC*  regfio_rootkey( REGF_FILE *file );
 REGF_NK_REC*  regfio_fetch_subkey( REGF_FILE *file, REGF_NK_REC *nk );
 REGF_NK_REC*  regfio_write_key ( REGF_FILE *file, const char *name,
-                                 REGVAL_CTR *values, REGSUBKEY_CTR *subkeys,
+                                 REGVAL_CTR *values, struct regsubkey_ctr *subkeys,
                                  SEC_DESC *sec_desc, REGF_NK_REC *parent );
 
 
diff --git a/source3/libnet/libnet_join.c b/source3/libnet/libnet_join.c
index 20f7b97..117178f 100644
--- a/source3/libnet/libnet_join.c
+++ b/source3/libnet/libnet_join.c
@@ -50,12 +50,6 @@
 #define LIBNET_UNJOIN_OUT_DUMP_CTX(ctx, r) \
 	LIBNET_UNJOIN_DUMP_CTX(ctx, r, NDR_OUT)
 
-#define W_ERROR_NOT_OK_GOTO_DONE(x) do { \
-	if (!W_ERROR_IS_OK(x)) {\
-		goto done;\
-	}\
-} while (0)
-
 /****************************************************************
 ****************************************************************/
 
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c
index 4dde493..67767a2 100644
--- a/source3/registry/reg_api.c
+++ b/source3/registry/reg_api.c
@@ -94,15 +94,16 @@ static WERROR fill_value_cache(struct registry_key *key)
 
 static WERROR fill_subkey_cache(struct registry_key *key)
 {
+	WERROR werr;
+
 	if (key->subkeys != NULL) {
 		if (!reg_subkeys_need_update(key->key, key->subkeys)) {
 			return WERR_OK;
 		}
 	}
 
-	if (!(key->subkeys = TALLOC_ZERO_P(key, REGSUBKEY_CTR))) {
-		return WERR_NOMEM;
-	}
+	werr = regsubkey_ctr_init(key, &(key->subkeys));
+	W_ERROR_NOT_OK_RETURN(werr);
 
 	if (fetch_reg_keys(key->key, key->subkeys) == -1) {
 		TALLOC_FREE(key->subkeys);
@@ -127,7 +128,7 @@ static WERROR regkey_open_onelevel(TALLOC_CTX *mem_ctx,
 	WERROR     	result = WERR_OK;
 	struct registry_key *regkey;
 	REGISTRY_KEY *key;
-	REGSUBKEY_CTR	*subkeys = NULL;
+	struct regsubkey_ctr	*subkeys = NULL;
 
 	DEBUG(7,("regkey_open_onelevel: name = [%s]\n", name));
 
@@ -193,8 +194,8 @@ static WERROR regkey_open_onelevel(TALLOC_CTX *mem_ctx,
 	/* check if the path really exists; failed is indicated by -1 */
 	/* if the subkey count failed, bail out */
 
-	if ( !(subkeys = TALLOC_ZERO_P( key, REGSUBKEY_CTR )) ) {
-		result = WERR_NOMEM;
+	result = regsubkey_ctr_init(key, &subkeys);
+	if (!W_ERROR_IS_OK(result)) {
 		goto done;
 	}
 
@@ -308,11 +309,13 @@ WERROR reg_enumkey(TALLOC_CTX *mem_ctx, struct registry_key *key,
 		return err;
 	}
 
-	if (idx >= key->subkeys->num_subkeys) {
+	if (idx >= regsubkey_ctr_numkeys(key->subkeys)) {
 		return WERR_NO_MORE_ITEMS;
 	}
 
-	if (!(*name = talloc_strdup(mem_ctx, key->subkeys->subkeys[idx]))) {
+	if (!(*name = talloc_strdup(mem_ctx,
+			regsubkey_ctr_specific_key(key->subkeys, idx))))
+	{
 		return WERR_NOMEM;
 	}
 
@@ -406,11 +409,12 @@ WERROR reg_queryinfokey(struct registry_key *key, uint32_t *num_subkeys,
 	}
 
 	max_len = 0;
-	for (i=0; i<key->subkeys->num_subkeys; i++) {
-		max_len = MAX(max_len, strlen(key->subkeys->subkeys[i]));
+	for (i=0; i< regsubkey_ctr_numkeys(key->subkeys); i++) {
+		max_len = MAX(max_len,
+			strlen(regsubkey_ctr_specific_key(key->subkeys, i)));
 	}
 
-	*num_subkeys = key->subkeys->num_subkeys;
+	*num_subkeys = regsubkey_ctr_numkeys(key->subkeys);
 	*max_subkeylen = max_len;
 	*max_subkeysize = 0;	/* Class length? */
 
@@ -520,14 +524,8 @@ WERROR reg_createkey(TALLOC_CTX *ctx, struct registry_key *parent,
 	err = fill_subkey_cache(create_parent);
 	if (!W_ERROR_IS_OK(err)) goto done;
 
-	err = regsubkey_ctr_addkey(create_parent->subkeys, path);
-	if (!W_ERROR_IS_OK(err)) goto done;
-
-	if (!store_reg_keys(create_parent->key, create_parent->subkeys)) {
-		TALLOC_FREE(create_parent->subkeys);
-		err = WERR_REG_IO_FAILURE;
-		goto done;
-	}
+	err = create_reg_subkey(key->key, path);
+	W_ERROR_NOT_OK_GOTO_DONE(err);
 
 	/*
 	 * Now open the newly created key
@@ -546,40 +544,36 @@ WERROR reg_createkey(TALLOC_CTX *ctx, struct registry_key *parent,
 WERROR reg_deletekey(struct registry_key *parent, const char *path)
 {
 	WERROR err;
-	TALLOC_CTX *mem_ctx;
 	char *name, *end;
-	int num_subkeys;
 	struct registry_key *tmp_key, *key;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
 
-	if (!(mem_ctx = talloc_init("reg_createkey"))) return WERR_NOMEM;
-
-	if (!(name = talloc_strdup(mem_ctx, path))) {
+	name = talloc_strdup(mem_ctx, path);
+	if (name == NULL) {
 		err = WERR_NOMEM;
-		goto error;
+		goto done;
 	}
 
 	/* check if the key has subkeys */
 	err = reg_openkey(mem_ctx, parent, name, REG_KEY_READ, &key);
-	if (!W_ERROR_IS_OK(err)) {
-		goto error;
-	}
-	if (!W_ERROR_IS_OK(err = fill_subkey_cache(key))) {
-		goto error;
-	}
-	if (key->subkeys->num_subkeys > 0) {
+	W_ERROR_NOT_OK_GOTO_DONE(err);
+
+	err = fill_subkey_cache(key);
+	W_ERROR_NOT_OK_GOTO_DONE(err);
+
+	if (regsubkey_ctr_numkeys(key->subkeys) > 0) {
 		err = WERR_ACCESS_DENIED;
-		goto error;
+		goto done;
 	}
 
 	/* no subkeys - proceed with delete */
-	if ((end = strrchr(name, '\\')) != NULL) {
+	end = strrchr(name, '\\');
+	if (end != NULL) {
 		*end = '\0';
 
 		err = reg_openkey(mem_ctx, parent, name,
 				  SEC_RIGHTS_CREATE_SUBKEY, &tmp_key);
-		if (!W_ERROR_IS_OK(err)) {
-			goto error;
-		}
+		W_ERROR_NOT_OK_GOTO_DONE(err);
 
 		parent = tmp_key;
 		name = end+1;
@@ -587,31 +581,12 @@ WERROR reg_deletekey(struct registry_key *parent, const char *path)
 
 	if (name[0] == '\0') {
 		err = WERR_INVALID_PARAM;
-		goto error;
-	}
-
-	if (!W_ERROR_IS_OK(err = fill_subkey_cache(parent))) {
-		goto error;
-	}
-
-	num_subkeys = parent->subkeys->num_subkeys;
-
-	if (regsubkey_ctr_delkey(parent->subkeys, name) == num_subkeys) {
-		err = WERR_BADFILE;
-		goto error;
-	}
-
-	if (!store_reg_keys(parent->key, parent->subkeys)) {
-		TALLOC_FREE(parent->subkeys);
-		err = WERR_REG_IO_FAILURE;
-		goto error;
+		goto done;
 	}
 
-	regkey_set_secdesc(key->key, NULL);
-
-	err = WERR_OK;
+	err = delete_reg_subkey(parent->key, name);
 
- error:
+done:
 	TALLOC_FREE(mem_ctx);
 	return err;
 }
@@ -726,7 +701,7 @@ static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath,
 	REGF_NK_REC *subkey;
 	REGISTRY_KEY registry_key;
 	REGVAL_CTR *values;
-	REGSUBKEY_CTR *subkeys;
+	struct regsubkey_ctr *subkeys;
 	int i;
 	char *path = NULL;
 	WERROR result = WERR_OK;
@@ -748,10 +723,8 @@ static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath,
 
 	/* now start parsing the values and subkeys */
 
-	subkeys = TALLOC_ZERO_P(regfile->mem_ctx, REGSUBKEY_CTR);
-	if (subkeys == NULL) {
-		return WERR_NOMEM;
-	}
+	result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys);
+	W_ERROR_NOT_OK_RETURN(result);
 
 	values = TALLOC_ZERO_P(subkeys, REGVAL_CTR);
 	if (values == NULL) {
@@ -767,7 +740,7 @@ static WERROR reg_load_tree(REGF_FILE *regfile, const char *topkeypath,
 				    (key->values[i].data_size & ~VK_DATA_IN_OFFSET));
 	}
 
-	/* copy subkeys into the REGSUBKEY_CTR */
+	/* copy subkeys into the struct regsubkey_ctr */
 
 	key->subkey_index = 0;
 	while ((subkey = regfio_fetch_subkey( regfile, key ))) {
@@ -861,7 +834,7 @@ static WERROR reg_write_tree(REGF_FILE *regfile, const char *keypath,
 {
 	REGF_NK_REC *key;
 	REGVAL_CTR *values;
-	REGSUBKEY_CTR *subkeys;
+	struct regsubkey_ctr *subkeys;
 	int i, num_subkeys;
 	char *key_tmp = NULL;
 	char *keyname, *parentpath;
@@ -909,10 +882,8 @@ static WERROR reg_write_tree(REGF_FILE *regfile, const char *keypath,
 
 	/* lookup the values and subkeys */
 
-	subkeys = TALLOC_ZERO_P(regfile->mem_ctx, REGSUBKEY_CTR);
-	if (subkeys == NULL) {
-		return WERR_NOMEM;
-	}
+	result = regsubkey_ctr_init(regfile->mem_ctx, &subkeys);
+	W_ERROR_NOT_OK_RETURN(result);
 
 	values = TALLOC_ZERO_P(subkeys, REGVAL_CTR);
 	if (values == NULL) {
@@ -1091,6 +1062,7 @@ static WERROR reg_deletekey_recursive_internal(TALLOC_CTX *ctx,
 	WERROR werr = WERR_OK;
 	struct registry_key *key;
 	char *subkey_name = NULL;
+	uint32 i;
 
 	mem_ctx = talloc_new(ctx);
 	if (mem_ctx == NULL) {
@@ -1104,25 +1076,21 @@ static WERROR reg_deletekey_recursive_internal(TALLOC_CTX *ctx,
 		goto done;
 	}
 
-	while (W_ERROR_IS_OK(werr = reg_enumkey(mem_ctx, key, 0,
-						&subkey_name, NULL)))
-	{
+	werr = fill_subkey_cache(key);
+	W_ERROR_NOT_OK_GOTO_DONE(werr);
+
+	/*
+	 * loop from top to bottom for perfomance:
+	 * this way, we need to rehash the regsubkey containers less
+	 */
+	for (i = regsubkey_ctr_numkeys(key->subkeys) ; i > 0; i--) {
+		subkey_name = regsubkey_ctr_specific_key(key->subkeys, i-1);
 		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_internal: "
-			  "Error enumerating subkeys: %s\n",
-			  win_errstr(werr)));
-		goto done;
+					subkey_name,
+					true);
+		W_ERROR_NOT_OK_GOTO_DONE(werr);
 	}
 
-	werr = WERR_OK;
-
 	if (del_key) {
 		/* now delete the actual key */
 		werr = reg_deletekey(parent, path);
@@ -1151,6 +1119,9 @@ static WERROR reg_deletekey_recursive_trans(TALLOC_CTX *ctx,
 	werr = reg_deletekey_recursive_internal(ctx, parent, path, del_key);
 
 	if (!W_ERROR_IS_OK(werr)) {
+		DEBUG(1, (__location__ " failed to delete key '%s' from key "
+			  "'%s': %s\n", path, parent->key->name,
+			  win_errstr(werr)));
 		werr = regdb_transaction_cancel();
 		if (!W_ERROR_IS_OK(werr)) {
 			DEBUG(0, ("reg_deletekey_recursive_trans: "
diff --git a/source3/registry/reg_backend_current_version.c b/source3/registry/reg_backend_current_version.c
index 04cc0eb..f76840e 100644
--- a/source3/registry/reg_backend_current_version.c
+++ b/source3/registry/reg_backend_current_version.c
@@ -70,7 +70,7 @@ static int current_version_fetch_values(const char *key, REGVAL_CTR *values)
 }
 
 static int current_version_fetch_subkeys(const char *key,
-					 REGSUBKEY_CTR *subkey_ctr)
+					 struct regsubkey_ctr *subkey_ctr)
 {
 	return regdb_ops.fetch_subkeys(key, subkey_ctr);
 }
diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c
index 960e884..30f1db9 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -103,7 +103,7 @@ static WERROR init_registry_key_internal(const char *add_path)
 	char *remaining = NULL;
 	char *keyname;
 	char *subkeyname;
-	REGSUBKEY_CTR *subkeys;
+	struct regsubkey_ctr *subkeys;
 	const char *p, *p2;
 
 	DEBUG(6, ("init_registry_key: Adding [%s]\n", add_path));
@@ -167,9 +167,9 @@ static WERROR init_registry_key_internal(const char *add_path)
 		 * since we are about to update the record.
 		 * We just want any subkeys already present */
 
-		if (!(subkeys = TALLOC_ZERO_P(frame, REGSUBKEY_CTR))) {
+		werr = regsubkey_ctr_init(frame, &subkeys);
+		if (!W_ERROR_IS_OK(werr)) {
 			DEBUG(0,("talloc() failure!\n"));
-			werr = WERR_NOMEM;
 			goto fail;
 		}
 
@@ -510,13 +510,97 @@ int regdb_get_seqnum(void)
 	return regdb->get_seqnum(regdb);
 }
 
+
+static WERROR regdb_delete_key_with_prefix(const char *keyname,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list