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