The branch, master has been updated
       via  5a525f7f2855677531385874402e2d7a2f117944 (commit)
       via  78576117eb4292e4e2750928d5f84c2edc94192f (commit)
       via  92df5e4a0243bde6fbc5261bf6758090c4c35eee (commit)
       via  dc0bcfa188cb24c5a34f592ece946682d5fb8afe (commit)
       via  c52dd1d5b81ce71855a3215f1b23704ac450fdee (commit)
       via  109ea29b2c1a3bc752f9afda2c0010b9e675aa83 (commit)
       via  2d6dbcd0b13da469f8b7dc6ed65e51d91ce1ab9c (commit)
       via  a48d8353c79685371dbd2cc73b6c9032c5166a5b (commit)
       via  5640598cbb66fb0e65413e53a11ff82a553caad6 (commit)
       via  8c7b9604931a787107bc01b359a231d376ed92c0 (commit)
       via  86d747e19f877c45ac32663ec2a3381ad03cdcf5 (commit)
       via  f93c9e0d415b5c2e2fd73bb370db7b7e17ede9aa (commit)
       via  3eec829e2fa2106c8d52f31e3f3d7f45e6c81b24 (commit)
       via  14f593aa0f43127ab78aec848b0fe5933c0c28c9 (commit)
       via  1c65c98f3350951fe9f87a942b4c8a8094c8b781 (commit)
       via  cf4f808b8b03c385b5b9e9f4a5e891ae92143001 (commit)
       via  e6340963cf549cda261fc1ba9da4bc1b3a071241 (commit)
       via  302265aae1bc27244ffaa9d803a8be83947e0381 (commit)
       via  8a5b164b20c3d51df2422c1402ef31384b31472e (commit)
       via  95ebf534d2bc9904cc7c02bccdf5c01cc595ad7c (commit)
       via  a00109e1e6c1063b560be85c43ef820d3446ae31 (commit)
       via  3189828087387686f63b3ae0b289c6e31f602a54 (commit)
       via  4c366a094693f050b2cadea771cd5c6eab29e278 (commit)
       via  6cb14409af5f708706f975143c7b40bb54c7a5c0 (commit)
       via  4eeacd6ef0e1bb813062c30ac280e542c6b007c8 (commit)
       via  355892c296f7f245e5a5dd9070e3e776bedbf09c (commit)
       via  3409a44da2ee6a0ca2caaf0455e0095f8e2f80a4 (commit)
       via  1dfaa371fa027351a0af6e56a04bc045c3b0dc73 (commit)
       via  eb1958ca3d6cd30e292d2d013ff1ea63e65563fb (commit)
       via  589bacfbdb7541be5d339fcaf08272520bf6a1ac (commit)
       via  db4f797e3533b97df844a50a92e8a27a9248092b (commit)
       via  c01d955ac0b6ef686cf026cc90074cd52a1a30ae (commit)
       via  a18a10c07a3e32644c31f4742805795998227e44 (commit)
       via  528bf38875b9e5412da0a2810b17f05b2c376312 (commit)
       via  86e927cb056b30be3b2eecc1375549de71419b1f (commit)
       via  bd983dba6b308c28019c2e39f16de8b9e434e4f5 (commit)
       via  ec6b6727d824bea1b4a7b320e7a3c1de38df6724 (commit)
       via  2b380c73a4796bdf69264e5ca6721ad0d67087e9 (commit)
       via  d554c0d7a923f1194463481f0bd829042cee574a (commit)
       via  3071b0712211b17b464f62d544fa16da5a128b01 (commit)
       via  3b3125fc23dc4b7a403d17af2ad2d5c592d3d090 (commit)
       via  32a3275344819cfcbcb4540a1909617b8db6dc63 (commit)
       via  804d3f897be01e9088deefe807cd06fe194c5d58 (commit)
       via  5b594c695884aebdfbb199549901fea954122929 (commit)
      from  f49129e59225f6ea84add8e845ffaeb03dc6c8da (commit)

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


- Log -----------------------------------------------------------------
commit 5a525f7f2855677531385874402e2d7a2f117944
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 17:16:21 2009 +0200

    s3:registry: db backend: add my C
    
    Michael

