about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-04-14 00:50:08 +0000
committerEric Wong <normalperson@yhbt.net>2013-04-16 01:37:27 +0000
commit4d9a4f921c1a79d2d82aae3e104cac43537b1e2d (patch)
tree25f79dbbe2b1c813c4247b875a0f837abcf79ca4
parent8c79cf794f6178b6978743af99d498ca0b449fb1 (diff)
downloadcmogstored-4d9a4f921c1a79d2d82aae3e104cac43537b1e2d.tar.gz
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.
-rw-r--r--cmogstored.h8
-rw-r--r--http_put.c5
-rw-r--r--inherit.c8
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) {