Making the webserver IPv6 capable.
[darkstat] / darkstat.c
index f079203..ca28b94 100644 (file)
@@ -1,5 +1,5 @@
 /* darkstat 3
- * copyright (c) 2001-2009 Emil Mikulic.
+ * copyright (c) 2001-2010 Emil Mikulic.
  *
  * darkstat.c: signals, cmdline parsing, program body.
  *
@@ -22,6 +22,7 @@
 
 #include "err.h"
 #include <arpa/inet.h>
+#include <netdb.h>
 #include <assert.h>
 #include <errno.h>
 #include <signal.h>
@@ -98,12 +99,21 @@ static void cb_no_lastseen(const char *arg _unused_) { want_lastseen = 0; }
 unsigned short bindport = 667;
 static void cb_port(const char *arg) { bindport = parsenum(arg, 65536); }
 
-in_addr_t bindaddr = INADDR_ANY;
+char * bindaddr = NULL;
 static void cb_bindaddr(const char *arg)
 {
-   bindaddr = inet_addr(arg);
-   if (bindaddr == (in_addr_t)INADDR_NONE)
+   struct addrinfo hints, *ai;
+
+   memset(&hints, '\0', sizeof(hints));
+   hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
+   hints.ai_family = AF_UNSPEC;
+   hints.ai_socktype = SOCK_STREAM;
+
+   if (getaddrinfo(arg, NULL, &hints, &ai))
       errx(1, "malformed address \"%s\"", arg);
+
+   freeaddrinfo(ai);
+   bindaddr = strdup(arg);
 }
 
 const char *filter = NULL;
@@ -177,6 +187,10 @@ unsigned int highest_port = 65535;
 static void cb_highest_port(const char *arg)
 { highest_port = parsenum(arg, 65535); }
 
+int wait_secs = -1;
+static void cb_wait_secs(const char *arg)
+{ wait_secs = parsenum(arg, 0); }
+
 int want_hexdump = 0;
 static void cb_hexdump(const char *arg _unused_) { want_hexdump = 1; }
 
@@ -215,6 +229,7 @@ static struct cmdline_arg cmdline_args[] = {
    {"--ports-max",    "count",           cb_ports_max,    0},
    {"--ports-keep",   "count",           cb_ports_keep,   0},
    {"--highest-port", "port",            cb_highest_port, 0},
+   {"--wait",         "secs",            cb_wait_secs,    0},
    {"--hexdump",      NULL,              cb_hexdump,      0},
    {NULL,             NULL,              NULL,            0}
 };