about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2024-07-18 20:55:16 +0000
committerLaurent Bercot <ska@appnovation.com>2024-07-18 20:55:16 +0000
commite5cc55570c2c986c71fc75bcde93620598db7be4 (patch)
treef8bfbe2546b31e3bece60847de9fb0384775b434
parentfa960ae9a5363bbd51fb704532397fe6d5ea49f9 (diff)
downloadshibari-e5cc55570c2c986c71fc75bcde93620598db7be4.tar.gz
shibari-e5cc55570c2c986c71fc75bcde93620598db7be4.tar.xz
shibari-e5cc55570c2c986c71fc75bcde93620598db7be4.zip
Add accept directive to cache-config
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--package/deps.mak1
-rw-r--r--src/cache/access.c47
-rw-r--r--src/cache/tcpconnection.c44
-rw-r--r--src/config/lexparse.c30
4 files changed, 77 insertions, 45 deletions
diff --git a/package/deps.mak b/package/deps.mak
index ac7f0c4..e008943 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -8,6 +8,7 @@ src/include/shibari/packet.h: src/include/shibari/tdb.h
 src/include/shibari/server.h: src/include/shibari/log.h src/include/shibari/packet.h src/include/shibari/tdb.h
 src/include/shibari/shibari.h: src/include/shibari/cache.h src/include/shibari/client.h src/include/shibari/common.h src/include/shibari/server.h
 src/libdcache/dcache-internal.h: src/include/shibari/dcache.h
+src/cache/access.o src/cache/access.lo: src/cache/access.c src/cache/shibari-cache-internal.h
 src/cache/cache.o src/cache/cache.lo: src/cache/cache.c src/cache/shibari-cache-internal.h src/include/shibari/dcache.h
 src/cache/conf.o src/cache/conf.lo: src/cache/conf.c src/cache/shibari-cache-internal.h
 src/cache/shibari-cache.o src/cache/shibari-cache.lo: src/cache/shibari-cache.c src/cache/shibari-cache-internal.h src/include/shibari/cache.h src/include/shibari/common.h src/include/shibari/config.h
diff --git a/src/cache/access.c b/src/cache/access.c
new file mode 100644
index 0000000..8f87125
--- /dev/null
+++ b/src/cache/access.c
@@ -0,0 +1,47 @@
+/* ISC license. */
+
+#include <stdint.h>
+
+#include <skalibs/cdb.h>
+
+#include "shibari-cache-internal.h"
+
+static inline int check (char const *key, size_t keylen)
+{
+  cdb_data data ;
+  return cdb_find(&confdb, &data, key, keylen) ;
+}
+
+int ip4_access (char const *ip)
+{
+  int r ;
+  char key[9] = "A4:" ;
+  uint8_t i = 33 ;
+  memcpy(key+4, ip, 4) ;
+  key[8] = 0 ;
+  while (i--)
+  {
+    key[3] = i ;
+    key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ;
+    r = check(key, 8) ;
+    if (r) return r ;
+  }
+  return 0 ;
+}
+
+int ip6_access (char const *ip)
+{
+  int r ;
+  char key[21] = "A6:" ;
+  uint8_t i = 129 ;
+  memcpy(key+4, ip, 16) ;
+  key[20] = 0 ;
+  while (i--)
+  {
+    key[3] = i ;
+    key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ;
+    r = check(key, 20) ;
+    if (r) return r ;
+  }
+  return 0 ;
+}
diff --git a/src/cache/tcpconnection.c b/src/cache/tcpconnection.c
index 7c7f714..bd72fb4 100644
--- a/src/cache/tcpconnection.c
+++ b/src/cache/tcpconnection.c
@@ -1,49 +1,5 @@
 /* ISC license. */
 
-#include <stdint.h>
-
-#include <skalibs/cdb.h>
-
 #include "shibari-cache-internal.h"
 
 genset *tcpconn = 0 ;
