| | 150 | |
|---|
| | 151 | ssize_t sendmsg (int s, struct msghdr *hdr, int flags) |
|---|
| | 152 | { |
|---|
| | 153 | /* WSASendMsg would be more straightforward, and would support ancilliary |
|---|
| | 154 | * data, but it's not yet in mingw32. */ |
|---|
| | 155 | if ((hdr->msg_iovlen > 100) || (hdr->msg_controllen > 0)) |
|---|
| | 156 | { |
|---|
| | 157 | errno = EINVAL; |
|---|
| | 158 | return -1; |
|---|
| | 159 | } |
|---|
| | 160 | |
|---|
| | 161 | WSABUF buf[hdr->msg_iovlen]; |
|---|
| | 162 | for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++) |
|---|
| | 163 | buf[i].buf = hdr->msg_iov[i].iov_base, |
|---|
| | 164 | buf[i].len = hdr->msg_iov[i].iov_len; |
|---|
| | 165 | |
|---|
| | 166 | DWORD sent; |
|---|
| | 167 | if (WSASendTo (s, buf, sizeof (buf) / sizeof (buf[0]), &sent, flags, |
|---|
| | 168 | hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0) |
|---|
| | 169 | return sent; |
|---|
| | 170 | return -1; |
|---|
| | 171 | } |
|---|
| | 172 | |
|---|
| | 173 | ssize_t recvmsg (int s, struct msghdr *hdr, int flags) |
|---|
| | 174 | { |
|---|
| | 175 | /* WSARecvMsg would be more straightforward, and would support ancilliary |
|---|
| | 176 | * data, but it's not yet in mingw32. */ |
|---|
| | 177 | if (hdr->msg_iovlen > 100) |
|---|
| | 178 | { |
|---|
| | 179 | errno = EINVAL; |
|---|
| | 180 | return -1; |
|---|
| | 181 | } |
|---|
| | 182 | |
|---|
| | 183 | WSABUF buf[hdr->msg_iovlen]; |
|---|
| | 184 | for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++) |
|---|
| | 185 | buf[i].buf = hdr->msg_iov[i].iov_base, |
|---|
| | 186 | buf[i].len = hdr->msg_iov[i].iov_len; |
|---|
| | 187 | |
|---|
| | 188 | DWORD recvd; |
|---|
| | 189 | hdr->msg_controllen = 0; |
|---|
| | 190 | hdr->msg_flags = 0; |
|---|
| | 191 | |
|---|
| | 192 | if (WSARecvFrom (s, buf, sizeof (buf) / sizeof (buf[0]), &recvd, flags, |
|---|
| | 193 | hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0) |
|---|
| | 194 | return recvd; |
|---|
| | 195 | |
|---|
| | 196 | #ifdef MSG_TRUNC |
|---|
| | 197 | if (WSAGetLastError() == WSAEMSGSIZE) |
|---|
| | 198 | { |
|---|
| | 199 | hdr->msg_flags |= MSG_TRUNC; |
|---|
| | 200 | return recvd; |
|---|
| | 201 | } |
|---|
| | 202 | #else |
|---|
| | 203 | # warning Out-of-date Winsock header files! |
|---|
| | 204 | #endif |
|---|
| | 205 | return -1; |
|---|
| | 206 | } |
|---|