diff --git a/daemon/main.c b/daemon/main.c index 04a0dca97751777eb2bc2509d5869c3e09b9b5da..f18e976c69f019ebcab22865c653fccf6152dee1 100644 --- a/daemon/main.c +++ b/daemon/main.c @@ -1,4 +1,10 @@ +#include <stdlib.h> +#include <string.h> +#include <getopt.h> + #include <uv.h> + +#include <common/sockaddr.h> #include "lib/resolve.h" #include "worker.h" @@ -8,8 +14,69 @@ void signal_handler(uv_signal_t *handle, int signum) uv_signal_stop(handle); } -int main(void) +static void help(void) +{ + printf("Usage: %sd [parameters]\n", + PACKAGE_NAME); + printf("\nParameters:\n" + " -a, --addr=[addr] Server address (default localhost#53).\n" + " -V, --version Print version of the server.\n" + " -h, --help Print help and usage.\n"); +} + +static int set_addr(struct sockaddr_storage *ss, char *addr) { + char *port = strchr(addr, '#'); + if (port) { + sockaddr_port_set(ss, atoi(port + 1)); + *port = '\0'; + } + + int family = AF_INET; + if (strchr(addr, ':')) { + family = AF_INET6; + } + + return sockaddr_set(ss, family, addr, sockaddr_port(ss)); +} + +int main(int argc, char **argv) +{ + + struct sockaddr_storage addr; + sockaddr_set(&addr, AF_INET, "127.0.0.1", 53); + + /* Long options. */ + int c = 0, li = 0, ret = 0; + struct option opts[] = { + {"addr", required_argument, 0, 'a'}, + {"version", no_argument, 0, 'V'}, + {"help", no_argument, 0, 'h'}, + {0, 0, 0, 0} + }; + while ((c = getopt_long(argc, argv, "a:Vh", opts, &li)) != -1) { + switch (c) + { + case 'a': + ret = set_addr(&addr, optarg); + if (ret != 0) { + fprintf(stderr, "Address '%s': %s\n", optarg, knot_strerror(ret)); + return EXIT_FAILURE; + } + break; + case 'V': + printf("%s, version %s\n", "Knot DNS Resolver", PACKAGE_VERSION); + return EXIT_SUCCESS; + case 'h': + case '?': + help(); + return EXIT_SUCCESS; + default: + help(); + return EXIT_FAILURE; + } + } + mm_ctx_t mm; mm_ctx_init(&mm); @@ -21,13 +88,10 @@ int main(void) uv_signal_start(&sigint, signal_handler, SIGINT); /* Bind to sockets. */ - /* TODO: list of sockets, configurable loops. */ uv_udp_t udp_sock; memset(&udp_sock, 0, sizeof(uv_udp_t)); - struct sockaddr_in anyaddr; - uv_ip4_addr("0.0.0.0", 3535, &anyaddr); uv_udp_init(loop, &udp_sock); - uv_udp_bind(&udp_sock, (struct sockaddr *)&anyaddr, 0); + uv_udp_bind(&udp_sock, (struct sockaddr *)&addr, 0); /* Start a worker. */ struct worker_ctx worker; @@ -35,7 +99,7 @@ int main(void) worker_start(&udp_sock, &worker); /* Run the event loop. */ - int ret = uv_run(loop, UV_RUN_DEFAULT); + ret = uv_run(loop, UV_RUN_DEFAULT); /* Cleanup. */ worker_stop(&udp_sock); diff --git a/lib/context.c b/lib/context.c index ddc6a36d79b51d06350f955335a4cf4cae207673..823f64e98dd62138365d75b2b1064f453a1e36c0 100644 --- a/lib/context.c +++ b/lib/context.c @@ -15,6 +15,10 @@ int kr_context_init(struct kr_context *ctx, mm_ctx_t *mm) kr_delegmap_init(&ctx->dp_map, mm); ctx->cache = kr_cache_open("/tmp/kresolved", 0, mm); + if (ctx->cache == NULL) { + fprintf(stderr, "Cache directory '/tmp/kresolved' not exists.\n"); + assert(ctx->cache); + } return 0; }