Browse Source

strmap: set errno on strmap_add() failures.

Rusty Russell 14 years ago
parent
commit
ed1b25bbd0
3 changed files with 7 additions and 4 deletions
  1. 3 1
      ccan/strmap/strmap.c
  2. 2 2
      ccan/strmap/strmap.h
  3. 2 1
      ccan/strmap/test/run.c

+ 3 - 1
ccan/strmap/strmap.c

@@ -5,6 +5,7 @@
 #include <ccan/ilog/ilog.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <errno.h>
 
 struct node {
 	/* These point to strings or nodes. */
@@ -72,6 +73,7 @@ bool strmap_add_(struct strmap *map, const char *member, const void *value)
 	for (byte_num = 0; n->u.s[byte_num] == member[byte_num]; byte_num++) {
 		if (member[byte_num] == '\0') {
 			/* All identical! */
+			errno = EEXIST;
 			return false;
 		}
 	}
@@ -86,7 +88,7 @@ bool strmap_add_(struct strmap *map, const char *member, const void *value)
 	/* Allocate new node. */
 	newn = malloc(sizeof(*newn));
 	if (!newn) {
-		/* FIXME */
+		errno = ENOMEM;
 		return false;
 	}
 	newn->byte_num = byte_num;

+ 2 - 2
ccan/strmap/strmap.h

@@ -94,8 +94,8 @@ void *strmap_get_(const struct strmap *map, const char *member);
  * @member: the string to place in the map.
  * @v: the (non-NULL) value.
  *
- * This returns false if we run out of memory, or (more normally) if that
- * string already appears in the map.
+ * This returns false if we run out of memory (errno = ENOMEM), or
+ * (more normally) if that string already appears in the map (EEXIST).
  *
  * Note that the pointer is placed in the map, the string is not copied.  If
  * you want a copy in the map, use strdup().  Similarly for the value.

+ 2 - 1
ccan/strmap/test/run.c

@@ -14,7 +14,7 @@ int main(void)
 	char *v;
 
 	/* This is how many tests you plan to run */
-	plan_tests(31);
+	plan_tests(32);
 
 	strmap_init(&map);
 
@@ -31,6 +31,7 @@ int main(void)
 
 	/* Add a duplicate should fail. */
 	ok1(!strmap_add(&map, dup, val));
+	ok1(errno == EEXIST);
 	ok1(strmap_get(&map, dup) == val);
 
 	/* Delete should return original string. */