summaryrefslogtreecommitdiff
path: root/source3/utils/editreg.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/utils/editreg.c')
-rw-r--r--source3/utils/editreg.c62
1 files changed, 58 insertions, 4 deletions
diff --git a/source3/utils/editreg.c b/source3/utils/editreg.c
index e82991edc5..fb75601f26 100644
--- a/source3/utils/editreg.c
+++ b/source3/utils/editreg.c
@@ -386,6 +386,7 @@ typedef struct val_key_s {
typedef struct val_list_s {
int val_count;
+ int max_vals;
VAL_KEY *vals[1];
} VAL_LIST;
@@ -562,6 +563,7 @@ typedef struct vk_struct {
char dat_name[1]; /* Name starts here ... */
} VK_HDR;
+#define REG_TYPE_DELETE -1
#define REG_TYPE_NONE 0
#define REG_TYPE_REGSZ 1
#define REG_TYPE_EXPANDSZ 2
@@ -792,6 +794,7 @@ int nt_delete_val_key(VAL_KEY *val_key)
{
if (val_key) {
+ if (val_key->name) free(val_key->name);
if (val_key->data_blk) free(val_key->data_blk);
free(val_key);
};
@@ -959,20 +962,67 @@ int nt_delete_reg_key(REG_KEY *key, int delete_name)
}
/*
- * Add a value to the key specified ...
+ * Add a value to the key specified ... We have to parse the value some more
+ * based on the type to get it in the correct internal form
+ * An empty name will be converted to "<No Name>" before here
*/
REG_KEY *nt_add_reg_value(REG_KEY *key, char *name, int type, char *value)
{
+ int i;
+ VAL_KEY *tmp = NULL;
+
+ if (!key || !key->values || !name || !*name) return NULL;
+
+ assert(type != REG_TYPE_DELETE); /* We never process deletes here */
+
+ for (i = 0; i < key->values->val_count; i++) {
+ if (strcmp(name, key->values->vals[i]->name) == 0){ /* Change the value */
+
+
+ }
+ }
+
+ /*
+ * If we get here, the name was not found, so insert it
+ */
+
+ tmp = (VAL_KEY *)malloc(sizeof(VAL_KEY));
+ if (!tmp) goto error;
+
+ bzero(tmp, sizeof(VAL_KEY));
+ tmp->name = strdup(name);
+ if (!tmp->name) goto error;
+ tmp->data_type = type;
+ error:
+ if (tmp) nt_delete_val_key(tmp);
return NULL;
}
/*
- * Delete a value. Should perhaps return the value ...
+ * Delete a value. We return the value and let the caller deal witj it.
*/
-REG_KEY *nt_delete_reg_value(REG_KEY *key, char *name)
+VAL_KEY *nt_delete_reg_value(REG_KEY *key, char *name)
{
+ int i, j;
+
+ if (!key || !key->values || !name || !*name) return NULL;
+ for (i = 0; i< key->values->val_count; i++) {
+ if (strcmp(name, key->values->vals[i]->name) == 0) {
+ VAL_KEY *val;
+
+ val = key->values->vals[i];
+
+ /* Shuffle down */
+ for (j = i + 1; j < key->values->val_count; j++)
+ key->values->vals[j - 1] = key->values->vals[j];
+
+ key->values->val_count--;
+
+ return val;
+ }
+ }
return NULL;
}
@@ -1819,7 +1869,7 @@ VAL_KEY *process_vk(REGF *regf, VK_HDR *vk_hdr, int size)
return tmp;
error:
- /* XXX: FIXME, free the partially allocated struct */
+ if (tmp) nt_delete_val_key(tmp);
return NULL;
}
@@ -1855,6 +1905,7 @@ VAL_LIST *process_vl(REGF *regf, VL_TYPE vl, int count, int size)
}
tmp->val_count = count;
+ tmp->max_vals = count;
return tmp;
@@ -2415,6 +2466,8 @@ int parse_value_type(char *tstr)
return REG_TYPE_REGSZ;
else if (strcmp(tstr, "REG_MULTI_SZ") == 0)
return REG_TYPE_MULTISZ;
+ else if (strcmp(tstr, "-") == 0)
+ return REG_TYPE_DELETE;
return 0;
}
@@ -2624,6 +2677,7 @@ void trim_trailing_spaces(struct cmd_line *cl)
* value ::= <value-name>=<value-type>':'<value-string>
* <value-name> is some path, possibly enclosed in quotes ...
* We alctually look for the next key to terminate a previous key
+ * if <value-type> == '-', then it is a delete type.
*/
CMD *regedit4_get_cmd(int fd)
{