Exit (instead of busy-loop) when the interface goes down.
authorEmil Mikulic <emikulic@gmail.com>
Sun, 7 Dec 2014 05:12:15 +0000 (16:12 +1100)
committerEmil Mikulic <emikulic@gmail.com>
Sun, 7 Dec 2014 05:12:15 +0000 (16:12 +1100)
cap.c
cap.h
darkstat.c

diff --git a/cap.c b/cap.c
index 62da77d..2625655 100644 (file)
--- a/cap.c
+++ b/cap.c
@@ -112,6 +112,7 @@ static void cap_set_filter(pcap_t *pcap, const char *filter) {
    free(tmp_filter);
 }
 
+/* Start capturing on just one interface. Called from cap_start(). */
 static void cap_start_one(struct cap_iface *iface, const int promisc) {
    char errbuf[PCAP_ERRBUF_SIZE], *tmp_device;
    int linktype, snaplen, waited;
@@ -395,8 +396,10 @@ static void callback(u_char *user,
       acct_for(&sm, &iface->local_ips);
 }
 
-/* Process any packets currently in the capture buffer. */
-void cap_poll(fd_set *read_set _unused_on_linux_) {
+/* Process any packets currently in the capture buffer.
+ * Returns 0 on error (usually means the interface went down).
+ */
+int cap_poll(fd_set *read_set _unused_on_linux_) {
    struct cap_iface *iface;
    static int told = 0;
 
@@ -431,7 +434,7 @@ void cap_poll(fd_set *read_set _unused_on_linux_) {
          if (ret < 0) {
             warnx("pcap_dispatch('%s'): %s",
                iface->name, pcap_geterr(iface->pcap));
-            continue;
+            return 0;
          }
 
 #if 0 /* debugging */
@@ -449,6 +452,7 @@ void cap_poll(fd_set *read_set _unused_on_linux_) {
       }
    }
    cap_stats_update();
+   return 1;
 }
 
 void cap_stop(void) {
diff --git a/cap.h b/cap.h
index f9f455a..380c3b8 100644 (file)
--- a/cap.h
+++ b/cap.h
@@ -15,7 +15,7 @@ void cap_add_filter(const char *filter); /* call zero or more times */
 void cap_start(const int promisc);
 void cap_fd_set(fd_set *read_set, int *max_fd,
    struct timeval *timeout, int *need_timeout);
-void cap_poll(fd_set *read_set);
+int cap_poll(fd_set *read_set);
 void cap_stop(void);
 
 void cap_from_file(const char *capfile);
index c65631e..433e824 100644 (file)
@@ -412,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;
@@ -451,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");