commit 78576117eb4292e4e2750928d5f84c2edc94192f
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 15 12:50:55 2009 +0200

    s3:registry: flush the provided subkey_ctr in regdb_fetch_keys_internal()
    
    This way, we always return what has really been read from the db,
    and not more. The callers assume exactly this, but one could hand
    in an already pre-filled subkey container...
    
    Michael

commit 92df5e4a0243bde6fbc5261bf6758090c4c35eee
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 15 12:47:12 2009 +0200

    s3:registry: add function regsubkey_ctr_reinit()
    
    This reinitializes an already allocated regsubkey_ctr structure,
    emptying out the subkey array and hash table.
    
    Michael

commit dc0bcfa188cb24c5a34f592ece946682d5fb8afe
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 15 12:45:43 2009 +0200

    s3:registry: turn regdb_fetch_keys_internal() from int to WERROR return type
    
    This way, more error information is propagated to the callers.
    
    Michael

commit c52dd1d5b81ce71855a3215f1b23704ac450fdee
Author: Michael Adam <ob...@samba.org>
Date:   Mon Jul 13 17:15:14 2009 +0200

    s3:registry: use transaction wrapper in create_sorted_subkeys()
    
    Michael

commit 109ea29b2c1a3bc752f9afda2c0010b9e675aa83
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 12:54:16 2009 +0200

    s3:registry: restructure logic of create_sorted_subkes() slightly
    
    This makes it clearer to me, and it also makes it easier to
    use the transaction retry wrapper in the next step.
    
    Michael

commit 2d6dbcd0b13da469f8b7dc6ed65e51d91ce1ab9c
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 11:04:20 2009 +0200

    s3:registry: use transaction wrapper in regdb_delete_subkey().
    
    Michael

commit a48d8353c79685371dbd2cc73b6c9032c5166a5b
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 10:54:18 2009 +0200

    s3:registry: add a comment header for the delete_subkey set of commands.
    
    Michael

commit 5640598cbb66fb0e65413e53a11ff82a553caad6
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 10:52:40 2009 +0200

    s3:registry: add a comment header for the create_subkey set of functions
    
    Michael

commit 8c7b9604931a787107bc01b359a231d376ed92c0
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 10:41:59 2009 +0200

    s3:registry: use transaction wrapper in regdb_create_subkey()
    
    Michael

commit 86d747e19f877c45ac32663ec2a3381ad03cdcf5
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 10:28:29 2009 +0200

    s3:registry: use transaction wrapper in regdb_store_keys_internal().
    
    Michael

commit f93c9e0d415b5c2e2fd73bb370db7b7e17ede9aa
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 00:21:46 2009 +0200

    s3:registry: don't leak to talloc_stack in regdb_store_keys_internal2()
    
    and catch one potential talloc failure.
    
    Michael

commit 3eec829e2fa2106c8d52f31e3f3d7f45e6c81b24
Author: Michael Adam <ob...@samba.org>
Date:   Thu Jul 9 00:10:08 2009 +0200

    s3:registry: unify exit logic and remove leaking to talloc_stack in 
regdb_store_keys_internal()
    
    Michael

commit 14f593aa0f43127ab78aec848b0fe5933c0c28c9
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 17:26:06 2009 +0200

    s3:registry: change regdb_store_keys_internal2() to return WERROR
    
    instead of bool for better error propagation.
    
    Michael

commit 1c65c98f3350951fe9f87a942b4c8a8094c8b781
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 13:58:52 2009 +0200

    s3:registry: refactor adding of builtin reg values out
    
    into regdb_ctr_add_value(). For readability.
    
    Michael

commit cf4f808b8b03c385b5b9e9f4a5e891ae92143001
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 13:10:37 2009 +0200

    s3:registry: use transaction wrapper in init_registry_data()
    
    Michael

commit e6340963cf549cda261fc1ba9da4bc1b3a071241
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 12:38:41 2009 +0200

    s3:registry: add regdb_store_values_internal() that takes a db_context 
argument
    
    Michael

