Remove an unnecessary define.
[darkstat] / db.c
diff --git a/db.c b/db.c
index 6d0e129..5a82d90 100644 (file)
--- a/db.c
+++ b/db.c
@@ -1,7 +1,7 @@
 /* darkstat 3
  *
  * db.c: load and save in-memory database from/to file
- * copyright (c) 2007 Ben Stewart, Emil Mikulic.
+ * copyright (c) 2007-2011 Ben Stewart, Emil Mikulic.
  *
  * You may use, modify and redistribute this file under the terms of the
  * GNU General Public License version 2. (see COPYING.GPL)
 #define _GNU_SOURCE 1 /* for O_NOFOLLOW in Linux */
 
 #include <sys/types.h>
-
-#include "darkstat.h"
-#include "err.h"
-#include "hosts_db.h"
-#include "graph_db.h"
-#include "db.h"
-
 #include <netinet/in.h> /* for ntohs() and friends */
 #include <assert.h>
 #include <fcntl.h>
 #include <string.h>
 #include <unistd.h>
 
+#include "cdefs.h"
+#include "err.h"
+#include "hosts_db.h"
+#include "graph_db.h"
+#include "db.h"
+
 static const unsigned char export_file_header[] = {0xDA, 0x31, 0x41, 0x59};
 static const unsigned char export_tag_hosts_ver1[] = {0xDA, 'H', 'S', 0x01};
 static const unsigned char export_tag_graph_ver1[] = {0xDA, 'G', 'R', 0x01};
@@ -152,14 +151,37 @@ read32(const int fd, uint32_t *dest)
    return 1;
 }
 
-/* Read an in_addr_t from a file.  Addresses are always stored in network
+/* Read an IPv4 addr from a file.  This is for backward compatibility with
+ * host records version 1 and 2.
+ */
+int
+readaddr_ipv4(const int fd, struct addr *dest)
+{
+   dest->family = IPv4;
+   return readn(fd, &(dest->ip.v4), sizeof(dest->ip.v4));
+}
+
+/* Read a struct addr from a file.  Addresses are always stored in network
  * order, both in the file and in the host's memory (FIXME: is that right?)
  */
 int
-readaddr(const int fd, in_addr_t *dest)
+readaddr(const int fd, struct addr *dest)
 {
-   assert(sizeof(*dest) == 4);
-   return readn(fd, dest, sizeof(*dest));
+   unsigned char family;
+
+   if (!read8(fd, &family))
+      return 0;
+
+   if (family == 4) {
+      dest->family = IPv4;
+      return readn(fd, &(dest->ip.v4), sizeof(dest->ip.v4));
+   }
+   else if (family == 6) {
+      dest->family = IPv6;
+      return readn(fd, dest->ip.v6.s6_addr, sizeof(dest->ip.v6.s6_addr));
+   }
+   else
+      return 0; /* no address family I ever heard of */
 }
 
 /* Read a network order uint64_t from a file
@@ -237,14 +259,22 @@ write64(const int fd, const uint64_t i)
 }
 
 
-/* Write an in_addr_t to a file.  Addresses are always stored in network
- * order, both in the file and in the host's memory (FIXME: is that right?)
+/* Write the active address part in a struct addr to a file.
+ * Addresses are always stored in network order, both in the file and
+ * in the host's memory (FIXME: is that right?)
  */
 int
-writeaddr(const int fd, const in_addr_t addr)
+writeaddr(const int fd, const struct addr *const a)
 {
-   assert(sizeof(addr) == 4);
-   return writen(fd, &addr, sizeof(addr));
+   if (!write8(fd, a->family))
+      return 0;
+
+   if (a->family == IPv4)
+      return writen(fd, &(a->ip.v4), sizeof(a->ip.v4));
+   else {
+      assert(a->family == IPv6);
+      return writen(fd, a->ip.v6.s6_addr, sizeof(a->ip.v6.s6_addr));
+   }
 }
 
 /* ---------------------------------------------------------------------------