X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/100683441c5b1445a8d6c970aea6c7fa92e974e0..2b8aa340af8302c41ff3b18d10f608672590c764:/util.c?ds=sidebyside diff --git a/util.c b/util.c index 094870f..5658aa3 100644 --- a/util.c +++ b/util.c @@ -162,6 +162,20 @@ int32_t write_mpbin(MP_INT *a, uint8_t *buffer, int32_t buflen) return i; } +void setcloexec(int fd) { + int r=fcntl(fd, F_GETFD); + if (r<0) fatal_perror("fcntl(,F_GETFD) failed"); + r=fcntl(fd, F_SETFD, r|FD_CLOEXEC); + 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", @@ -289,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) @@ -462,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(); + } +}