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",
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();
+ }
+}