]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon: CLI parameters
authorMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 28 Oct 2014 18:43:32 +0000 (19:43 +0100)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Tue, 28 Oct 2014 18:43:32 +0000 (19:43 +0100)
daemon/main.c
lib/context.c

index 04a0dca97751777eb2bc2509d5869c3e09b9b5da..f18e976c69f019ebcab22865c653fccf6152dee1 100644 (file)
@@ -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);
index ddc6a36d79b51d06350f955335a4cf4cae207673..823f64e98dd62138365d75b2b1064f453a1e36c0 100644 (file)
@@ -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;
 }