-
-static inline int check (char const *key, size_t keylen)
-{
-  cdb_data data ;
-  return cdb_find(&confdb, &data, key, keylen) ;
-}
-
-int tcp4_access (char const *ip)
-{
-  int r ;
-  char key[9] = "A4:" ;
-  uint8_t i = 33 ;
-  memcpy(key+4, ip, 4) ;
-  key[8] = 0 ;
-  while (i--)
-  {
-    key[3] = i ;
-    key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ;
-    r = check(key, 8) ;
-    if (r) return r ;
-  }
-  return 0 ;
-}
-
-int tcp6_access (char const *ip)
-{
-  int r ;
-  char key[21] = "A6:" ;
-  uint8_t i = 129 ;
-  memcpy(key+4, ip, 16) ;
-  key[20] = 0 ;
-  while (i--)
-  {
-    key[3] = i ;
-    key[4 + (i>>3)] &= ~(1U << (7 - (i & 7))) ;
-    r = check(key, 20) ;
-    if (r) return r ;
-  }
-  return 0 ;
-}
diff --git a/src/config/lexparse.c b/src/config/lexparse.c
index fbf1431..9fa3416 100644
--- a/src/config/lexparse.c
+++ b/src/config/lexparse.c
@@ -5,7 +5,9 @@
 #include <stdlib.h>
 #include <errno.h>
 
+#include <skalibs/uint16.h>
 #include <skalibs/uint32.h>
+#include <skalibs/fmtscan.h>
 #include <skalibs/bitarray.h>
 #include <skalibs/buffer.h>
 #include <skalibs/strerr.h>
@@ -52,7 +54,10 @@ static void conftree_checkunique (char const *key, mdt const *md)
   {
     char fmt[UINT32_FMT] ;
     fmt[uint32_fmt(fmt, node->line)] = 0 ;
-    strerr_diefn(1, 12, "duplicate ", "key ", key, " in file ", g.storage.s + md->filepos, " line ", md->linefmt, ", previously defined", " in file ", g.storage.s + node->filepos, " line ", fmt) ;
+    if (key[0] == 'A')
+      strerr_diefn(1, 11, "duplicate ", "key in file ", g.storage.s + md->filepos, " line ", md->linefmt, ", previously defined", " in file ", g.storage.s + node->filepos, " line ", fmt) ;
+    else
+      strerr_diefn(1, 12, "duplicate ", "key ", key, " in file ", g.storage.s + md->filepos, " line ", md->linefmt, ", previously defined", " in file ", g.storage.s + node->filepos, " line ", fmt) ;
   }
 }
 
@@ -124,6 +129,29 @@ static inline void parse_listen (char const *s, size_t const *word, size_t n, md
 
 static inline void parse_accept (char const *s, size_t const *word, size_t n, mdt const *md)
 {
+  char key[21] = "A?:" ;
+  if (!n)
+    strerr_dief6x(1, "too few arguments to directive ", "accept", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ;
+  for (size_t i = 0 ; i < n ; i++)
+  {
+    uint16_t mask ;
+    uint8_t ipz = 16 ;
+    size_t n = ip6_scan(s + word[i], key + 4) ;
+    if (!n)
+    {
+       ipz = 4 ;
+       n = ip4_scan(s + word[i], key + 4) ;
+       if (!n) goto err ;
+    }
+    if (s[word[i] + n] != '/' && s[word[i] + n] != '_') goto err ;
+    if (!uint160_scan(s + word[i] + n + 1, &mask) || mask > (ipz << 3)) goto err ;
+    key[1] = ipz == 16 ? '6' : '4' ;
+    key[3] = (uint8_t)mask ;
+    if (ipz == 16) ip6_netmask(key + 4, mask) ; else ip4_netmask(key + 4, mask) ;
+    add_unique(key, "", 0, md) ;
+  }
+ err:
+  strerr_dief6x(1, "arguments to directive ", "accept", " must be IP/mask in file ", g.storage.s + md->filepos, " line ", md->linefmt) ;
 }
 
 static inline void parse_server (char const *s, size_t const *word, size_t n, mdt const *md, int forward)