From fb355e4200fcf98f36a4f3e1fbeb1e16b4761ee6 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Fri, 13 Sep 2024 09:38:07 +0000 Subject: Push what I have for now Signed-off-by: Laurent Bercot --- src/libdcache/dcache_load.c | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'src/libdcache/dcache_load.c') diff --git a/src/libdcache/dcache_load.c b/src/libdcache/dcache_load.c index 0693b21..f195b28 100644 --- a/src/libdcache/dcache_load.c +++ b/src/libdcache/dcache_load.c @@ -9,32 +9,47 @@ #include #include #include +#include #include +#include "dcache-internal.h" #include +static inline int dcache_adjust_node (dcache *z, uint32_t i, char const *data, uint16_t datalen, tai const *entry, tai const *expire) +{ + /* can't happen. Complete if it ever can. */ + return (errno = EDOM, 0) ; +} + +static inline int dcache_add_keydata (dcache *z, char const *q, uint16_t qlen, uint16_t qtype, char const *data, uint16_t datalen, tai const *entry, tai const *expire) +{ + uint32_t i ; + if (dcache_search_g(z, &i, q, qlen, qtype)) return dcache_adjust_node(z, i, data, datalen, entry, expire) ; + return dcache_add(z, q, qlen, qtype, data, datalen, entry, expire) ; +} + static inline int dcache_load_node (dcache *z, buffer *b) { tai entry, expire ; - uint16_t keylen ; - uint16_t datalen ; - char pack[TAI_PACK * 2 + 4] ; - ssize_t r = buffer_get(b, pack, TAI_PACK * 2 + 4) ; + uint16_t qtype, qlen, datalen ; + char pack[TAI_PACK * 2 + 6] ; + ssize_t r = buffer_get(b, pack, TAI_PACK * 2 + 6) ; if (!r) return 0 ; - if (r < TAI_PACK * 2 + 4) return -1 ; + if (r < TAI_PACK * 2 + 6) return -1 ; tai_unpack(pack, &entry) ; tai_unpack(pack + TAI_PACK, &expire) ; - uint16_unpack_big(pack + TAI_PACK * 2, &keylen) ; - uint16_unpack_big(pack + TAI_PACK * 2 + 2, &datalen) ; + uint16_unpack_big(pack + TAI_PACK * 2, &datalen) ; + uint16_unpack_big(pack + TAI_PACK * 2 + 2, &qtype) ; + uint16_unpack_big(pack + TAI_PACK * 2 + 4, &qlen) ; { - uint32_t len = (uint32_t)keylen + (uint32_t)datalen ; - char blob[len+1] ; /* 128 kB max, it's ok */ - r = buffer_get(b, blob, len+1) ; + uint32_t len = qlen + datalen ; + char blob[len+1] ; /* 128 kB max */ + r = buffer_get(b, blob, len + 1) ; if (!r) return (errno = EPIPE, -1) ; - if (r < len) return -1 ; + if (r <= len) return -1 ; if (blob[len]) return (errno = EPROTO, -1) ; -// if (!dcache_add(z, blob, keylen, blob + keylen, datalen, &expire, &entry)) return -1 ; + if (!dcache_add_keydata(z, blob, qlen, qtype, blob + qlen, datalen, &entry, &expire)) return -1 ; } return 1 ; } -- cgit v1.2.3