diff options
Diffstat (limited to 'src/config')
-rw-r--r-- | src/config/defaults.c | 7 | ||||
-rw-r--r-- | src/config/lexparse.c | 62 |
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) ; |