Check bounds before using index.
[darkstat] / hosts_db.h
index 47aaa9c..6abb777 100644 (file)
@@ -1,36 +1,33 @@
 /* darkstat 3
- * copyright (c) 2001-2008 Emil Mikulic.
+ * copyright (c) 2001-2014 Emil Mikulic.
  *
  * hosts_db.h: database of hosts, ports, protocols.
  *
  * You may use, modify and redistribute this file under the terms of the
  * GNU General Public License version 2. (see COPYING.GPL)
  */
+#ifndef __DARKSTAT_HOSTS_DB_H
+#define __DARKSTAT_HOSTS_DB_H
 
-#ifndef __HOSTS_DB_H
-#  define __HOSTS_DB_H 1
+#include <sys/types.h> /* for uint64_t */
 
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include "str.h"
-
-struct addr46 {
-   sa_family_t af;
-   union {
-      struct in_addr ip;
-      struct in6_addr ip6;
-   } addr;
-};
+#include "addr.h"
 
 struct hashtable;
 
 struct host {
-   struct addr46 ipaddr;
+   struct addr addr;
    char *dns;
    uint8_t mac_addr[6];
-   time_t last_seen;
-   struct hashtable *ports_tcp, *ports_udp, *ip_protos;
+   /* last_seen_mono is converted to/from time_t in export/import.
+    * It can be negative (due to machine reboots).
+    */
+   int64_t last_seen_mono;
+   struct hashtable *ports_tcp;
+   struct hashtable *ports_tcp_remote;
+   struct hashtable *ports_udp;
+   struct hashtable *ports_udp_remote;
+   struct hashtable *ip_protos;
 };
 
 struct port_tcp {
@@ -59,13 +56,7 @@ struct bucket {
 
 enum sort_dir { IN, OUT, TOTAL, LASTSEEN };
 
-extern int show_mac_addrs;
-
-/*
- * Table reduction - when the number of entries is about to exceed <max>, we
- * reduce the table to the top <keep> entries.
- */
-extern unsigned int hosts_max, hosts_keep, ports_max, ports_keep;
+extern int hosts_db_show_macs;
 
 void hosts_db_init(void);
 void hosts_db_reduce(void);
@@ -74,10 +65,14 @@ void hosts_db_free(void);
 int hosts_db_import(const int fd);
 int hosts_db_export(const int fd);
 
-struct bucket *host_find(const struct addr46 *const ip); /* can return NULL */
-struct bucket *host_get(const struct addr46 *const ip);
+struct bucket *host_find(const struct addr *const a); /* can return NULL */
+struct bucket *host_get(const struct addr *const a);
 struct bucket *host_get_port_tcp(struct bucket *host, const uint16_t port);
+struct bucket *host_get_port_tcp_remote(struct bucket *host,
+                                        const uint16_t port);
 struct bucket *host_get_port_udp(struct bucket *host, const uint16_t port);
+struct bucket *host_get_port_udp_remote(struct bucket *host,
+                                        const uint16_t port);
 struct bucket *host_get_ip_proto(struct bucket *host, const uint8_t proto);
 
 /* Web pages. */
@@ -87,5 +82,5 @@ struct str *html_hosts(const char *uri, const char *query);
 void qsort_buckets(const struct bucket **a, size_t n,
    size_t left, size_t right, const enum sort_dir d);
 
-#endif /* !__HOSTS_DB_H */
+#endif /* __DARKSTAT_HOSTS_DB_H */
 /* vim:set ts=3 sw=3 tw=78 expandtab: */