commit 302265aae1bc27244ffaa9d803a8be83947e0381
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 12:32:48 2009 +0200

    s3:registry: add a regdb_fetch_values_internal() that takes a db_context 
argument
    
    Michael

commit 8a5b164b20c3d51df2422c1402ef31384b31472e
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 23:58:03 2009 +0200

    s3:registry: use transaction wrapper in init_registry_key().
    
    Michael

commit 95ebf534d2bc9904cc7c02bccdf5c01cc595ad7c
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 23:03:46 2009 +0200

    s3:registry: add db_context argument to init_registry_key_internal()
    
    Michael

commit a00109e1e6c1063b560be85c43ef820d3446ae31
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 12:42:09 2009 +0200

    s3:registry: panic upon error at transaction_cancel in create_sorted_subkeys
    
    Michael

commit 3189828087387686f63b3ae0b289c6e31f602a54
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 12:41:09 2009 +0200

    s3:registry: fix a comment in create_sorted_subkeys()
    
    Michael

commit 4c366a094693f050b2cadea771cd5c6eab29e278
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 12:39:32 2009 +0200

    s3:registry: don't loop transaction_commit in create_sorted_subkeys() upon 
error
    
    This would try to commit a higher level transaction upon commit-error.
    
    Michael

commit 6cb14409af5f708706f975143c7b40bb54c7a5c0
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 12:27:26 2009 +0200

    s3:registry: in regdb_delete_subkey(), don't use the transaction wrappers.
    
    This way, the db handle gets used explicitly and the core of the
    function can be abstracted.
    
    Michael

commit 4eeacd6ef0e1bb813062c30ac280e542c6b007c8
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 12:24:25 2009 +0200

    s3:registry: in regdb_delete_subkey(), panic if transaction_cancel fails
    
    Michael

commit 355892c296f7f245e5a5dd9070e3e776bedbf09c
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 12:20:23 2009 +0200

    s3:registry: panic upon failed transaction_cancel in regdb_create_subkey()
    
    Michael

commit 3409a44da2ee6a0ca2caaf0455e0095f8e2f80a4
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 11:41:08 2009 +0200

    s3:registry: don't use exported transaction wrappers in 
regdb_create_subkey()
    
    So that the regdb handle is again explicit and the core of the
    function can be abstracted.
    
    Michael

commit 1dfaa371fa027351a0af6e56a04bc045c3b0dc73
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 11:31:28 2009 +0200

    s3:registry: create regdb_store_keys_internal() with db_context argument
    
    and let exported regdb_store_keys() just call regdb_store_keys_internal()
    with regdb as an argument. Internally, in reg_backend_db.c, always use the
    _internal version.
    
    Michael

commit eb1958ca3d6cd30e292d2d013ff1ea63e65563fb
Author: Michael Adam <ob...@samba.org>
Date:   Tue Jul 7 11:11:10 2009 +0200

    s3:registry: rename regdb_store_keys_internal() to 
regdb_store_keys_internal2()
    
    Michael

commit 589bacfbdb7541be5d339fcaf08272520bf6a1ac
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 17:39:17 2009 +0200

    s3:registry: create regdb_fetch_keys_internal() with db_context argument
    
    and let exported regdb_fetch_keys() just call regdb_fetch_keys_internal()
    with regdb as an argument. Internally, in reg_backend_db.c, always use the
    _internal version.
    
    Michael

commit db4f797e3533b97df844a50a92e8a27a9248092b
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 17:18:19 2009 +0200

    s3:registry: add db_context argument to scan_parent_subkeys()
    
    Michael

commit c01d955ac0b6ef686cf026cc90074cd52a1a30ae
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 17:10:09 2009 +0200

    s3:registry: add db_context argument to regdb_fetch_key_internal()
    
    Michael

commit a18a10c07a3e32644c31f4742805795998227e44
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 17:00:44 2009 +0200

    s3:registry: add db_context argument to regdb_store_keys_internal()
    
    Michael

commit 528bf38875b9e5412da0a2810b17f05b2c376312
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 16:51:26 2009 +0200

    s3:registry: add db_context argument to regdb_delete_key_lists()
    
    Michael

