More patchfile fixes. Write support should work now.
authorWilco Baan Hofman <wilco@synlap.(none)>
Tue, 15 Apr 2008 19:35:59 +0000 (21:35 +0200)
committerWilco Baan Hofman <wilco@synlap.(none)>
Tue, 15 Apr 2008 19:35:59 +0000 (21:35 +0200)
(This used to be commit cc38f2f086b92bbe65bd6e7f4e03fdf7f21ef2f6)

source4/lib/registry/patchfile_preg.c
source4/lib/registry/tests/diff.c

index ea41a9e21bbd49519cf2743ed487ad0c1aa28ead..c2bc8d10b351c33f7d215b55be40a8dd93f22cdb 100644 (file)
@@ -92,27 +92,40 @@ static WERROR reg_preg_diff_del_key(void *_data, const char *key_name)
        DATA_BLOB blob;
 
        parent_name = talloc_strndup(data->ctx, key_name, strrchr(key_name, '\\')-key_name);
-       blob.data = (void *)talloc_strndup(data->ctx, key_name, 
+       blob.data = (void *)talloc_strndup(data->ctx, key_name+(strrchr(key_name, '\\')-key_name)+1
                        strlen(key_name)-(strrchr(key_name, '\\')-key_name));
        blob.length = strlen((char *)blob.data)+1;
        
 
        /* FIXME: These values should be accumulated to be written at done(). */
-       reg_preg_diff_set_value(_data, parent_name, "**DeleteKeys", REG_SZ, blob);
-               
-       return WERR_OK;
+       return reg_preg_diff_set_value(data, parent_name, "**DeleteKeys", REG_SZ, blob);
 }
 
-/* FIXME These functions need to be implemented */
 static WERROR reg_preg_diff_del_value(void *_data, const char *key_name,
                                      const char *value_name)
 {
-       return WERR_NOT_SUPPORTED;
+       struct preg_data *data = _data;
+       char *val;
+       DATA_BLOB blob;
+
+       val = talloc_asprintf(data->ctx, "**Del.%s", value_name);
+
+       blob.data = (void *)talloc(data->ctx, uint32_t);
+       *(uint32_t *)blob.data = 0;
+       blob.length = 4;
+       return reg_preg_diff_set_value(data, key_name, val, REG_DWORD, blob);
 }
 
 static WERROR reg_preg_diff_del_all_values(void *_data, const char *key_name)
 {
-       return WERR_NOT_SUPPORTED;
+       struct preg_data *data = _data;
+       DATA_BLOB blob;
+
+       blob.data = (void *)talloc(data->ctx, uint32_t);
+       *(uint32_t *)blob.data = 0;     
+       blob.length = 4;
+
+       return reg_preg_diff_set_value(data, key_name, "**DelVals.", REG_DWORD, blob);
 }
 
 static WERROR reg_preg_diff_done(void *_data)
index 4bd868ea513653cec125b3948efd50efb08813e3..492f4de0b5f367d90f4ca9db745235820027d040 100644 (file)
@@ -211,21 +211,29 @@ static bool diff_setup_tcase(struct torture_context *tctx, void **data)
        error = reg_mount_hive(r2_ctx, r2_hkcu, HKEY_CURRENT_USER, NULL);
        torture_assert_werr_ok(tctx, error, "Mounting hive failed");
 
-       error = r1_ctx->ops->get_predefined_key(r2_ctx, HKEY_LOCAL_MACHINE, &key);
+       error = r1_ctx->ops->get_predefined_key(r1_ctx, HKEY_CURRENT_USER, &key);
+       torture_assert_werr_ok(tctx, error, "Opening HKEY_CURRENT_USER failed");
+       error = r1_ctx->ops->create_key(r1_ctx, key, "Network", NULL, NULL, &newkey);
+       torture_assert_werr_ok(tctx, error, "Opening HKCU\\Network failed");
+       error = r1_ctx->ops->create_key(r1_ctx, newkey, "L", NULL, NULL, &newkey);
+       torture_assert_werr_ok(tctx, error, "Opening HKCU\\Network\\L failed");
+
+       error = r2_ctx->ops->get_predefined_key(r2_ctx, HKEY_LOCAL_MACHINE, &key);
        torture_assert_werr_ok(tctx, error, "Opening HKEY_LOCAL_MACHINE failed");
-       error = r1_ctx->ops->create_key(r2_ctx, key, "Software", NULL, NULL, &newkey);
+       error = r2_ctx->ops->create_key(r2_ctx, key, "Software", NULL, NULL, &newkey);
        torture_assert_werr_ok(tctx, error, "Creating HKLM\\Sofware failed");
-       error = r1_ctx->ops->create_key(r2_ctx, newkey, "Microsoft", NULL, NULL, &newkey);
+       error = r2_ctx->ops->create_key(r2_ctx, newkey, "Microsoft", NULL, NULL, &newkey);
        torture_assert_werr_ok(tctx, error, "Creating HKLM\\Software\\Microsoft failed");
-       error = r1_ctx->ops->create_key(r2_ctx, newkey, "Windows", NULL, NULL, &newkey);
+       error = r2_ctx->ops->create_key(r2_ctx, newkey, "Windows", NULL, NULL, &newkey);
        torture_assert_werr_ok(tctx, error, "Creating HKLM\\Software\\Microsoft\\Windows failed");
-       error = r1_ctx->ops->create_key(r2_ctx, newkey, "CurrentVersion", NULL, NULL, &newkey);
+       error = r2_ctx->ops->create_key(r2_ctx, newkey, "CurrentVersion", NULL, NULL, &newkey);
        torture_assert_werr_ok(tctx, error, "Creating HKLM\\..\\Windows\\CurrentVersion failed");
-       error = r1_ctx->ops->create_key(r2_ctx, newkey, "Policies", NULL, NULL, &newkey);
+       error = r2_ctx->ops->create_key(r2_ctx, newkey, "Policies", NULL, NULL, &newkey);
        torture_assert_werr_ok(tctx, error, "Creating HKLM\\..\\CurrentVersion\\Policies failed");
-       error = r1_ctx->ops->create_key(r2_ctx, newkey, "Explorer", NULL, NULL, &newkey);
+       error = r2_ctx->ops->create_key(r2_ctx, newkey, "Explorer", NULL, NULL, &newkey);
        torture_assert_werr_ok(tctx, error, "Creating HKLM\\..\\Policies\\Explorer failed");
 
+
        blob.data = (void *)talloc(r2_ctx, uint32_t);
        SIVAL(blob.data, 0, 0x03ffffff);
        blob.length = sizeof(uint32_t);