X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=conff.c;h=7614fc295a44d60f15a37c9e6f7f08fc2398d987;hb=d2379cecf22c9e32d07b371fb05615d9bb2917aa;hp=b9242934aba8de5112fc555e11683709160d1c2c;hpb=69dd06bfd7bb894e0683361aa3fb9ce35ade3590;p=pkg%2Fabook.git diff --git a/conff.c b/conff.c index b924293..7614fc2 100644 --- a/conff.c +++ b/conff.c @@ -53,36 +53,44 @@ conff_free_node(struct conff_node *node) free(node); } -void +/* + * conff_add_key + * + * returns 0 if the key was successfully added + */ + +int conff_add_key(struct conff_node **ptr, char *key, char *value, int flags) { struct conff_node *new_item, *next = NULL; + int replace = 0; assert(key != NULL && value != NULL); for(; *ptr; ptr = &( (*ptr) -> next) ) if(!strcasecmp(key, (*ptr) -> key ) ) { if (flags & REPLACE_KEY) { - next = (*ptr) -> next; - conff_free_node(*ptr); + replace = 1; break; } else - return; + return 1; } - /* - * out of memory - error is ignored - * NOTE: with REPLACE_KEY flag the node will be deleted in OOM - * situation - */ if( (new_item = malloc(sizeof(struct conff_node))) == NULL ) - return; - + return 5; + + if(replace) { + next = (*ptr) -> next; + conff_free_node(*ptr); + } + new_item -> key = strdup(key); new_item -> value = strdup(value); new_item -> next = next; *ptr = new_item; + + return 0; } char * @@ -158,6 +166,8 @@ conff_load_file(struct conff_node **node, char *filename, int flags) char *line = NULL, *tmp; int i = 0; + assert(filename != NULL); + if (!(in = fopen(filename, "r"))) return -1;