commit 86e927cb056b30be3b2eecc1375549de71419b1f
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 16:48:36 2009 +0200

    s3:registry: add db_context argument to regdb_delete_subkeylist()
    
    Michael

commit bd983dba6b308c28019c2e39f16de8b9e434e4f5
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 16:44:20 2009 +0200

    s3:registry: add db_context argument to regdb_delete_secdesc()
    
    Michael

commit ec6b6727d824bea1b4a7b320e7a3c1de38df6724
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 16:42:20 2009 +0200

    s3:registry: add db_context argument to regdb_delete_values()
    
    Michael

commit 2b380c73a4796bdf69264e5ca6721ad0d67087e9
Author: Michael Adam <ob...@samba.org>
Date:   Fri Jul 3 16:40:43 2009 +0200

    s3:registry: add db_context argument to regdb_delete_key_with_prefix()
    
    Michael

commit d554c0d7a923f1194463481f0bd829042cee574a
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 16:16:18 2009 +0200

    s3:registry: don't store differently cased entries for the same keys.
    
    This happened for instance during registry initialization, when
    entries for HKLM\Software and HKLM\SOFTWARE were created.
    Searching these entries was case insensitive though.
    But the entries ended up in the subkey-lists anyways.
    
    This is solved by making the subkeys_hash in the regsubkey_container
    structs case insensitive (using the new _bystring_upper() wrappers).
    
    Michael

commit 3071b0712211b17b464f62d544fa16da5a128b01
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 15 09:58:02 2009 +0200

    s3:dbwrap_util: add my C
    
    Michael

commit 3b3125fc23dc4b7a403d17af2ad2d5c592d3d090
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 16:13:07 2009 +0200

    s3:dbwrap: add dbwrap_fetch_bystring_upper().
    
    To fetch a key whose name is stored but not given in upper case.
    
    Michael

commit 32a3275344819cfcbcb4540a1909617b8db6dc63
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 16:08:41 2009 +0200

    s3:dbwrap: add dbwrap_store_bystring_upper().
    
    This stores a key under the uppercase version of the given keyname.
    
    Michael

commit 804d3f897be01e9088deefe807cd06fe194c5d58
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 8 16:02:19 2009 +0200

    s3:dbwrap: add dbwrap_delete_bystring_upper()
    
    To delete a key whose name is not given in but stored in uppercase.
    
    Michael

commit 5b594c695884aebdfbb199549901fea954122929
Author: Michael Adam <ob...@samba.org>
Date:   Wed Jul 15 14:00:42 2009 +0200

    s3:dbwrap: add a wrapper dbwrap_trans_do()
    
    This function wraps the action() callback into a db
    transaction and the transaction is either committed
    or cancelled, depending on the return value of
    the action function.
    
    Michael

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

