s3:registry: fix a comment in create_sorted_subkeys()
[ira/wip.git] / source3 / registry / reg_backend_db.c
index f4a269ef4610cea86cfb75afdd0d9c361075ada5..245e14b6d4686d4fa7a03db52080dcfdd0d30b7f 100644 (file)
 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 int 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);
 
 /* List the deepest path into the registry.  All part components will be created.*/
 
@@ -173,14 +177,14 @@ static WERROR init_registry_key_internal(const char *add_path)
                        goto fail;
                }
 
-               regdb_fetch_keys(base, subkeys);
+               regdb_fetch_keys_internal(regdb, base, subkeys);
                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(regdb, base, subkeys)) {
                        werr = WERR_CAN_NOT_COMPLETE;
                        goto fail;
                }
@@ -202,7 +206,7 @@ WERROR init_registry_key(const char *add_path)
 {
        WERROR werr;
 
-       if (regdb_key_exists(add_path)) {
+       if (regdb_key_exists(regdb, add_path)) {
                return WERR_OK;
        }
 
@@ -248,7 +252,7 @@ WERROR init_registry_data(void)
         * 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;
                }
        }
@@ -294,7 +298,7 @@ do_init:
        /* 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])) {
+               if (regdb_key_exists(regdb, builtin_registry_paths[i])) {
                        continue;
                }
                werr = init_registry_key_internal(builtin_registry_paths[i]);
@@ -601,9 +605,9 @@ done:
  fstrings
  ***********************************************************************/
 
