summaryrefslogtreecommitdiff
path: root/src/config
diff options
context:
space:
mode:
Diffstat (limited to 'src/config')
-rw-r--r--src/config/defaults.c7
-rw-r--r--src/config/lexparse.c62
2 files changed, 52 insertions, 17 deletions
diff --git a/src/config/defaults.c b/src/config/defaults.c
index 9fef25b..9222aa4 100644
--- a/src/config/defaults.c
+++ b/src/config/defaults.c
@@ -14,13 +14,18 @@ struct defaults_s
#define REC(k, v, n) { .key = (k), .value = (v), .vlen = (n) }
#define RECS(k, v) REC(k, (v), sizeof(v))
#define RECU32(k, u) { .key = (k), .value = (char const [4]){ (u) >> 24 & 0xffu, (u) >> 16 & 0xffu, (u) >> 8 & 0xffu, (u) & 0xffu }, .vlen = 4 }
+#define RECU64(k, u) { .key = (k), .value = (char const [8]){ (u) >> 56 & 0xffu, (u) >> 48 & 0xffu, (u) >> 40 & 0xffu, (u) >> 32 & 0xffu, (u) >> 24 & 0xffu, (u) >> 16 & 0xffu, (u) >> 8 & 0xffu, (u) & 0xffu }, .vlen = 8 }
static struct defaults_s const defaults[] =
{
RECU32("G:logv", 1),
- RECU32("G:maxtcp", 256),
REC("G:listen4", "\177\0\0\1", 4),
REC("G:listen6", "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1", 16),
+ RECU32("G:maxtcp", 256),
+ RECU32("G:maxqueries", 1024),
+ RECU64("G:cachesize", 1048576),
+ RECU32("G:rtimeout", 0),
+ RECU32("G:wtimeout", 0),
REC("R4:",
"\0\306\51\0\4"
diff --git a/src/config/lexparse.c b/src/config/lexparse.c
index 250fa62..093acf7 100644
--- a/src/config/lexparse.c
+++ b/src/config/lexparse.c
@@ -29,7 +29,12 @@ struct namevalue_s
enum directivevalue_e
{
T_VERBOSITY,
+ T_CACHESIZE,
T_MAXTCP,
+ T_MAXQUERIES,
+ T_RTIMEOUT,
+ T_WTIMEOUT,
+ T_CACHEFILE,
T_LISTEN,
T_ACCEPT,
T_SERVER,
@@ -101,25 +106,30 @@ static int ipcmp (void const *a, void const *b, size_t n)
}
-static inline void parse_verbosity (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line)
+static void parse_u32 (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line, char const *directive, char const *key)
{
- uint32_t v ;
+ uint32_t u ;
char pack[4] ;
- if (n != 1) dieparse(ifile, line, "verbosity", n ? "too many arguments" : "too few arguments", 0, 0, 0) ;
- if (!uint320_scan(s + word[0], &v)) dieparse(ifile, line, "verbosity", "argument must be an integer", 0, 0, 0) ;
- uint32_pack_big(pack, v) ;
- adds_unique(ifile, line, "verbosity", "G:logv", pack, 4) ;
+ if (n != 1) dieparse(ifile, line, directive, n ? "too many arguments" : "too few arguments", 0, 0, 0) ;
+ if (!uint320_scan(s + word[0], &u)) dieparse(ifile, line, directive, "argument must be an integer", 0, 0, 0) ;
+ uint32_pack_big(pack, u) ;
+ adds_unique(ifile, line, directive, key, pack, 4) ;
}
-static inline void parse_maxtcp (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line)
+static void parse_u64 (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line, char const *directive, char const *key)
{
- uint32_t max ;
- char pack[4] ;
- if (n != 1) dieparse(ifile, line, "maxtcp", n ? "too many arguments" : "too few arguments", 0, 0, 0) ;
- if (!uint320_scan(s + word[0], &max)) dieparse(ifile, line, "maxtcp", "argument must be an integer", 0, 0, 0) ;
- if (max > 4000) dieparse(ifile, line, "maxtcp", "argument must be 4000 or less", 0, 0, 0) ;
- uint32_pack_big(pack, max) ;
- adds_unique(ifile, line, "maxtcp", "G:maxtcp", pack, 4) ;
+ uint64_t u ;
+ char pack[8] ;
+ if (n != 1) dieparse(ifile, line, directive, n ? "too many arguments" : "too few arguments", 0, 0, 0) ;
+ if (!uint640_scan(s + word[0], &u)) dieparse(ifile, line, directive, "argument must be an integer", 0, 0, 0) ;
+ uint64_pack_big(pack, u) ;
+ adds_unique(ifile, line, directive, key, pack, 8) ;
+}
+
+static void parse_string (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line, char const *directive, char const *key)
+{
+ if (n != 1) dieparse(ifile, line, directive, n ? "too many arguments" : "too few arguments", 0, 0, 0) ;
+ adds_unique(ifile, line, directive, key, s + word[0], strlen(s + word[0]) + 1) ;
}
static inline void parse_listen (char const *s, size_t const *word, size_t n, char const *ifile, uint32_t line)
@@ -195,11 +205,16 @@ static inline void process_line (char const *s, size_t const *word, size_t n, ch
static struct namevalue_s const directives[] =
{
{ .name = "accept", .value = T_ACCEPT },
+ { .name = "cache_file", .value = T_CACHEFILE },
+ { .name = "cache_size", .value = T_CACHESIZE },
{ .name = "forward", .value = T_FORWARD },
{ .name = "listen", .value = T_LISTEN },
+ { .name = "maxqueries", .value = T_MAXQUERIES },
{ .name = "maxtcp", .value = T_MAXTCP },
+ { .name = "read_timeout", .value = T_RTIMEOUT },
{ .name = "server", .value = T_SERVER },
{ .name = "verbosity", .value = T_VERBOSITY },
+ { .name = "write_timeout", .value = T_WTIMEOUT },
} ;
struct namevalue_s const *directive ;
char const *word0 ;
@@ -210,10 +225,25 @@ static inline void process_line (char const *s, size_t const *word, size_t n, ch
switch (directive->value)
{
case T_VERBOSITY :
- parse_verbosity(s, word, n, ifile, line) ;
+ parse_u32(s, word, n, ifile, line, "verbosity", "G:logv") ;
+ break ;
+ case T_CACHESIZE :
+ parse_u64(s, word, n, ifile, line, "cache_size", "G:cachesize") ;
break ;
case T_MAXTCP :
- parse_maxtcp(s, word, n, ifile, line) ;
+ parse_u32(s, word, n, ifile, line, "maxtcp", "G:maxtcp") ;
+ break ;
+ case T_MAXQUERIES :
+ parse_u32(s, word, n, ifile, line, "maxqueries", "G:maxqueries") ;
+ break ;
+ case T_RTIMEOUT :
+ parse_u32(s, word, n, ifile, line, "read_timeout", "G:rtimeout") ;
+ break ;
+ case T_WTIMEOUT :
+ parse_u32(s, word, n, ifile, line, "write_timeout", "G:wtimeout") ;
+ break ;
+ case T_CACHEFILE :
+ parse_string(s, word, n, ifile, line, "cache_file", "G:cachefile") ;
break ;
case T_LISTEN :
parse_listen(s, word, n, ifile, line) ;