cdbmake_addv.c (840B)
1 /* ISC license. */ 2 3 #include <errno.h> 4 #include <sys/uio.h> 5 6 #include <skalibs/uint32.h> 7 #include <skalibs/diuint32.h> 8 #include <skalibs/buffer.h> 9 #include <skalibs/genalloc.h> 10 #include <skalibs/siovec.h> 11 #include <skalibs/cdbmake.h> 12 #include "cdb-internal.h" 13 #include "cdbmake-internal.h" 14 15 int cdbmake_addv (cdbmaker *c, struct iovec const *kv, unsigned int kn, struct iovec const *dv, unsigned int dn) 16 { 17 size_t keylen = siovec_len(kv, kn) ; 18 size_t datalen = siovec_len(dv, dn) ; 19 if (keylen > UINT32_MAX || datalen > UINT32_MAX) return (errno = EOVERFLOW, 0) ; 20 21 if (!cdbmake_addbegin(c, keylen, datalen) 22 || buffer_putv(&c->b, kv, kn) < keylen 23 || buffer_putv(&c->b, dv, dn) < datalen 24 || !cdbmake_addend(c, keylen, datalen, cdb_hashv(kv, kn))) 25 { 26 genalloc_free(diuint32, &c->hplist) ; 27 return 0 ; 28 } 29 return 1 ; 30 }