chiark / gitweb /
ipv6: introduce union iaddr
[secnet.git] / util.c
diff --git a/util.c b/util.c
index cfa6b4ccbd5ee6008aca3dee1a99003a6046c403..f8ebf25a3e500b35a55f8d5f9ffd0a06efaddcd7 100644 (file)
--- a/util.c
+++ b/util.c
@@ -170,6 +170,13 @@ void setcloexec(int fd) {
     if (r<0) fatal_perror("fcntl(,F_SETFD,|FD_CLOEXEC) failed");
 }
 
+void pipe_cloexec(int fd[2]) {
+    int r=pipe(fd);
+    if (r) fatal_perror("pipe");
+    setcloexec(fd[0]);
+    setcloexec(fd[1]);
+}
+
 static const char *phases[NR_PHASES]={
     "PHASE_INIT",
     "PHASE_GETOPTS",
@@ -470,3 +477,39 @@ extern void slilog_part(struct log_if *lf, int priority, const char *message, ..
     vslilog_part(lf,priority,message,ap);
     va_end(ap);
 }
+
+const char *iaddr_to_string(const union iaddr *ia)
+{
+    static char bufs[2][100];
+    static int b;
+
+    b ^= 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();
+    }
+}