diff options
-rw-r--r-- | cmogstored.h | 8 | ||||
-rw-r--r-- | http_put.c | 5 | ||||
-rw-r--r-- | inherit.c | 8 |
3 files changed, 13 insertions, 8 deletions
diff --git a/cmogstored.h b/cmogstored.h index 1681e1e..25bbb62 100644 --- a/cmogstored.h +++ b/cmogstored.h @@ -558,6 +558,10 @@ _Noreturn void cmogstored_exit(void); union mog_sockaddr { struct sockaddr_in in; struct sockaddr_in6 in6; - struct sockaddr sa; - unsigned char bytes[1]; + uint8_t bytes[sizeof(struct sockaddr_in6)]; }; + +static inline struct sockaddr *mog_sockaddr_sa(union mog_sockaddr *msa) +{ + return (struct sockaddr *)msa; +} @@ -457,10 +457,11 @@ MOG_NOINLINE static void read_err_dbg(struct mog_fd *mfd, ssize_t r) socklen_t len = (socklen_t)sizeof(any); socklen_t addrlen = (socklen_t)sizeof(addrbuf); socklen_t portlen = (socklen_t)(sizeof(portbuf)); - int rc = getpeername(mfd->fd, &any.sa, &len); + int rc = getpeername(mfd->fd, mog_sockaddr_sa(&any), &len); if (rc == 0) { - rc = getnameinfo(&any.sa, len, addrbuf, addrlen, + rc = getnameinfo(mog_sockaddr_sa(&any), len, + addrbuf, addrlen, portbuf + 1, portlen - 1, NI_NUMERICHOST|NI_NUMERICSERV); if (rc == 0) { @@ -17,7 +17,7 @@ static bool listener_cmp(const void *a, const void *b) const struct listener *lb = b; return (la->len == lb->len) && - (memcmp(&la->as.sa, &lb->as.sa, lb->len) == 0); + (memcmp(&la->as, &lb->as, lb->len) == 0); } static size_t listener_hash(const void *x, size_t tablesize) @@ -42,10 +42,10 @@ static void register_listen_fd(int fd) int rc; tmp.len = (socklen_t)sizeof(tmp.as); - if (getsockname(fd, &tmp.as.sa, &tmp.len) != 0) + if (getsockname(fd, mog_sockaddr_sa(&tmp.as), &tmp.len) != 0) die_errno("getsockname(fd=%d) failed", fd); - rc = getnameinfo(&tmp.as.sa, tmp.len, + rc = getnameinfo(mog_sockaddr_sa(&tmp.as), tmp.len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), flags); if (rc != 0) die("getnameinfo failed: %s", gai_strerror(rc)); @@ -107,7 +107,7 @@ int mog_inherit_get(struct sockaddr *addr, socklen_t len) return fd; l.len = len; - memcpy(&l.as.sa, addr, len); + memcpy(mog_sockaddr_sa(&l.as), addr, len); in = hash_delete(listeners, &l); if (in) { |