The netlink code assumes an order for the members of struct msghdr.
This breaks recvmsg and sendmsg with musl libc on mips64. Fix this by
using designated initializers instead.

Signed-off-by: Stijn Tintel <st...@linux-ipv6.be>
---
 sysdep/linux/netlink.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
index 1ffdff0..b42e7b6 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -125,7 +125,12 @@ nl_get_reply(struct nl_sock *nl)
        {
          struct iovec iov = { nl->rx_buffer, NL_RX_SIZE };
          struct sockaddr_nl sa;
-         struct msghdr m = { (struct sockaddr *) &sa, sizeof(sa), &iov, 1, 
NULL, 0, 0 };
+         struct msghdr m = {
+           .msg_name = &sa,
+           .msg_namelen = sizeof(sa),
+           .msg_iov = &iov,
+           .msg_iovlen = 1,
+         };
          int x = recvmsg(nl->fd, &m, 0);
          if (x < 0)
            die("nl_get_reply: %m");
@@ -1231,7 +1236,12 @@ nl_async_hook(sock *sk, int size UNUSED)
 {
   struct iovec iov = { nl_async_rx_buffer, NL_RX_SIZE };
   struct sockaddr_nl sa;
-  struct msghdr m = { (struct sockaddr *) &sa, sizeof(sa), &iov, 1, NULL, 0, 0 
};
+  struct msghdr m = {
+    .msg_name = &sa,
+    .msg_namelen = sizeof(sa),
+    .msg_iov = &iov,
+    .msg_iovlen = 1,
+  };
   struct nlmsghdr *h;
   int x;
   uint len;
-- 
2.7.3

Reply via email to