chiark / gitweb /
ipv6: introduce union iaddr
[secnet.git] / util.c
diff --git a/util.c b/util.c
index fc6f6264cf433ba84211858df529b986b377b714..207abb2b7163efa62e9e7c6adbbd9a9645384988 100644 (file)
--- a/util.c
+++ b/util.c
@@ -169,6 +169,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",
@@ -296,7 +303,7 @@ void buf_append_string(struct buffer_if *buf, cstring_t s)
     len=strlen(s);
     /* fixme: if string is longer than 65535, result is a corrupted packet */
     buf_append_uint16(buf,len);
-    memcpy(buf_append(buf,len),s,len);
+    BUF_ADD_BYTES(append,buf,s,len);
 }
 
 void buffer_new(struct buffer_if *buf, int32_t len)
@@ -469,3 +476,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();
+    }
+}