Update scan-build call.
[darkstat] / darkstat.c
index 8713998..e3282ec 100644 (file)
@@ -1,5 +1,5 @@
 /* darkstat 3
- * copyright (c) 2001-2011 Emil Mikulic.
+ * copyright (c) 2001-2014 Emil Mikulic.
  *
  * darkstat.c: signals, cmdline parsing, program body.
  *
 #include "db.h"
 #include "dns.h"
 #include "err.h"
-#include "http.h"
 #include "hosts_db.h"
+#include "http.h"
 #include "localip.h"
 #include "ncache.h"
 #include "now.h"
 #include "pidfile.h"
+#include "str.h"
 
 #include <assert.h>
 #include <errno.h>
@@ -75,7 +76,7 @@ static void cb_interface(const char *arg) {
 
 static void cb_filter(const char *arg) { cap_add_filter(arg); }
 
-const char *opt_capfile = NULL;
+static const char *opt_capfile = NULL;
 static void cb_capfile(const char *arg) { opt_capfile = arg; }
 
 int opt_want_snaplen = -1;
@@ -91,13 +92,13 @@ static void cb_syslog(const char *arg _unused_) { opt_want_syslog = 1; }
 int opt_want_verbose = 0;
 static void cb_verbose(const char *arg _unused_) { opt_want_verbose = 1; }
 
-int opt_want_daemonize = 1;
+static int opt_want_daemonize = 1;
 static void cb_no_daemon(const char *arg _unused_) { opt_want_daemonize = 0; }
 
-int opt_want_promisc = 1;
+static int opt_want_promisc = 1;
 static void cb_no_promisc(const char *arg _unused_) { opt_want_promisc = 0; }
 
-int opt_want_dns = 1;
+static int opt_want_dns = 1;
 static void cb_no_dns(const char *arg _unused_) { opt_want_dns = 0; }
 
 int opt_want_macs = 1;
@@ -106,7 +107,7 @@ static void cb_no_macs(const char *arg _unused_) { opt_want_macs = 0; }
 int opt_want_lastseen = 1;
 static void cb_no_lastseen(const char *arg _unused_) { opt_want_lastseen = 0; }
 
-unsigned short opt_bindport = 667;
+static unsigned short opt_bindport = 667;
 static void cb_port(const char *arg)
 { opt_bindport = (unsigned short)parsenum(arg, 65536); }
 
@@ -123,51 +124,26 @@ int opt_want_local_only = 0;
 static void cb_local_only(const char *arg _unused_)
 { opt_want_local_only = 1; }
 
-const char *opt_chroot_dir = NULL;
+static const char *opt_chroot_dir = NULL;
 static void cb_chroot(const char *arg) { opt_chroot_dir = arg; }
 
-const char *opt_privdrop_user = NULL;
+static const char *opt_base = NULL;
+static void cb_base(const char *arg) { opt_base = arg; }
+
+static const char *opt_privdrop_user = NULL;
 static void cb_user(const char *arg) { opt_privdrop_user = arg; }
 
-const char *opt_daylog_fn = NULL;
-static void cb_daylog(const char *arg)
-{
-   if (opt_chroot_dir == NULL)
-      errx(1, "the daylog file is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --daylog.");
-   else
-      opt_daylog_fn = arg;
-}
+static const char *opt_daylog_fn = NULL;
+static void cb_daylog(const char *arg) { opt_daylog_fn = arg; }
 
-const char *import_fn = NULL;
-static void cb_import(const char *arg)
-{
-   if (opt_chroot_dir == NULL)
-      errx(1, "the import file is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --import.");
-   else
-      import_fn = arg;
-}
+static const char *import_fn = NULL;
+static void cb_import(const char *arg) { import_fn = arg; }
 
-const char *export_fn = NULL;
-static void cb_export(const char *arg)
-{
-   if ((opt_chroot_dir == NULL) && (opt_capfile == NULL))
-      errx(1, "the export file is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --export.");
-   else
-      export_fn = arg;
-}
+static const char *export_fn = NULL;
+static void cb_export(const char *arg) { export_fn = arg; }
 
 static const char *pid_fn = NULL;
-static void cb_pidfile(const char *arg)
-{
-   if (opt_chroot_dir == NULL)
-      errx(1, "the pidfile is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --pidfile.");
-   else
-      pid_fn = arg;
-}
+static void cb_pidfile(const char *arg) { pid_fn = arg; }
 
 unsigned int opt_hosts_max = 1000;
 static void cb_hosts_max(const char *arg)
@@ -177,7 +153,7 @@ unsigned int opt_hosts_keep = 500;
 static void cb_hosts_keep(const char *arg)
 { opt_hosts_keep = parsenum(arg, 0); }
 
-unsigned int opt_ports_max = 200;
+unsigned int opt_ports_max = 60;
 static void cb_ports_max(const char *arg)
 { opt_ports_max = parsenum(arg, 65536); }
 
@@ -197,7 +173,7 @@ int opt_want_hexdump = 0;
 static void cb_hexdump(const char *arg _unused_)
 { opt_want_hexdump = 1; }
 
-int opt_want_help = 0;
+static int opt_want_help = 0;
 static void cb_help(const char *arg _unused_)
 { opt_want_help = 1; }
 static void cb_version(const char *arg _unused_)
@@ -218,6 +194,7 @@ static struct cmdline_arg cmdline_args[] = {
    {"-p",             "port",            cb_port,         0},
    {"-b",             "bindaddr",        cb_bindaddr,    -1},
    {"-l",             "network/netmask", cb_local,        0},
+   {"--base",         "path",            cb_base,         0},
    {"--local-only",   NULL,              cb_local_only,   0},
    {"--snaplen",      "bytes",           cb_snaplen,      0},
    {"--pppoe",        NULL,              cb_pppoe,        0},
@@ -329,9 +306,7 @@ static void parse_cmdline(const int argc, char * const *argv) {
    if (opt_want_syslog)
       openlog("darkstat", LOG_NDELAY | LOG_PID, LOG_DAEMON);
 
-   /* some default values */
-   if (opt_chroot_dir == NULL)
-      opt_chroot_dir = CHROOT_DIR;
+   /* default value */
    if (opt_privdrop_user == NULL)
       opt_privdrop_user = PRIVDROP_USER;
 
