@@ -34,8 +34,8 @@ kas_strerror(int err)
34
34
ret = "Bad open mode; must be \"r\", \"w\", or \"a\"" ;
35
35
break ;
36
36
case KAS_ERR_BAD_FLAGS :
37
- ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP, "
38
- "KAS_READ_ALL or ) or 0 can be specified "
37
+ ret = "Unknown flags specified. Only (KAS_GET_TAKES_OWNERSHIP and/or "
38
+ "KAS_READ_ALL) or 0 can be specified "
39
39
"for open, and KAS_BORROWS_ARRAY or 0 for put" ;
40
40
break ;
41
41
case KAS_ERR_NO_MEMORY :
@@ -683,14 +683,39 @@ kastore_close(kastore_t *self)
683
683
return ret ;
684
684
}
685
685
686
+ static int
687
+ kastore_find_item (kastore_t * self , const char * key , size_t key_len , kaitem_t * * item )
688
+ {
689
+ int ret = KAS_ERR_KEY_NOT_FOUND ;
690
+ kaitem_t search ;
691
+ search .key = (char * ) malloc (key_len );
692
+ search .key_len = key_len ;
693
+
694
+ if (self -> mode != KAS_READ ) {
695
+ ret = KAS_ERR_ILLEGAL_OPERATION ;
696
+ goto out ;
697
+ }
698
+ if (search .key == NULL ) {
699
+ ret = KAS_ERR_NO_MEMORY ;
700
+ goto out ;
701
+ }
702
+ memcpy (search .key , key , key_len );
703
+ * item = bsearch (
704
+ & search , self -> items , self -> num_items , sizeof (kaitem_t ), compare_items );
705
+ if (* item == NULL ) {
706
+ goto out ;
707
+ }
708
+ ret = 0 ;
709
+ out :
710
+ kas_safe_free (search .key );
711
+ return ret ;
712
+ }
713
+
686
714
int KAS_WARN_UNUSED
687
715
kastore_contains (kastore_t * self , const char * key , size_t key_len )
688
716
{
689
- void * array ;
690
- size_t array_len ;
691
- int type ;
692
- int ret = kastore_get (self , key , key_len , & array , & array_len , & type );
693
-
717
+ kaitem_t * item ;
718
+ int ret = kastore_find_item (self , key , key_len , & item );
694
719
if (ret == 0 ) {
695
720
ret = 1 ;
696
721
} else if (ret == KAS_ERR_KEY_NOT_FOUND ) {
@@ -709,24 +734,9 @@ int KAS_WARN_UNUSED
709
734
kastore_get (kastore_t * self , const char * key , size_t key_len , void * * array ,
710
735
size_t * array_len , int * type )
711
736
{
712
- int ret = KAS_ERR_KEY_NOT_FOUND ;
713
- kaitem_t search ;
714
737
kaitem_t * item ;
715
- search .key = (char * ) malloc (key_len );
716
- search .key_len = key_len ;
717
-
718
- if (self -> mode != KAS_READ ) {
719
- ret = KAS_ERR_ILLEGAL_OPERATION ;
720
- goto out ;
721
- }
722
- if (search .key == NULL ) {
723
- ret = KAS_ERR_NO_MEMORY ;
724
- goto out ;
725
- }
726
- memcpy (search .key , key , key_len );
727
- item = bsearch (
728
- & search , self -> items , self -> num_items , sizeof (kaitem_t ), compare_items );
729
- if (item == NULL ) {
738
+ int ret = kastore_find_item (self , key , key_len , & item );
739
+ if (ret != 0 ) {
730
740
goto out ;
731
741
}
732
742
if (item -> array == NULL ) {
@@ -743,7 +753,6 @@ kastore_get(kastore_t *self, const char *key, size_t key_len, void **array,
743
753
}
744
754
ret = 0 ;
745
755
out :
746
- kas_safe_free (search .key );
747
756
return ret ;
748
757
}
749
758
@@ -908,6 +917,12 @@ kastore_bput(kastore_t *self, const char *key, size_t key_len, const void *array
908
917
if (ret != 0 ) {
909
918
goto out ;
910
919
}
920
+ if (array == NULL ) {
921
+ /* Both can't be null, so assign a dummy array */
922
+ item -> array = malloc (1 );
923
+ } else {
924
+ item -> borrowed_array = array ;
925
+ }
911
926
item -> borrowed_array = array ;
912
927
item -> array_len = array_len ;
913
928
out :
0 commit comments