musl has padding on struct msghdr fields so the designated initialiser fails with int-conversion: src/libs/zbxsysinfo/linux/net.c:115:95: error: initialization of 'int' from 'void *' makes integer from pointer without a cast [-Werror=int-conversion] 115 | struct msghdr s_msg = { (void *)&s_sa, sizeof(struct sockaddr_nl), s_io, 1, NULL, 0, 0}; this is because the assignment becomes to padding, and the resulting struct is broken diff --git a/src/libs/zbxsysinfo/linux/net.c b/src/libs/zbxsysinfo/linux/net.c index 4b0a634..1ccc2c4 100644 --- a/src/libs/zbxsysinfo/linux/net.c +++ b/src/libs/zbxsysinfo/linux/net.c @@ -112,13 +112,27 @@ static int find_tcp_port_by_state_nl(unsigned short port, int state, int *found) struct sockaddr_nl s_sa = { AF_NETLINK, 0, 0, 0 }; struct iovec s_io[1] = { { &request, sizeof(request) } }; - struct msghdr s_msg = { (void *)&s_sa, sizeof(struct sockaddr_nl), s_io, 1, NULL, 0, 0}; + struct msghdr s_msg; + s_msg.msg_name = (void *)&s_sa; + s_msg.msg_namelen = sizeof(struct sockaddr_nl); + s_msg.msg_iov = s_io; + s_msg.msg_iovlen = 1; + s_msg.msg_control = NULL; + s_msg.msg_controllen = 0; + s_msg.msg_flags = 0; char buffer[BUFSIZ] = { 0 }; struct sockaddr_nl r_sa = { AF_NETLINK, 0, 0, 0 }; struct iovec r_io[1] = { { buffer, BUFSIZ } }; - struct msghdr r_msg = { (void *)&r_sa, sizeof(struct sockaddr_nl), r_io, 1, NULL, 0, 0}; + struct msghdr r_msg; + r_msg.msg_name = (void *)&r_sa; + r_msg.msg_namelen = sizeof(struct sockaddr_nl); + r_msg.msg_iov = r_io; + r_msg.msg_iovlen = 1; + r_msg.msg_control = NULL; + r_msg.msg_controllen = 0; + r_msg.msg_flags = 0; struct nlmsghdr *r_hdr;