summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/editreg.c66
1 files changed, 60 insertions, 6 deletions
diff --git a/source3/utils/editreg.c b/source3/utils/editreg.c
index f3a6c72a94..40fdd6eae9 100644
--- a/source3/utils/editreg.c
+++ b/source3/utils/editreg.c
@@ -419,12 +419,38 @@ typedef int (*key_print_f)(char *path, char *key_name, char *class_name,
int root, int terminal, int values);
typedef int (*val_print_f)(char *path, char *val_name, int val_type,
- int data_len, void *data_blk, int last);
+ int data_len, void *data_blk, int terminal,
+ int first, int last);
+
typedef struct regf_struct_s REGF;
int nt_key_iterator(REGF *regf, REG_KEY *key_tree, int bf, char *path,
key_print_f key_print, val_print_f val_print);
+int nt_val_list_iterator(REGF *regf, VAL_LIST *val_list, int bf, char *path,
+ int terminal, val_print_f val_print)
+{
+ int i;
+
+ if (!val_list) return 1;
+
+ if (!val_print) return 1;
+
+ for (i=0; i<val_list->val_count; i++) {
+ if (!val_print(path, val_list->vals[i]->name, val_list->vals[i]->data_type,
+ val_list->vals[i]->data_len, val_list->vals[i]->data_blk,
+ terminal,
+ (i == 0),
+ (i == val_list->val_count))) {
+
+ return 0;
+
+ }
+ }
+
+ return 1;
+}
+
int nt_key_list_iterator(REGF *regf, KEY_LIST *key_list, int bf, char *path,
key_print_f key_print, val_print_f val_print)
{
@@ -462,10 +488,6 @@ int nt_key_iterator(REGF *regf, REG_KEY *key_tree, int bf, char *path,
return 0;
}
- /*
- * Now, iterate through the keys in the key list
- */
-
new_path = (char *)malloc(path_len + 1 + strlen(key_tree->name) + 1);
if (!new_path) return 0; /* Errors? */
new_path[0] = '\0';
@@ -473,6 +495,23 @@ int nt_key_iterator(REGF *regf, REG_KEY *key_tree, int bf, char *path,
strcat(new_path, "\\");
strcat(new_path, key_tree->name);
+ /*
+ * Now, iterate through the values in the val_list
+ */
+
+ if (key_tree->values &&
+ !nt_val_list_iterator(regf, key_tree->values, bf, new_path,
+ (key_tree->values?(key_tree->values->val_count):0),
+ val_print)) {
+
+ free(new_path);
+ return 0;
+ }
+
+ /*
+ * Now, iterate through the keys in the key list
+ */
+
if (key_tree->sub_keys &&
!nt_key_list_iterator(regf, key_tree->sub_keys, bf, new_path, key_print,
val_print)) {
@@ -962,6 +1001,8 @@ VAL_LIST *process_vl(REGF *regf, VL_TYPE vl, int count, int size)
}
}
+ tmp->val_count = count;
+
return tmp;
error:
@@ -1251,6 +1292,19 @@ int print_key(char *path, char *name, char *class_name, int root,
return 1;
}
+/*
+ * Value print function here ...
+ */
+int print_val(char *path, char *val_name, int val_type, int data_len,
+ void *data_blk, int terminal, int first, int last)
+{
+ if (terminal && first)
+ fprintf(stdout, "%s\n", path);
+ fprintf(stdout, " %s : %s : \n", (val_name?val_name:"<No Name>"),
+ val_to_str(val_type, reg_type_names));
+ return 1;
+}
+
void usage(void)
{
fprintf(stderr, "Usage: editreg [-v] [-k] <registryfile>\n");
@@ -1313,7 +1367,7 @@ int main(int argc, char *argv[])
* to iterate over it.
*/
- nt_key_iterator(regf, regf->root, 0, "", print_key, NULL);
+ nt_key_iterator(regf, regf->root, 0, "", print_key, print_val);
return 0;
}