Browse Source

strset: set errno on strset_add failures.

Rusty Russell 14 years ago
parent
commit
2578442d9f
3 changed files with 13 additions and 5 deletions
  1. 6 2
      ccan/strset/strset.c
  2. 2 2
      ccan/strset/strset.h
  3. 5 1
      ccan/strset/test/run.c

+ 6 - 2
ccan/strset/strset.c

@@ -19,6 +19,7 @@
 #include <ccan/ilog/ilog.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <errno.h>
 
 struct node {
 	/* To differentiate us from strings. */
@@ -75,8 +76,10 @@ static bool set_string(struct strset *set,
 	/* Substitute magic empty node if this is the empty string */
 	if (unlikely(!member[0])) {
 		n->u.n = malloc(sizeof(*n->u.n));
-		if (unlikely(!n->u.n))
+		if (unlikely(!n->u.n)) {
+			errno = ENOMEM;
 			return false;
+		}
 		n->u.n->nul_byte = '\0';
 		n->u.n->byte_num = (size_t)-1;
 		/* Attach the string to child[0] */
@@ -108,6 +111,7 @@ bool strset_set(struct strset *set, const char *member)
 	for (byte_num = 0; str[byte_num] == member[byte_num]; byte_num++) {
 		if (member[byte_num] == '\0') {
 			/* All identical! */
+			errno = EEXIST;
 			return false;
 		}
 	}
@@ -122,7 +126,7 @@ bool strset_set(struct strset *set, const char *member)
 	/* Allocate new node. */
 	newn = malloc(sizeof(*newn));
 	if (!newn) {
-		/* FIXME */
+		errno = ENOMEM;
 		return false;
 	}
 	newn->nul_byte = '\0';

+ 2 - 2
ccan/strset/strset.h

@@ -65,8 +65,8 @@ char *strset_test(const struct strset *set, const char *member);
  * @set: the set.
  * @member: the string to place in the set.
  *
- * This returns false if we run out of memory, or (more normally) if that
- * string already appears in the set.
+ * This returns false if we run out of memory (errno = ENOMEM), or
+ * (more normally) if that string already appears in the set (EEXIST).
  *
  * Note that the pointer is placed in the set, the string is not copied.  If
  * you want a copy in the set, use strdup().

+ 5 - 1
ccan/strset/test/run.c

@@ -10,7 +10,7 @@ int main(void)
 	char *dup = strdup(str);
 
 	/* This is how many tests you plan to run */
-	plan_tests(24);
+	plan_tests(26);
 
 	strset_init(&set);
 
@@ -25,6 +25,10 @@ int main(void)
 	ok1(strset_test(&set, dup));
 	ok1(!strset_test(&set, none));
 
+	/* Add of duplicate should fail. */
+	ok1(!strset_set(&set, dup));
+	ok1(errno == EEXIST);
+
 	/* Delete should return original string. */
 	ok1(strset_clear(&set, dup) == str);
 	ok1(!strset_test(&set, str));