e6b5fa51ee59d56e98ec050e7d4525f0cf03b799
[kai/samba.git] / source4 / lib / registry / tools / regshell.c
1 /* 
2    Unix SMB/CIFS implementation.
3    simple registry frontend
4    
5    Copyright (C) Jelmer Vernooij 2004
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24 /* 
25  * ck/cd - change key
26  * ls - list values/keys
27  * rmval/rm - remove value
28  * rmkey/rmdir - remove key
29  * mkkey/mkdir - make key
30  * help
31  * exit
32  */
33
34 static REG_KEY *cmd_set(REG_KEY *cur, int argc, char **argv)
35 {
36         /* FIXME */
37         return NULL;
38 }
39
40 static REG_KEY *cmd_ck(REG_KEY *cur, int argc, char **argv)
41
42         REG_KEY *new;
43         if(argc < 2) {
44                 new = cur;
45         } else {
46                 new = reg_open_key(cur, argv[1]);
47         }
48         
49         if(!new) new = cur;
50
51         printf("Current path is: %s\n", reg_key_get_path(new));
52         
53         return new;
54 }
55
56 static REG_KEY *cmd_ls(REG_KEY *cur, int argc, char **argv)
57 {
58         int i, num;
59         num = reg_key_num_subkeys(cur);
60         for(i = 0; i < num; i++) {
61                 REG_KEY *sub = reg_key_get_subkey_by_index(cur, i);
62                 printf("K %s\n", reg_key_name(sub));
63         }
64
65         num = reg_key_num_values(cur);
66         for(i = 0; i < num; i++) {
67                 REG_VAL *sub = reg_key_get_value_by_index(cur, i);
68                 printf("V %s %s %s\n", reg_val_name(sub), str_regtype(reg_val_type(sub)), reg_val_data_string(sub));
69         }
70         
71         return NULL; 
72 }
73 static REG_KEY *cmd_mkkey(REG_KEY *cur, int argc, char **argv)
74
75         if(argc < 2) {
76                 fprintf(stderr, "Usage: mkkey <keyname>\n");
77                 return NULL;
78         }
79         
80         if(!reg_key_add_name(cur, argv[1])) {
81                 fprintf(stderr, "Error adding new subkey '%s'\n", argv[1]);
82                 return NULL;
83         }
84
85         fprintf(stderr, "Successfully added new subkey '%s' to '%s'\n", argv[1], reg_key_get_path(cur));
86         
87         return NULL; 
88 }
89
90 static REG_KEY *cmd_rmkey(REG_KEY *cur, int argc, char **argv)
91
92         REG_KEY *key;
93         if(argc < 2) {
94                 fprintf(stderr, "Usage: rmkey <name>\n");
95                 return NULL;
96         }
97
98         key = reg_open_key(cur, argv[1]);
99         if(!key) {
100                 fprintf(stderr, "No such subkey '%s'\n", argv[1]);
101                 return NULL;
102         }
103
104         if(!reg_key_del(key)) {
105                 fprintf(stderr, "Error deleting '%s'\n", argv[1]);
106         } else {
107                 fprintf(stderr, "Successfully deleted '%s'\n", argv[1]);
108         }
109         
110         return NULL; 
111 }
112
113 static REG_KEY *cmd_rmval(REG_KEY *cur, int argc, char **argv)
114
115         REG_VAL *val;
116         if(argc < 2) {
117                 fprintf(stderr, "Usage: rmval <valuename>\n");
118                 return NULL;
119         }
120
121         val = reg_key_get_value_by_name(cur, argv[1]);
122         if(!val) {
123                 fprintf(stderr, "No such value '%s'\n", argv[1]);
124                 return NULL;
125         }
126
127         if(!reg_val_del(val)) {
128                 fprintf(stderr, "Error deleting value '%s'\n", argv[1]);
129         } else {
130                 fprintf(stderr, "Successfully deleted value '%s'\n", argv[1]);
131         }
132
133         return NULL; 
134 }
135
136 static REG_KEY *cmd_exit(REG_KEY *cur, int argc, char **argv)
137 {
138         exit(0);
139         return NULL; 
140 }
141
142 static REG_KEY *cmd_help(REG_KEY *, int, char **);
143
144 struct {
145         const char *name;
146         const char *alias;
147         const char *help;
148         REG_KEY *(*handle)(REG_KEY *, int argc, char **argv);
149 } regshell_cmds[] = {
150         {"ck", "cd", "Change current key", cmd_ck },
151         {"list", "ls", "List values/keys in current key", cmd_ls },
152         {"mkkey", "mkdir", "Make new key", cmd_mkkey },
153         {"rmval", "rm", "Remove value", cmd_rmval },
154         {"rmkey", "rmdir", "Remove key", cmd_rmkey },
155         {"set", "update", "Update value", cmd_set },
156         {"help", "?", "Help", cmd_help },
157         {"exit", "quit", "Exit", cmd_exit },
158         {NULL }
159 };
160
161 static REG_KEY *cmd_help(REG_KEY *cur, int argc, char **argv)
162 {
163         int i;
164         printf("Available commands:\n");
165         for(i = 0; regshell_cmds[i].name; i++) {
166                 printf("%s - %s\n", regshell_cmds[i].name, regshell_cmds[i].help);
167         }
168         return NULL;
169
170
171 REG_KEY *process_cmd(REG_KEY *k, char *line)
172 {
173         int argc;
174         char **argv = NULL;
175         int ret, i;
176
177         if ((ret = poptParseArgvString(line, &argc, (const char ***) &argv)) != 0) {
178                 fprintf(stderr, "regshell: %s\n", poptStrerror(ret));
179                 return k;
180         }
181
182         for(i = 0; regshell_cmds[i].name; i++) {
183                 if(!strcmp(regshell_cmds[i].name, argv[0]) || 
184                    (regshell_cmds[i].alias && !strcmp(regshell_cmds[i].alias, argv[0]))) {
185                         return regshell_cmds[i].handle(k, argc, argv);
186                 }
187         }
188
189         fprintf(stderr, "No such command '%s'\n", argv[0]);
190         
191         return k;
192 }
193
194 int main (int argc, char **argv)
195 {
196         uint32  setparms, checkparms;
197         int opt;
198         char *backend = "dir";
199         REG_KEY *curkey = NULL;;
200         poptContext pc;
201         REG_HANDLE *h;
202         struct poptOption long_options[] = {
203                 POPT_AUTOHELP
204                 POPT_COMMON_SAMBA
205                 {"backend", 'b', POPT_ARG_STRING, &backend, 0, "backend to use", NULL},
206                 POPT_TABLEEND
207         };
208         
209         pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
210         
211         while((opt = poptGetNextOpt(pc)) != -1) {
212         }
213
214         h = reg_open(backend, poptPeekArg(pc), True);
215         if(!h) {
216                 fprintf(stderr, "Unable to open '%s' with backend '%s'\n", poptGetArg(pc), backend);
217                 return 1;
218         }
219         poptFreeContext(pc);
220
221     setup_logging("regtree", True);
222
223         curkey = reg_get_root(h);
224
225         if(!curkey) return 1;
226
227         while(True) {
228                 char *line, *prompt;
229                 
230                 asprintf(&prompt, "%s> ", reg_key_get_path(curkey));
231                 
232                 line = smb_readline(prompt, NULL, NULL);
233
234                 if(!line)
235                         break;
236
237                 if(line[0] != '\n') {
238                         REG_KEY *new = process_cmd(curkey, line);
239                         if(new)curkey = new;
240                 }
241         }
242
243         return 0;
244 }