Author: jelmer Date: 2007-08-26 14:38:43 +0000 (Sun, 26 Aug 2007) New Revision: 24666
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24666 Log: Support relative paths in CreateKey. Modified: branches/4.0-regwrite/ branches/4.0-regwrite/source/lib/registry/local.c branches/4.0-regwrite/source/lib/registry/tests/registry.c Changeset: Property changes on: branches/4.0-regwrite ___________________________________________________________________ Name: bzr:revision-info ...skipped... Name: bzr:revision-id:v3-trunk0 ...skipped... Modified: branches/4.0-regwrite/source/lib/registry/local.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/local.c 2007-08-26 14:07:23 UTC (rev 24665) +++ branches/4.0-regwrite/source/lib/registry/local.c 2007-08-26 14:38:43 UTC (rev 24666) @@ -165,15 +165,25 @@ struct security_descriptor *security, struct registry_key **key) { - const struct local_key *local_parent = (const struct local_key *)parent_key; + const struct local_key *local_parent; struct hive_key *hivekey; const char **elements; int i; + char *last_part; - SMB_ASSERT(strchr(name, '\\') == NULL); + last_part = strrchr(name, '\\'); + if (last_part == NULL) { + last_part = name; + local_parent = (const struct local_key *)parent_key; + } else { + W_ERROR_NOT_OK_RETURN(reg_open_key(mem_ctx, parent_key, + talloc_strndup(mem_ctx, name, last_part-name), + &local_parent)); + last_part++; + } W_ERROR_NOT_OK_RETURN(hive_key_add_name(mem_ctx, local_parent->hive_key, - name, key_class, security, &hivekey)); + last_part, key_class, security, &hivekey)); if (local_parent->path.elements != NULL) { elements = talloc_array(hivekey, const char *, Modified: branches/4.0-regwrite/source/lib/registry/tests/registry.c =================================================================== --- branches/4.0-regwrite/source/lib/registry/tests/registry.c 2007-08-26 14:07:23 UTC (rev 24665) +++ branches/4.0-regwrite/source/lib/registry/tests/registry.c 2007-08-26 14:38:43 UTC (rev 24666) @@ -68,6 +68,33 @@ } /** + * Test creating a new nested subkey + */ +static bool test_create_nested_subkey(struct torture_context *tctx, + const void *_data) +{ + const struct registry_context *rctx = _data; + struct registry_key *root, *newkey1, *newkey2; + WERROR error; + + error = reg_get_predefined_key(rctx, HKEY_CLASSES_ROOT, &root); + torture_assert_werr_ok(tctx, error, + "getting predefined key failed"); + + error = reg_key_add_name(rctx, root, "Hamburg", NULL, NULL, + &newkey1); + torture_assert_werr_ok(tctx, error, "Creating key return code"); + torture_assert(tctx, newkey2 != NULL, "Creating new key"); + + error = reg_key_add_name(rctx, root, "Hamburg\\Hamburg", NULL, NULL, + &newkey2); + torture_assert_werr_ok(tctx, error, "Creating key return code"); + torture_assert(tctx, newkey2 != NULL, "Creating new key"); + + return true; +} + +/** * Test creating a new subkey */ static bool test_key_add_abs_top(struct torture_context *tctx, @@ -431,6 +458,8 @@ torture_tcase_add_simple_test(tcase, "get_predefined_key", test_get_predefined); torture_tcase_add_simple_test(tcase, "create_key", test_create_subkey); + torture_tcase_add_simple_test(tcase, "create_key", + test_create_nested_subkey); torture_tcase_add_simple_test(tcase, "key_add_abs", test_key_add_abs); torture_tcase_add_simple_test(tcase, "key_add_abs_top", test_key_add_abs_top); torture_tcase_add_simple_test(tcase, "set_value", test_set_value);
