summaryrefslogtreecommitdiff
path: root/src/libdcache/dcache_searchnode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libdcache/dcache_searchnode.c')
-rw-r--r--src/libdcache/dcache_searchnode.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/libdcache/dcache_searchnode.c b/src/libdcache/dcache_searchnode.c
new file mode 100644
index 0000000..ef7341c
--- /dev/null
+++ b/src/libdcache/dcache_searchnode.c
@@ -0,0 +1,28 @@
+/* ISC license. */
+
+#include <stdint.h>
+
+#include <skalibs/uint16.h>
+#include <skalibs/avltree.h>
+
+#include <shibari/dcache.h>
+#include "dcache-internal.h"
+
+int dcache_searchnode (dcache *z, uint32_t *idx, char const *q, uint16_t qlen, uint16_t qtype, tai const *stamp)
+{
+ dcache_node *node ;
+ uint32_t i ;
+ char key[4 + qlen] ;
+ uint16_pack_big(key, qtype) ;
+ uint16_pack_big(key+2, qlen) ;
+ memcpy(key+4, q, qlen) ;
+ if (!avltree_search(&z->by_key, &k, &i)) return -1 ;
+ node = DNODE(z, i) ;
+ if (node->sa.len == node->sa.a && !tai_less(stamp, &node->expire))
+ {
+ dcache_delete(z, i) ;
+ return -1 ;
+ }
+ *idx = i ;
+ return node->sa.len == node->sa.a ;
+}