typedef struct val_list_s {
int val_count;
+ int max_vals;
VAL_KEY *vals[1];
} VAL_LIST;
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
{
if (val_key) {
+ if (val_key->name) free(val_key->name);
if (val_key->data_blk) free(val_key->data_blk);
free(val_key);
};
}
/*
- * 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;
}
return tmp;
error:
- /* XXX: FIXME, free the partially allocated struct */
+ if (tmp) nt_delete_val_key(tmp);
return NULL;
}
}
tmp->val_count = count;
+ tmp->max_vals = count;
return tmp;
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;
}
* 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)
{