diff options
Diffstat (limited to 'libbb')
| -rw-r--r-- | libbb/udp_io.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/libbb/udp_io.c b/libbb/udp_io.c index e968ecb66..bde4d779f 100644 --- a/libbb/udp_io.c +++ b/libbb/udp_io.c | |||
| @@ -36,11 +36,12 @@ send_to_from(int fd, void *buf, size_t len, int flags, | |||
| 36 | #else | 36 | #else |
| 37 | struct iovec iov[1]; | 37 | struct iovec iov[1]; |
| 38 | struct msghdr msg; | 38 | struct msghdr msg; |
| 39 | char cbuf[sizeof(struct in_pktinfo) | 39 | union { |
| 40 | char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; | ||
| 40 | #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO) | 41 | #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO) |
| 41 | | sizeof(struct in6_pktinfo) /* (a|b) is poor man's max(a,b) */ | 42 | char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; |
| 42 | #endif | 43 | #endif |
| 43 | ]; | 44 | } u; |
| 44 | struct cmsghdr* cmsgptr; | 45 | struct cmsghdr* cmsgptr; |
| 45 | 46 | ||
| 46 | if (from->sa_family != AF_INET | 47 | if (from->sa_family != AF_INET |
| @@ -57,15 +58,15 @@ send_to_from(int fd, void *buf, size_t len, int flags, | |||
| 57 | iov[0].iov_base = buf; | 58 | iov[0].iov_base = buf; |
| 58 | iov[0].iov_len = len; | 59 | iov[0].iov_len = len; |
| 59 | 60 | ||
| 60 | memset(cbuf, 0, sizeof(cbuf)); | 61 | memset(&u, 0, sizeof(u)); |
| 61 | 62 | ||
| 62 | memset(&msg, 0, sizeof(msg)); | 63 | memset(&msg, 0, sizeof(msg)); |
| 63 | msg.msg_name = (void *)(struct sockaddr *)to; /* or compiler will annoy us */ | 64 | msg.msg_name = (void *)(struct sockaddr *)to; /* or compiler will annoy us */ |
| 64 | msg.msg_namelen = tolen; | 65 | msg.msg_namelen = tolen; |
| 65 | msg.msg_iov = iov; | 66 | msg.msg_iov = iov; |
| 66 | msg.msg_iovlen = 1; | 67 | msg.msg_iovlen = 1; |
| 67 | msg.msg_control = cbuf; | 68 | msg.msg_control = &u; |
| 68 | msg.msg_controllen = sizeof(cbuf); | 69 | msg.msg_controllen = sizeof(u); |
| 69 | msg.msg_flags = flags; | 70 | msg.msg_flags = flags; |
| 70 | 71 | ||
| 71 | cmsgptr = CMSG_FIRSTHDR(&msg); | 72 | cmsgptr = CMSG_FIRSTHDR(&msg); |
| @@ -89,6 +90,8 @@ send_to_from(int fd, void *buf, size_t len, int flags, | |||
| 89 | pktptr->ipi6_addr = ((struct sockaddr_in6*)from)->sin6_addr; | 90 | pktptr->ipi6_addr = ((struct sockaddr_in6*)from)->sin6_addr; |
| 90 | } | 91 | } |
| 91 | #endif | 92 | #endif |
| 93 | msg.msg_controllen = cmsgptr->cmsg_len; | ||
| 94 | |||
| 92 | return sendmsg(fd, &msg, flags); | 95 | return sendmsg(fd, &msg, flags); |
| 93 | #endif | 96 | #endif |
| 94 | } | 97 | } |
| @@ -109,7 +112,9 @@ recv_from_to(int fd, void *buf, size_t len, int flags, | |||
| 109 | struct iovec iov[1]; | 112 | struct iovec iov[1]; |
| 110 | union { | 113 | union { |
| 111 | char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; | 114 | char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))]; |
| 115 | #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO) | ||
| 112 | char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; | 116 | char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; |
| 117 | #endif | ||
| 113 | } u; | 118 | } u; |
| 114 | struct cmsghdr *cmsgptr; | 119 | struct cmsghdr *cmsgptr; |
| 115 | struct msghdr msg; | 120 | struct msghdr msg; |