-static bool regdb_store_keys_internal(struct db_context *db,
-                                     const char *key,
-                                     struct regsubkey_ctr *ctr)
+static bool regdb_store_keys_internal2(struct db_context *db,
+                                      const char *key,
+                                      struct regsubkey_ctr *ctr)
 {
        TDB_DATA dbuf;
        uint8 *buffer = NULL;
@@ -704,7 +708,8 @@ done:
  do not currently exist
  ***********************************************************************/
 
-bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
+static bool regdb_store_keys_internal(struct db_context *db, const char *key,
+                                     struct regsubkey_ctr *ctr)
 {
        int num_subkeys, old_num_subkeys, i;
        char *path = NULL;
@@ -713,7 +718,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
        TALLOC_CTX *ctx = talloc_stackframe();
        WERROR werr;
 
-       if (!regdb_key_is_base_key(key) && !regdb_key_exists(key)) {
+       if (!regdb_key_is_base_key(key) && !regdb_key_exists(db, key)) {
                goto fail;
        }
 
@@ -728,7 +733,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
                return false;
        }
 
-       regdb_fetch_keys(key, old_subkeys);
+       regdb_fetch_keys_internal(db, key, old_subkeys);
 
        num_subkeys = regsubkey_ctr_numkeys(ctr);
        old_num_subkeys = regsubkey_ctr_numkeys(old_subkeys);
@@ -755,7 +760,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
 
        TALLOC_FREE(old_subkeys);
 
-       if (regdb->transaction_start(regdb) != 0) {
+       if (db->transaction_start(db) != 0) {
                DEBUG(0, ("regdb_store_keys: transaction_start failed\n"));
                goto fail;
        }
@@ -770,7 +775,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
                goto cancel;
        }
 
-       regdb_fetch_keys(key, old_subkeys);
+       regdb_fetch_keys_internal(db, key, old_subkeys);
 
        /*
         * Make the store operation as safe as possible without transactions:
@@ -812,7 +817,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
                        goto cancel;
                }
 
-               werr = regdb_delete_key_lists(regdb, path);
+               werr = regdb_delete_key_lists(db, path);
                W_ERROR_NOT_OK_GOTO(werr, cancel);
 
                TALLOC_FREE(path);
@@ -822,7 +827,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
 
        /* (2) store the subkey list for the parent */
 
-       if (!regdb_store_keys_internal(regdb, key, ctr)) {
+       if (!regdb_store_keys_internal2(db, key, ctr)) {
                DEBUG(0,("regdb_store_keys: Failed to store new subkey list "
                         "for parent [%s]\n", key));
                goto cancel;
@@ -839,7 +844,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
                        goto cancel;
                }
 
-               if (!regdb_store_keys_internal(regdb, key, subkeys)) {
+               if (!regdb_store_keys_internal2(db, key, subkeys)) {
                        DEBUG(0,("regdb_store_keys: Failed to store "
                                 "new record for key [%s]\n", key));
                        goto cancel;
@@ -861,9 +866,9 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
                        goto cancel;
                }
 
-               if (regdb_fetch_keys( path, subkeys ) == -1) {
+               if (regdb_fetch_keys_internal(db, path, subkeys) == -1) {
                        /* create a record with 0 subkeys */
-                       if (!regdb_store_keys_internal(regdb, path, subkeys)) {
+                       if (!regdb_store_keys_internal2(db, path, subkeys)) {
                                DEBUG(0,("regdb_store_keys: Failed to store "
                                         "new record for key [%s]\n", path));
                                goto cancel;
@@ -874,7 +879,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
                TALLOC_FREE(path);
        }
 
-       if (regdb->transaction_commit(regdb) != 0) {
+       if (db->transaction_commit(db) != 0) {
                DEBUG(0, ("regdb_store_keys: Could not commit transaction\n"));
                goto fail;
        }
@@ -883,7 +888,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
        return true;
 
 cancel:
-       if (regdb->transaction_cancel(regdb) != 0) {
+       if (db->transaction_cancel(db) != 0) {
                smb_panic("regdb_store_keys: transaction_cancel failed\n");
        }
 
@@ -893,13 +898,18 @@ fail:
        return false;
 }
 
+bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr)
+{
+       return regdb_store_keys_internal(regdb, key, ctr);
+}
+
 static WERROR regdb_create_subkey(const char *key, const char *subkey)
 {
        WERROR werr;
        struct regsubkey_ctr *subkeys;
        TALLOC_CTX *mem_ctx = talloc_stackframe();
 
-       if (!regdb_key_is_base_key(key) && !regdb_key_exists(key)) {
+       if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) {
                werr = WERR_NOT_FOUND;
                goto done;
        }
@@ -907,7 +917,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey)
        werr = regsubkey_ctr_init(mem_ctx, &subkeys);
        W_ERROR_NOT_OK_GOTO_DONE(werr);
 
-       if (regdb_fetch_keys(key, subkeys) < 0) {
+       if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) {
                werr = WERR_REG_IO_FAILURE;
                goto done;
        }
@@ -919,13 +929,15 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey)
 
        talloc_free(subkeys);
 
-       werr = regdb_transaction_start();
-       W_ERROR_NOT_OK_GOTO_DONE(werr);
+       if (regdb->transaction_start(regdb) != 0) {
+               werr = WERR_REG_IO_FAILURE;
+               goto done;
+       }
 
        werr = regsubkey_ctr_init(mem_ctx, &subkeys);
        W_ERROR_NOT_OK_GOTO(werr, cancel);
 
-       if (regdb_fetch_keys(key, subkeys) < 0) {
+       if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) {
                werr = WERR_REG_IO_FAILURE;
                goto cancel;
        }
@@ -933,26 +945,23 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey)
        werr = regsubkey_ctr_addkey(subkeys, subkey);
        W_ERROR_NOT_OK_GOTO(werr, cancel);
 
-       if (!regdb_store_keys_internal(regdb, key, subkeys)) {
+       if (!regdb_store_keys_internal2(regdb, key, subkeys)) {
                DEBUG(0, (__location__ " failed to store new subkey list for "
                         "parent key %s\n", key));
                werr = WERR_REG_IO_FAILURE;
                goto cancel;
        }
 
-       werr = regdb_transaction_commit();
-       if (!W_ERROR_IS_OK(werr)) {
-               DEBUG(0, (__location__ " failed to commit transaction: %s\n",
-                        win_errstr(werr)));
+       if (regdb->transaction_commit(regdb) != 0) {
+               werr = WERR_REG_IO_FAILURE;
+               DEBUG(0, (__location__ " failed to commit transaction\n"));
        }
 
        goto done;
 
 cancel:
-       werr = regdb_transaction_cancel();
-       if (!W_ERROR_IS_OK(werr)) {
-               DEBUG(0, (__location__ " failed to cancel transaction: %s\n",
-                        win_errstr(werr)));
+       if (regdb->transaction_cancel(regdb) != 0) {
+               smb_panic("regdb_create_subkey: transaction_cancel failed\n");
        }
 
 done:
@@ -962,12 +971,12 @@ done:
 
 static WERROR regdb_delete_subkey(const char *key, const char *subkey)
 {
-       WERROR werr, werr2;
+       WERROR werr;
        struct regsubkey_ctr *subkeys;
        char *path;
        TALLOC_CTX *mem_ctx = talloc_stackframe();
 
-       if (!regdb_key_is_base_key(key) && !regdb_key_exists(key)) {
+       if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) {
                werr = WERR_NOT_FOUND;
                goto done;
        }
@@ -978,13 +987,15 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey)
                goto done;
        }
 
-       if (!regdb_key_exists(path)) {
+       if (!regdb_key_exists(regdb, path)) {
                werr = WERR_OK;
                goto done;
        }
 
-       werr = regdb_transaction_start();
-       W_ERROR_NOT_OK_GOTO_DONE(werr);
+       if (regdb->transaction_start(regdb) != 0) {
+               werr = WERR_REG_IO_FAILURE;
+               goto done;
+       }
 
        werr = regdb_delete_key_lists(regdb, path);
        W_ERROR_NOT_OK_GOTO(werr, cancel);
@@ -992,7 +1003,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey)
        werr = regsubkey_ctr_init(mem_ctx, &subkeys);
        W_ERROR_NOT_OK_GOTO(werr, cancel);
 
-       if (regdb_fetch_keys(key, subkeys) < 0) {
+       if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) {
                werr = WERR_REG_IO_FAILURE;
                goto cancel;
        }
@@ -1000,26 +1011,23 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey)
        werr = regsubkey_ctr_delkey(subkeys, subkey);
        W_ERROR_NOT_OK_GOTO(werr, cancel);
 
-       if (!regdb_store_keys_internal(regdb, key, subkeys)) {
+       if (!regdb_store_keys_internal2(regdb, key, subkeys)) {
                DEBUG(0, (__location__ " failed to store new subkey_list for "
                         "parent key %s\n", key));
                werr = WERR_REG_IO_FAILURE;
                goto cancel;
        }
 
-       werr = regdb_transaction_commit();
-       if (!W_ERROR_IS_OK(werr)) {
-               DEBUG(0, (__location__ " failed to commit transaction: %s\n",
-                        win_errstr(werr)));
+       if (regdb->transaction_commit(regdb) != 0) {
+               DEBUG(0, (__location__ " failed to commit transaction\n"));
+               werr = WERR_REG_IO_FAILURE;
        }
 
        goto done;
 
 cancel:
-       werr2 = regdb_transaction_cancel();
-       if (!W_ERROR_IS_OK(werr2)) {
-               DEBUG(0, (__location__ " failed to cancel transaction: %s\n",
-                        win_errstr(werr2)));
+       if (regdb->transaction_cancel(regdb) != 0) {
+               smb_panic("regdb_delete_subkey: transaction_cancel failed\n");
        }
 
 done:
@@ -1027,7 +1035,8 @@ done:
        return werr;
 }
 
-static TDB_DATA regdb_fetch_key_internal(TALLOC_CTX *mem_ctx, const char *key)
+static TDB_DATA regdb_fetch_key_internal(struct db_context *db,
+                                        TALLOC_CTX *mem_ctx, const char *key)
 {
        char *path = NULL;
        TDB_DATA data;
@@ -1037,7 +1046,7 @@ static TDB_DATA regdb_fetch_key_internal(TALLOC_CTX *mem_ctx, const char *key)
                return make_tdb_data(NULL, 0);
        }
 
-       data = dbwrap_fetch_bystring(regdb, mem_ctx, path);
+       data = dbwrap_fetch_bystring(db, mem_ctx, path);
 
        TALLOC_FREE(path);
        return data;
@@ -1094,7 +1103,7 @@ done:
  * parent_subkey_scanner. The code uses parse_record() to avoid a memcpy of
  * the potentially large subkey record.
  *
- * The sorted subkey record is deleted in regdb_store_keys_internal and
+ * The sorted subkey record is deleted in regdb_store_keys_internal2 and
  * recreated on demand.
  */
 
@@ -1127,7 +1136,7 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname)
                goto fail;
        }
 
-       res = regdb_fetch_keys(key, ctr);
+       res = regdb_fetch_keys_internal(regdb, key, ctr);
        if (res == -1) {
                goto fail;
        }
@@ -1192,9 +1201,9 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname)
         * a transaction_commit for transactions that we might be wrapped in.
         */
        if (regdb->transaction_commit(regdb) == -1) {
-               DEBUG(0, ("create_sorted_subkeys: transaction_start "
+               DEBUG(0, ("create_sorted_subkeys: transaction_commit "
                          "failed\n"));
-               goto fail;
+               result = false;
        }
 
        TALLOC_FREE(ctr);
@@ -1244,7 +1253,8 @@ static int parent_subkey_scanner(TDB_DATA key, TDB_DATA data,
        return 0;
 }
 
-static bool scan_parent_subkeys(const char *parent, const char *name)
+static bool scan_parent_subkeys(struct db_context *db, const char *parent,
+                               const char *name)
 {
        char *path = NULL;
        char *key = NULL;
@@ -1271,8 +1281,8 @@ static bool scan_parent_subkeys(const char *parent, const char *name)
        }
        state.scanned = false;
 
-       res = regdb->parse_record(regdb, string_term_tdb_data(key),
-                                 parent_subkey_scanner, &state);
+       res = db->parse_record(db, string_term_tdb_data(key),
+                              parent_subkey_scanner, &state);
 
        if (state.scanned) {
                result = state.found;
@@ -1280,8 +1290,8 @@ static bool scan_parent_subkeys(const char *parent, const char *name)
                if (!create_sorted_subkeys(path, key)) {
                        goto fail;
                }
-               res = regdb->parse_record(regdb, string_term_tdb_data(key),
-                                         parent_subkey_scanner, &state);
+               res = db->parse_record(db, string_term_tdb_data(key),
+                                      parent_subkey_scanner, &state);
                if ((res == 0) && (state.scanned)) {
                        result = state.found;
                }
@@ -1301,7 +1311,7 @@ static bool scan_parent_subkeys(const char *parent, const char *name)
  * The exeption of this are keys without a parent key,
  * i.e. the "base" keys (HKLM, HKCU, ...).
  */
-static bool regdb_key_exists(const char *key)
+static bool regdb_key_exists(struct db_context *db, const char *key)
 {
        TALLOC_CTX *mem_ctx = talloc_stackframe();
        TDB_DATA value;
@@ -1325,11 +1335,11 @@ static bool regdb_key_exists(const char *key)
        p = strrchr(path, '/');
        if (p == NULL) {
                /* this is a base key */
-               value = regdb_fetch_key_internal(mem_ctx, path);
+               value = regdb_fetch_key_internal(db, mem_ctx, path);
                ret = (value.dptr != NULL);
        } else {
                *p = '\0';
-               ret = scan_parent_subkeys(path, p+1);
+               ret = scan_parent_subkeys(db, path, p+1);
        }
 
 done:
@@ -1343,7 +1353,8 @@ done:
  released by the caller.
  ***********************************************************************/
 
-int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr)
+static int regdb_fetch_keys_internal(struct db_context *db, const char *key,
+                                    struct regsubkey_ctr *ctr)
 {
        WERROR werr;
        uint32 num_items;
@@ -1357,16 +1368,16 @@ int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr)
 
        DEBUG(11,("regdb_fetch_keys: Enter key => [%s]\n", key ? key : "NULL"));
 
-       if (!regdb_key_exists(key)) {
+       if (!regdb_key_exists(db, key)) {
                goto done;
        }
 
-       werr = regsubkey_ctr_set_seqnum(ctr, regdb_get_seqnum());
+       werr = regsubkey_ctr_set_seqnum(ctr, db->get_seqnum(db));
        if (!W_ERROR_IS_OK(werr)) {
                goto done;
        }
 
-       value = regdb_fetch_key_internal(frame, key);
+       value = regdb_fetch_key_internal(db, frame, key);
 
        if (value.dptr == NULL) {
                DEBUG(10, ("regdb_fetch_keys: no subkeys found for key [%s]\n",
@@ -1397,6 +1408,11 @@ done:
        return ret;
 }
 
+int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr)
+{
+       return regdb_fetch_keys_internal(regdb, key, ctr);
+}
+
 /****************************************************************************
  Unpack a list of registry values frem the TDB
  ***************************************************************************/
@@ -1490,7 +1506,7 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values)
 
        DEBUG(10,("regdb_fetch_values: Looking for value of key [%s] \n", key));
 
-       if (!regdb_key_exists(key)) {
+       if (!regdb_key_exists(regdb, key)) {
                goto done;
        }
 
@@ -1501,7 +1517,7 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values)
 
        values->seqnum = regdb_get_seqnum();
 
-       value = regdb_fetch_key_internal(ctx, keystr);
+       value = regdb_fetch_key_internal(regdb, ctx, keystr);
 
        if (!value.dptr) {
                /* all keys have zero values by default */
@@ -1527,7 +1543,7 @@ bool regdb_store_values(const char *key, struct regval_ctr *values)
 
        DEBUG(10,("regdb_store_values: Looking for value of key [%s] \n", key));
 
-       if (!regdb_key_exists(key)) {
+       if (!regdb_key_exists(regdb, key)) {
                goto done;
        }
 
@@ -1585,7 +1601,7 @@ static WERROR regdb_get_secdesc(TALLOC_CTX *mem_ctx, const char *key,
 
        DEBUG(10, ("regdb_get_secdesc: Getting secdesc of key [%s]\n", key));
 
-       if (!regdb_key_exists(key)) {
+       if (!regdb_key_exists(regdb, key)) {
                err = WERR_BADFILE;
                goto done;
        }
@@ -1625,7 +1641,7 @@ static WERROR regdb_set_secdesc(const char *key,
        WERROR err = WERR_NOMEM;
        TDB_DATA tdbdata;
 
-       if (!regdb_key_exists(key)) {
+       if (!regdb_key_exists(regdb, key)) {
                err = WERR_BADFILE;
                goto done;
        }