summaryrefslogtreecommitdiff
path: root/src/libdcache/dcache_load.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2024-09-13 09:38:07 +0000
committerLaurent Bercot <ska@appnovation.com>2024-09-13 09:38:07 +0000
commitfb355e4200fcf98f36a4f3e1fbeb1e16b4761ee6 (patch)
treebf78792e9206e121607ad786432c0b60bbdcdc72 /src/libdcache/dcache_load.c
parent45c04a53fb9fbefe4dd86514c7563b4af1961dfb (diff)
downloadshibari-main.tar.xz
Push what I have for nowHEADmain
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libdcache/dcache_load.c')
-rw-r--r--src/libdcache/dcache_load.c39
1 files changed, 27 insertions, 12 deletions
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 <skalibs/buffer.h>
#include <skalibs/tai.h>
#include <skalibs/djbunix.h>
+#include <skalibs/avltree.h>
#include <shibari/dcache.h>
+#include "dcache-internal.h"
#include <skalibs/posixishard.h>
+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 ;
}