chiark / gitweb /
ipv6: More buffers in iaddr_to_string
[secnet.git] / util.c
diff --git a/util.c b/util.c
index 94f9e35679acf34c7d500fade5e25919087cd9cc..5658aa3ca62c0efe9dce7b048bb08dade1e5906d 100644 (file)
--- a/util.c
+++ b/util.c
@@ -476,3 +476,43 @@ extern void slilog_part(struct log_if *lf, int priority, const char *message, ..
     vslilog_part(lf,priority,message,ap);
     va_end(ap);
 }
+
+#define IADDR_NBUFS_SHIFT 3
+#define IADDR_NBUFS (1 << IADDR_NBUFS_SHIFT)
+
+const char *iaddr_to_string(const union iaddr *ia)
+{
+    static char bufs[IADDR_NBUFS][100];
+    static int b;
+
+    b++;
+    b &= IADDR_NBUFS-1;
+
+    assert(ia->sa.sa_family == AF_INET);
+
+    snprintf(bufs[b], sizeof(bufs[b]), "[%s]:%d",
+            inet_ntoa(ia->sin.sin_addr),
+            ntohs(ia->sin.sin_port));
+    return bufs[b];
+}
+
+bool_t iaddr_equal(const union iaddr *ia, const union iaddr *ib)
+{
+    if (ia->sa.sa_family != ib->sa.sa_family)
+       return 0;
+    switch (ia->sa.sa_family) {
+    case AF_INET:
+       return ia->sin.sin_addr.s_addr == ib->sin.sin_addr.s_addr
+           && ia->sin.sin_port        == ib->sin.sin_port;
+    default:
+       abort();
+    }
+}
+
+int iaddr_socklen(const union iaddr *ia)
+{
+    switch (ia->sa.sa_family) {
+    case AF_INET:  return sizeof(ia->sin);
+    default:       abort();
+    }
+}