2 * Samba Unix/Linux SMB client library
4 * Copyright (C) Christopher Davis 2012
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include "popt_common.h"
22 #include "lib/util/data_blob.h"
23 #include "lib/registry/registry.h"
25 #include "regedit_treeview.h"
26 #include "regedit_valuelist.h"
27 #include "regedit_dialog.h"
38 struct value_list *vl;
39 struct tree_view *keys;
44 /* load all available hives */
45 static struct tree_node *load_hives(TALLOC_CTX *mem_ctx,
46 struct registry_context *ctx)
48 const char *hives[] = {
52 "HKEY_PERFORMANCE_DATA",
54 "HKEY_CURRENT_CONFIG",
56 "HKEY_PERFORMANCE_TEXT",
57 "HKEY_PERFORMANCE_NLSTEXT",
60 struct tree_node *root, *prev, *node;
61 struct registry_key *key;
68 for (i = 0; hives[i] != NULL; ++i) {
69 rv = reg_get_predefined_key_by_name(ctx, hives[i], &key);
70 if (!W_ERROR_IS_OK(rv)) {
74 node = tree_node_new(mem_ctx, NULL, hives[i], key);
83 tree_node_append(prev, node);
91 static void print_heading(WINDOW *win, bool selected, const char *str)
94 wattron(win, A_REVERSE);
96 wattroff(win, A_REVERSE);
105 static void delete_key_callback(struct dialog *dia, int selection, void *arg)
107 struct regedit *regedit = arg;
109 //mvwprintw(regedit->main_window, 1, 0, "Selection: %d", selection);
111 if (selection == DIALOG_OK) {
115 talloc_free(regedit->dia);
119 static void delete_value_callback(struct dialog *dia, int selection, void *arg)
121 struct regedit *regedit = arg;
123 if (selection == DIALOG_OK) {
127 talloc_free(regedit->dia);
131 static void handle_tree_input(struct regedit *regedit, int c)
133 struct tree_node *node;
137 menu_driver(regedit->keys->menu, REQ_DOWN_ITEM);
138 node = item_userptr(current_item(regedit->keys->menu));
139 value_list_load(regedit->vl, node->key);
142 menu_driver(regedit->keys->menu, REQ_UP_ITEM);
143 node = item_userptr(current_item(regedit->keys->menu));
144 value_list_load(regedit->vl, node->key);
149 node = item_userptr(current_item(regedit->keys->menu));
150 if (node && tree_node_has_children(node)) {
151 tree_node_load_children(node);
152 tree_node_print_path(regedit->path_label,
154 tree_view_update(regedit->keys, node->child_head);
155 value_list_load(regedit->vl, node->child_head->key);
159 node = item_userptr(current_item(regedit->keys->menu));
160 if (node && node->parent) {
161 tree_node_print_path(regedit->path_label, node->parent);
162 node = tree_node_first(node->parent);
163 tree_view_update(regedit->keys, node);
164 value_list_load(regedit->vl, node->key);
169 node = item_userptr(current_item(regedit->keys->menu));
170 regedit->dia = dialog_confirm_new(regedit, "Delete Key",
171 regedit->main_window,
172 "Really delete key \"%s\"?",
174 dialog_set_cb(regedit->dia, delete_key_callback, regedit);
178 tree_view_show(regedit->keys);
179 value_list_show(regedit->vl);
182 static void handle_value_input(struct regedit *regedit, int c)
184 struct value_item *vitem;
188 menu_driver(regedit->vl->menu, REQ_DOWN_ITEM);
191 menu_driver(regedit->vl->menu, REQ_UP_ITEM);
197 vitem = item_userptr(current_item(regedit->vl->menu));
199 regedit->dia = dialog_confirm_new(regedit, "Delete Value",
200 regedit->main_window,
201 "Really delete value \"%s\"?",
203 dialog_set_cb(regedit->dia, delete_value_callback, regedit);
208 value_list_show(regedit->vl);
211 static void handle_dialog_input(struct regedit *regedit, int c)
215 dialog_driver(regedit->dia, DIALOG_LEFT);
218 dialog_driver(regedit->dia, DIALOG_RIGHT);
222 dialog_driver(regedit->dia, DIALOG_ENTER);
227 static void handle_main_input(struct regedit *regedit, int c)
231 regedit->tree_input = !regedit->tree_input;
232 print_heading(regedit->key_label, regedit->tree_input == true,
234 print_heading(regedit->value_label, regedit->tree_input == false,
238 if (regedit->tree_input) {
239 handle_tree_input(regedit, c);
241 handle_value_input(regedit, c);
246 /* test navigating available hives */
247 static void display_test_window(TALLOC_CTX *mem_ctx,
248 struct registry_context *ctx)
250 struct regedit *regedit;
251 struct tree_node *root;
258 keypad(stdscr, TRUE);
260 regedit = talloc_zero(mem_ctx, struct regedit);
261 SMB_ASSERT(regedit != NULL);
263 regedit->main_window = newwin(25, 80, 0, 0);
264 SMB_ASSERT(regedit->main_window != NULL);
266 keypad(regedit->main_window, TRUE);
268 mvwprintw(regedit->main_window, 0, 0, "Path: ");
269 regedit->path_label = derwin(regedit->main_window, 1, 65, 0, 6);
270 wprintw(regedit->path_label, "/");
272 root = load_hives(regedit, ctx);
273 SMB_ASSERT(root != NULL);
275 regedit->key_label = derwin(regedit->main_window, 1, 10, 2, 0);
276 regedit->value_label = derwin(regedit->main_window, 1, 10, 2, 25);
278 print_heading(regedit->key_label, true, "Keys");
279 regedit->keys = tree_view_new(regedit, root, regedit->main_window,
281 SMB_ASSERT(regedit->keys != NULL);
283 print_heading(regedit->value_label, false, "Values");
284 regedit->vl = value_list_new(regedit, regedit->main_window,
286 SMB_ASSERT(regedit->vl != NULL);
288 regedit->tree_input = true;
290 tree_view_show(regedit->keys);
291 value_list_show(regedit->vl);
293 regedit->main_panel = new_panel(regedit->main_window);
294 SMB_ASSERT(regedit->main_panel != NULL);
298 while ((c = wgetch(regedit->main_window)) != 'q') {
300 handle_dialog_input(regedit, c);
302 handle_main_input(regedit, c);
312 int main(int argc, char **argv)
314 struct poptOption long_options[] = {
318 POPT_COMMON_CONNECTION
319 POPT_COMMON_CREDENTIALS
324 struct user_auth_info *auth_info;
326 struct registry_context *ctx;
329 talloc_enable_leak_report_full();
331 frame = talloc_stackframe();
333 setup_logging("regedit", DEBUG_DEFAULT_STDERR);
334 lp_set_cmdline("log level", "0");
336 /* process options */
337 auth_info = user_auth_info_init(frame);
338 if (auth_info == NULL) {
341 popt_common_set_auth_info(auth_info);
342 pc = poptGetContext("regedit", argc, (const char **)argv, long_options, 0);
344 while ((opt = poptGetNextOpt(pc)) != -1) {
348 if (!lp_load_global(get_dyn_CONFIGFILE())) {
349 DEBUG(0, ("ERROR loading config file...\n"));
353 /* some simple tests */
355 rv = reg_open_samba3(frame, &ctx);
356 if (!W_ERROR_IS_OK(rv)) {
362 display_test_window(frame, ctx);
364 //talloc_report_full(frame, stdout);