Create addr module.
authorEmil Mikulic <emikulic@gmail.com>
Tue, 10 May 2011 11:53:25 +0000 (21:53 +1000)
committerEmil Mikulic <emikulic@gmail.com>
Sat, 28 May 2011 10:10:52 +0000 (20:10 +1000)
Makefile.in
addr.c [new file with mode: 0644]
addr.h [new file with mode: 0644]

index b871342..736bb38 100644 (file)
@@ -26,6 +26,7 @@ mandir = @mandir@
 
 SRCS = \
 acct.c         \
+addr.c         \
 cap.c          \
 conv.c         \
 darkstat.c     \
diff --git a/addr.c b/addr.c
new file mode 100644 (file)
index 0000000..2291176
--- /dev/null
+++ b/addr.c
@@ -0,0 +1,41 @@
+/* darkstat 3
+ * copyright (c) 2011 Emil Mikulic.
+ *
+ * addr.c: compound IPv4/IPv6 address
+ *
+ * You may use, modify and redistribute this file under the terms of the
+ * GNU General Public License version 2. (see COPYING.GPL)
+ */
+
+#include "addr.h"
+
+#include <assert.h>
+#include <string.h> /* for memcmp */
+
+int addr_equal(const struct addr * const a, const struct addr * const b)
+{
+   if (a->family != b->family)
+      return 0;
+   if (a->family == IPv4)
+      return (a->ip.v4 == b->ip.v4);
+   else {
+      assert(a->family == IPv6);
+      return (memcmp(&(a->ip.v6), &(b->ip.v6), sizeof(a->ip.v6)) == 0);
+   }
+}
+
+static char _addrstrbuf[INET6_ADDRSTRLEN];
+const char *addr_to_str(const struct addr * const a)
+{
+   if (a->family == IPv4) {
+      struct in_addr in;
+      in.s_addr = a->ip.v4;
+      return (inet_ntoa(in));
+   } else {
+      assert(a->family == IPv6);
+      inet_ntop(AF_INET6, &(a->ip.v6), _addrstrbuf, sizeof(_addrstrbuf));
+      return (_addrstrbuf);
+   }
+}
+
+/* vim:set ts=3 sw=3 tw=78 et: */
diff --git a/addr.h b/addr.h
new file mode 100644 (file)
index 0000000..55c58c4
--- /dev/null
+++ b/addr.h
@@ -0,0 +1,27 @@
+/* darkstat 3
+ * copyright (c) 2011 Emil Mikulic.
+ *
+ * addr.h: compound IPv4/IPv6 address
+ * (because struct sockaddr_storage stores too much)
+ *
+ * You may use, modify and redistribute this file under the terms of the
+ * GNU General Public License version 2. (see COPYING.GPL)
+ */
+#ifndef __DARKSTAT_ADDR_H
+#define __DARKSTAT_ADDR_H
+
+#include <arpa/inet.h>
+
+struct addr {
+   union {
+      in_addr_t v4;
+      struct in6_addr v6;
+   } ip;
+   enum { IPv4 = 4, IPv6 = 6 } family;
+};
+
+int addr_equal(const struct addr * const a, const struct addr * const b);
+const char *addr_to_str(const struct addr * const a);
+
+#endif
+/* vim:set ts=3 sw=3 tw=78 et: */