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);

Reply via email to