Summary of changes:
 source3/include/proto.h           |    9 +
 source3/lib/dbwrap_util.c         |   84 ++++
 source3/registry/reg_backend_db.c |  904 +++++++++++++++++++++----------------
 source3/registry/reg_objects.c    |   29 +-
 4 files changed, 634 insertions(+), 392 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index df78155..7bbdc04 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -454,6 +454,14 @@ NTSTATUS dbwrap_trans_store_uint32(struct db_context *db, 
const char *keystr,
 NTSTATUS dbwrap_trans_store_bystring(struct db_context *db, const char *key,
                                     TDB_DATA data, int flags);
 NTSTATUS dbwrap_trans_delete_bystring(struct db_context *db, const char *key);
+NTSTATUS dbwrap_trans_do(struct db_context *db,
+                        NTSTATUS (*action)(struct db_context *, void *),
+                        void *private_data);
+NTSTATUS dbwrap_delete_bystring_upper(struct db_context *db, const char *key);
+NTSTATUS dbwrap_store_bystring_upper(struct db_context *db, const char *key,
+                                    TDB_DATA data, int flags);
+TDB_DATA dbwrap_fetch_bystring_upper(struct db_context *db, TALLOC_CTX 
*mem_ctx,
+                                    const char *key);
 
 /* The following definitions come from lib/debug.c  */
 
@@ -5089,6 +5097,7 @@ WERROR registry_init_smbconf(const char *keyname);
 /* The following definitions come from registry/reg_objects.c  */
 
 WERROR regsubkey_ctr_init(TALLOC_CTX *mem_ctx, struct regsubkey_ctr **ctr);
+WERROR regsubkey_ctr_reinit(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 );
diff --git a/source3/lib/dbwrap_util.c b/source3/lib/dbwrap_util.c
index 3be3a49..6c95672 100644
--- a/source3/lib/dbwrap_util.c
+++ b/source3/lib/dbwrap_util.c
@@ -2,6 +2,7 @@
    Unix SMB/CIFS implementation.
    Utility functions for the dbwrap API
    Copyright (C) Volker Lendecke 2007
+   Copyrithg (C) Michael Adam 2009
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -307,3 +308,86 @@ NTSTATUS dbwrap_trans_delete_bystring(struct db_context 
*db, const char *key)
 {
        return dbwrap_trans_delete(db, string_term_tdb_data(key));
 }
+
+/**
+ * Wrap db action(s) into a transaction.
+ */
+NTSTATUS dbwrap_trans_do(struct db_context *db,
+                        NTSTATUS (*action)(struct db_context *, void *),
+                        void *private_data)
+{
+       int res;
+       NTSTATUS status;
+
+       res = db->transaction_start(db);
+       if (res != 0) {
+               DEBUG(5, ("transaction_start failed\n"));
+               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+       }
+
+       status = action(db, private_data);
+       if (!NT_STATUS_IS_OK(status)) {
+               if (db->transaction_cancel(db) != 0) {
+                       smb_panic("Cancelling transaction failed");
+               }
+               return status;
+       }
+
+       res = db->transaction_commit(db);
+       if (res == 0) {
+               return NT_STATUS_OK;
+       }
+
+       DEBUG(2, ("transaction_commit failed\n"));
+       return NT_STATUS_INTERNAL_DB_CORRUPTION;
+}
+
+NTSTATUS dbwrap_delete_bystring_upper(struct db_context *db, const char *key)
+{
+       char *key_upper;
+       NTSTATUS status;
+
+       key_upper = talloc_strdup_upper(talloc_tos(), key);
+       if (key_upper == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       status = dbwrap_delete_bystring(db, key_upper);
+
+       talloc_free(key_upper);
+       return status;
+}
+
+NTSTATUS dbwrap_store_bystring_upper(struct db_context *db, const char *key,
+                                    TDB_DATA data, int flags)
+{
+       char *key_upper;
+       NTSTATUS status;
+
+       key_upper = talloc_strdup_upper(talloc_tos(), key);
+       if (key_upper == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       status = dbwrap_store_bystring(db, key_upper, data, flags);
+
+       talloc_free(key_upper);
+       return status;
+}
+
+TDB_DATA dbwrap_fetch_bystring_upper(struct db_context *db, TALLOC_CTX 
*mem_ctx,
+                                    const char *key)
+{
+       char *key_upper;
+       TDB_DATA result;
+
+       key_upper = talloc_strdup_upper(talloc_tos(), key);
+       if (key_upper == NULL) {
+               return make_tdb_data(NULL, 0);
+       }
+
+       result = dbwrap_fetch_bystring(db, mem_ctx, key_upper);
+
+       talloc_free(key_upper);
+       return result;
+}
diff --git a/source3/registry/reg_backend_db.c 
b/source3/registry/reg_backend_db.c
index e296d31..dec43ae 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -2,6 +2,7 @@
  *  Unix SMB/CIFS implementation.
  *  Virtual Windows Registry Layer
  *  Copyright (C) Gerald Carter                     2002-2005
+ *  Copyright (C) Michael Adam                      2007-2009
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -27,8 +28,16 @@
 static struct db_context *regdb = NULL;
 static int regdb_refcount;
 
-static bool regdb_key_exists(const char *key);
+static bool regdb_key_exists(struct db_context *db, const char *key);
 static bool regdb_key_is_base_key(const char *key);
+static WERROR regdb_fetch_keys_internal(struct db_context *db, const char *key,
+                                       struct regsubkey_ctr *ctr);
+static bool regdb_store_keys_internal(struct db_context *db, const char *key,
+                                     struct regsubkey_ctr *ctr);
+static int regdb_fetch_values_internal(struct db_context *db, const char* key,
+                                      struct regval_ctr *values);
+static bool regdb_store_values_internal(struct db_context *db, const char *key,
+                                       struct regval_ctr *values);
 
 /* List the deepest path into the registry.  All part components will be 
created.*/
 
@@ -94,7 +103,8 @@ static struct builtin_regkey_value builtin_registry_values[] 
= {
  * Initialize a key in the registry:
  * create each component key of the specified path.
  */
-static WERROR init_registry_key_internal(const char *add_path)
+static WERROR init_registry_key_internal(struct db_context *db,
+                                        const char *add_path)
 {
        WERROR werr;
        TALLOC_CTX *frame = talloc_stackframe();
@@ -173,14 +183,20 @@ static WERROR init_registry_key_internal(const char 
*add_path)
                        goto fail;
                }
 
-               regdb_fetch_keys(base, subkeys);
+               werr = regdb_fetch_keys_internal(db, base, subkeys);
+               if (!W_ERROR_IS_OK(werr) &&
+                   !W_ERROR_EQUAL(werr, WERR_NOT_FOUND))
+               {
+                       goto fail;
+               }
+
                if (*subkeyname) {
                        werr = regsubkey_ctr_addkey(subkeys, subkeyname);
                        if (!W_ERROR_IS_OK(werr)) {
                                goto fail;
                        }
                }
-               if (!regdb_store_keys( base, subkeys)) {
+               if (!regdb_store_keys_internal(db, base, subkeys)) {
                        werr = WERR_CAN_NOT_COMPLETE;
                        goto fail;
                }
@@ -193,6 +209,20 @@ fail:
        return werr;
 }
 
+struct init_registry_key_context {
+       const char *add_path;
+};
+
+static NTSTATUS init_registry_key_action(struct db_context *db,
+                                        void *private_data)
+{
+       struct init_registry_key_context *init_ctx =
+               (struct init_registry_key_context *)private_data;
+
+       return werror_to_ntstatus(init_registry_key_internal(
+                                       db, init_ctx->add_path));
+}
+
 /**
  * Initialize a key in the registry:
  * create each component key of the specified path,
@@ -200,40 +230,104 @@ fail:
  */
 WERROR init_registry_key(const char *add_path)
 {
-       WERROR werr;
+       struct init_registry_key_context init_ctx;
 
-       if (regdb_key_exists(add_path)) {
+       if (regdb_key_exists(regdb, add_path)) {
                return WERR_OK;
        }
 
-       if (regdb->transaction_start(regdb) != 0) {
-               DEBUG(0, ("init_registry_key: transaction_start failed\n"));
-               return WERR_REG_IO_FAILURE;
-       }
+       init_ctx.add_path = add_path;
 
-       werr = init_registry_key_internal(add_path);
-       if (!W_ERROR_IS_OK(werr)) {
-               goto fail;
+       return ntstatus_to_werror(dbwrap_trans_do(regdb,
+                                                 init_registry_key_action,
+                                                 &init_ctx));
+}
+
+/***********************************************************************
+ Open the registry data in the tdb
+ ***********************************************************************/
+
+static void regdb_ctr_add_value(struct regval_ctr *ctr,
+                               struct builtin_regkey_value *value)
+{
+       UNISTR2 data;
+
+       switch(value->type) {
+       case REG_DWORD:
+               regval_ctr_addvalue(ctr, value->valuename, REG_DWORD,
+                                   (char*)&value->data.dw_value,
+                                   sizeof(uint32));
+               break;
+
+       case REG_SZ:
+               init_unistr2(&data, value->data.string, UNI_STR_TERMINATE);
+               regval_ctr_addvalue(ctr, value->valuename, REG_SZ,
+                                   (char*)data.buffer,
+                                   data.uni_str_len*sizeof(uint16));
+               break;
+
+       default:
+               DEBUG(0, ("regdb_ctr_add_value: invalid value type in "
+                         "registry values [%d]\n", value->type));
        }
+}
 
-       if (regdb->transaction_commit(regdb) != 0) {
-               DEBUG(0, ("init_registry_key: Could not commit transaction\n"));
-               return WERR_REG_IO_FAILURE;
+static NTSTATUS init_registry_data_action(struct db_context *db,
+                                         void *private_data)
+{
+       NTSTATUS status;
+       TALLOC_CTX *frame = talloc_stackframe();
+       struct regval_ctr *values;
+       int i;
+
+       /* loop over all of the predefined paths and add each component */
+
+       for (i=0; builtin_registry_paths[i] != NULL; i++) {
+               if (regdb_key_exists(db, builtin_registry_paths[i])) {
+                       continue;
+               }
+               status = werror_to_ntstatus(init_registry_key_internal(db,
+                                                 builtin_registry_paths[i]));
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto done;
+               }
        }
 
-       return WERR_OK;
+       /* loop over all of the predefined values and add each component */
 
-fail:
-       if (regdb->transaction_cancel(regdb) != 0) {
-               smb_panic("init_registry_key: transaction_cancel failed\n");
+       for (i=0; builtin_registry_values[i].path != NULL; i++) {
+
+               values = TALLOC_ZERO_P(frame, struct regval_ctr);
+               if (values == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto done;
+               }
+
+               regdb_fetch_values_internal(db,
+                                           builtin_registry_values[i].path,
+                                           values);
+
+               /* preserve existing values across restarts. Only add new ones 
*/
+
+               if (!regval_ctr_key_exists(values,
+                                       builtin_registry_values[i].valuename))
+               {
+                       regdb_ctr_add_value(values,
+                                           &builtin_registry_values[i]);
+                       regdb_store_values_internal(db,
+                                       builtin_registry_values[i].path,
+                                       values);
+               }
+               TALLOC_FREE(values);
        }
 
-       return werr;
-}
+       status = NT_STATUS_OK;
 
-/***********************************************************************
- Open the registry data in the tdb
- ***********************************************************************/
+done:
+
+       TALLOC_FREE(frame);
+       return status;
+}
 
 WERROR init_registry_data(void)
 {
@@ -241,14 +335,13 @@ WERROR init_registry_data(void)
        TALLOC_CTX *frame = talloc_stackframe();
        struct regval_ctr *values;
        int i;
-       UNISTR2 data;
 
        /*
         * First, check for the existence of the needed keys and values.
         * If all do already exist, we can save the writes.
         */
        for (i=0; builtin_registry_paths[i] != NULL; i++) {
-               if (!regdb_key_exists(builtin_registry_paths[i])) {
+               if (!regdb_key_exists(regdb, builtin_registry_paths[i])) {
                        goto do_init;
                }
        }
@@ -260,7 +353,9 @@ WERROR init_registry_data(void)
                        goto done;
                }
 
-               regdb_fetch_values(builtin_registry_values[i].path, values);
+               regdb_fetch_values_internal(regdb,
+                                           builtin_registry_values[i].path,
+                                           values);
                if (!regval_ctr_key_exists(values,
                                        builtin_registry_values[i].valuename))
                {
@@ -284,89 +379,9 @@ do_init:
         * transaction behaviour.
         */
 
-       if (regdb->transaction_start(regdb) != 0) {
-               DEBUG(0, ("init_registry_data: tdb_transaction_start "
-                         "failed\n"));
-               werr = WERR_REG_IO_FAILURE;
-               goto done;
-       }
-
-       /* loop over all of the predefined paths and add each component */
-
-       for (i=0; builtin_registry_paths[i] != NULL; i++) {
-               if (regdb_key_exists(builtin_registry_paths[i])) {
-                       continue;
-               }
-               werr = init_registry_key_internal(builtin_registry_paths[i]);
-               if (!W_ERROR_IS_OK(werr)) {
-                       goto fail;
-               }
-       }
-
-       /* loop over all of the predefined values and add each component */
-
-       for (i=0; builtin_registry_values[i].path != NULL; i++) {
-
-               values = TALLOC_ZERO_P(frame, struct regval_ctr);
-               if (values == NULL) {
-                       werr = WERR_NOMEM;
-                       goto fail;
-               }
-
-               regdb_fetch_values(builtin_registry_values[i].path, values);
-
-               /* preserve existing values across restarts. Only add new ones 
*/
-
-               if (!regval_ctr_key_exists(values,
-                                       builtin_registry_values[i].valuename))
-               {
-                       switch(builtin_registry_values[i].type) {
-                       case REG_DWORD:
-                               regval_ctr_addvalue(values,
-                                       builtin_registry_values[i].valuename,
-                                       REG_DWORD,
-                                       
(char*)&builtin_registry_values[i].data.dw_value,
-                                       sizeof(uint32));
-                               break;
-
-                       case REG_SZ:
-                               init_unistr2(&data,
-                                       builtin_registry_values[i].data.string,
-                                       UNI_STR_TERMINATE);
-                               regval_ctr_addvalue(values,
-                                       builtin_registry_values[i].valuename,
-                                       REG_SZ,
-                                       (char*)data.buffer,
-                                       data.uni_str_len*sizeof(uint16));
-                               break;
-
-                       default:
-                               DEBUG(0, ("init_registry_data: invalid value "
-                                         "type in builtin_registry_values "
-                                         "[%d]\n",
-                                         builtin_registry_values[i].type));
-                       }
-                       regdb_store_values(builtin_registry_values[i].path,
-                                          values);
-               }
-               TALLOC_FREE(values);
-       }
-
-       if (regdb->transaction_commit(regdb) != 0) {
-               DEBUG(0, ("init_registry_data: Could not commit "
-                         "transaction\n"));
-               werr = WERR_REG_IO_FAILURE;
-       } else {
-               werr = WERR_OK;
-       }
-
-       goto done;
-
-fail:
-       if (regdb->transaction_cancel(regdb) != 0) {
-               smb_panic("init_registry_data: tdb_transaction_cancel "
-                         "failed\n");
-       }
+       werr = ntstatus_to_werror(dbwrap_trans_do(regdb,
+                                                 init_registry_data_action,
+                                                 NULL));
 
 done:
        TALLOC_FREE(frame);
@@ -511,7 +526,8 @@ int regdb_get_seqnum(void)
 }
 
 
-static WERROR regdb_delete_key_with_prefix(const char *keyname,
+static WERROR regdb_delete_key_with_prefix(struct db_context *db,
+                                          const char *keyname,
                                           const char *prefix)
 {
        char *path;
@@ -537,7 +553,7 @@ static WERROR regdb_delete_key_with_prefix(const char 
*keyname,
                goto done;
        }
 
-       werr = ntstatus_to_werror(dbwrap_delete_bystring(regdb, path));
+       werr = ntstatus_to_werror(dbwrap_delete_bystring(db, path));
 
        /* treat "not" found" as ok */
        if (W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) {
@@ -550,40 +566,40 @@ done:
 }
 
 
-static WERROR regdb_delete_values(const char *keyname)
+static WERROR regdb_delete_values(struct db_context *db, const char *keyname)
 {
-       return regdb_delete_key_with_prefix(keyname, REG_VALUE_PREFIX);
+       return regdb_delete_key_with_prefix(db, keyname, REG_VALUE_PREFIX);
 }
 
-static WERROR regdb_delete_secdesc(const char *keyname)
+static WERROR regdb_delete_secdesc(struct db_context *db, const char *keyname)
 {
-       return regdb_delete_key_with_prefix(keyname, REG_SECDESC_PREFIX);
+       return regdb_delete_key_with_prefix(db, keyname, REG_SECDESC_PREFIX);
 }
 
-static WERROR regdb_delete_subkeylist(const char *keyname)
+static WERROR regdb_delete_subkeylist(struct db_context *db, const char 
*keyname)
 {
-       return regdb_delete_key_with_prefix(keyname, NULL);
+       return regdb_delete_key_with_prefix(db, keyname, NULL);
 }
 


-- 
Samba Shared Repository

Reply via email to