X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=conff.c;h=80e9c5fb61b4ebcabef92e608f5ce8656d0c1c50;hb=516879f5c54c7cfb1cea572d6fea8f664e8cc010;hp=b9242934aba8de5112fc555e11683709160d1c2c;hpb=f0d50589db0f5b8942b15995e97374dd58e53cb8;p=pkg%2Fabook.git diff --git a/conff.c b/conff.c index b924293..80e9c5f 100644 --- a/conff.c +++ b/conff.c @@ -53,36 +53,45 @@ 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; - + if( (new_item = (struct conff_node *)malloc(sizeof(struct conff_node))) + == NULL ) + 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 +167,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;