@@ -381,8 +356,8 @@ static void run_from_capfile(void) {
    hosts_db_free();
    graph_free();
    verbosef("Total packets: %llu, bytes: %llu",
-            (unsigned long long)acct_total_packets,
-            (unsigned long long)acct_total_bytes);
+            (llu)acct_total_packets,
+            (llu)acct_total_bytes);
 }
 
 /* --- Program body --- */
@@ -411,6 +386,7 @@ main(int argc, char **argv)
    /* do this first as it forks - minimize memory use */
    if (opt_want_dns) dns_init(opt_privdrop_user);
    cap_start(opt_want_promisc); /* needs root */
+   http_init_base(opt_base);
    http_listen(opt_bindport);
    ncache_init(); /* must do before chroot() */
 
@@ -436,7 +412,10 @@ main(int argc, char **argv)
    daemonize_finish();
 
    while (running) {
-      int select_ret, max_fd = -1, use_timeout = 0;
+      int select_ret;
+      int max_fd = -1;
+      int use_timeout = 0;
+      int cap_ret;
       struct timeval timeout;
       struct timespec t;
       fd_set rs, ws;
@@ -475,10 +454,14 @@ main(int argc, char **argv)
       }
 
       graph_rotate();
-      cap_poll(&rs);
+      cap_ret = cap_poll(&rs);
       dns_poll();
       http_poll(&rs, &ws);
       timer_stop(&t, 1000000000, "event processing took longer than a second");
+
+      if (!cap_ret) {
+         running = 0;
+      }
    }
 
    verbosef("shutting down");