regedit: use the right function to reopen a hive
authorChris Davis <cd.rattan@gmail.com>
Mon, 28 Jul 2014 00:39:06 +0000 (17:39 -0700)
committerMichael Adam <obnox@samba.org>
Wed, 1 Oct 2014 12:32:09 +0000 (14:32 +0200)
Signed-off-by: Chris Davis <cd.rattan@gmail.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
source3/utils/regedit.c
source3/utils/regedit_treeview.c
source3/utils/regedit_treeview.h

index cc3598b10b817d29b41cee553b9f66546cad1f66..d77c2e4c56833504ba675d1c151c7e52bee1ccf0 100644 (file)
@@ -187,7 +187,8 @@ static void add_reg_key(struct regedit *regedit, struct tree_node *node,
                        } else {
                                /* Reopen the parent key to make sure the
                                   new subkey will be noticed. */
-                               tree_node_reopen_key(parent);
+                               tree_node_reopen_key(regedit->registry_context,
+                                                    parent);
                        }
 
                        list = tree_node_first(node);
@@ -377,7 +378,8 @@ static void handle_tree_input(struct regedit *regedit, int c)
 
                        rv = reg_key_del(node, parent->key, node->name);
                        if (W_ERROR_IS_OK(rv)) {
-                               tree_node_reopen_key(parent);
+                               tree_node_reopen_key(regedit->registry_context,
+                                                    parent);
                                tree_view_clear(regedit->keys);
                                pop = tree_node_pop(&node);
                                talloc_free(pop);
@@ -434,7 +436,8 @@ static void handle_value_input(struct regedit *regedit, int c)
                                dialog_notice(regedit, DIA_ALERT, "Error",
                                              "Error editing value:\n%s", msg);
                        } else if (sel == DIALOG_OK) {
-                               tree_node_reopen_key(node);
+                               tree_node_reopen_key(regedit->registry_context,
+                                                    node);
                                value_list_load(regedit->vl, node->key);
                                value_list_set_current_item_by_name(regedit->vl,
                                                                    name);
@@ -458,7 +461,8 @@ static void handle_value_input(struct regedit *regedit, int c)
                                dialog_notice(regedit, DIA_ALERT, "Error",
                                              "Error creating value:\n%s", msg);
                        } else if (sel == DIALOG_OK) {
-                               tree_node_reopen_key(node);
+                               tree_node_reopen_key(regedit->registry_context,
+                                                    node);
                                value_list_load(regedit->vl, node->key);
                                value_list_set_current_item_by_name(regedit->vl,
                                                                    name);
@@ -480,7 +484,8 @@ static void handle_value_input(struct regedit *regedit, int c)
                                node = tree_view_get_current_node(regedit->keys);
                                reg_del_value(regedit, node->key,
                                              vitem->value_name);
-                               tree_node_reopen_key(node);
+                               tree_node_reopen_key(regedit->registry_context,
+                                                    node);
                                value_list_load(regedit->vl, node->key);
                        }
                }
index 47d92821e8af1b8e821ca0555bf92421d2ad2674..885e6d09981fa842b487dacaa50c23db84b3e426 100644 (file)
@@ -197,13 +197,24 @@ static uint32_t get_num_subkeys(struct tree_node *node)
        return 0;
 }
 
-WERROR tree_node_reopen_key(struct tree_node *node)
+WERROR tree_node_reopen_key(struct registry_context *ctx,
+                           struct tree_node *node)
 {
        SMB_ASSERT(node->parent != NULL);
        SMB_ASSERT(node->name != NULL);
        TALLOC_FREE(node->key);
-       return reg_open_key(node->parent, node->parent->key, node->name,
-                           &node->key);
+
+       if (tree_node_is_top_level(node)) {
+               WERROR rv;
+               struct registry_key *key;
+               rv = reg_get_predefined_key_by_name(ctx, node->name, &key);
+               if (W_ERROR_IS_OK(rv)) {
+                       node->key = talloc_steal(node, key);
+               }
+               return rv;
+       }
+
+       return reg_open_key(node, node->parent->key, node->name, &node->key);
 }
 
 bool tree_node_has_children(struct tree_node *node)
index 4d1851ab1d8e595cfd66d3498dfeb0878994c482..919507f9e220c00c560e5f39f10b2413c8ee0d68 100644 (file)
@@ -74,7 +74,8 @@ void tree_view_clear(struct tree_view *view);
 WERROR tree_view_set_root(struct tree_view *view, struct tree_node *root);
 WERROR tree_view_set_path(struct tree_view *view, const char **path);
 WERROR tree_view_update(struct tree_view *view, struct tree_node *list);
-WERROR tree_node_reopen_key(struct tree_node *node);
+WERROR tree_node_reopen_key(struct registry_context *ctx,
+                           struct tree_node *node);
 bool tree_node_has_children(struct tree_node *node);
 WERROR tree_node_load_children(struct tree_node *node);
 void tree_node_insert_sorted(struct tree_node *list, struct tree_node *node);