From 4d9a4f921c1a79d2d82aae3e104cac43537b1e2d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 14 Apr 2013 00:50:08 +0000 Subject: potentially make the mog_sockaddr union smaller The generic "struct sockaddr" may be padded to be the same size as "struct sockaddr_storage" (which is what we were trying to avoid in the first place by uinsg mog_sockaddr). This change makes no difference on GNU/Linux. --- cmogstored.h | 8 ++++++-- http_put.c | 5 +++-- 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; +} diff --git a/http_put.c b/http_put.c index 740ce08..f53a579 100644 --- a/http_put.c +++ b/http_put.c @@ -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) { diff --git a/inherit.c b/inherit.c index 03bc780..3ec280c 100644 --- a/inherit.c +++ b/inherit.c @@ -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) { -- cgit v1.2.3-24-ge0c7