| 1263 | } |
| 1264 | |
| 1265 | ssize_t |
| 1266 | ff_recvfrom(int s, void *buf, size_t len, int flags, |
| 1267 | struct linux_sockaddr *from, socklen_t *fromlen) |
| 1268 | { |
| 1269 | struct msghdr msg; |
| 1270 | struct iovec aiov; |
| 1271 | int rc; |
| 1272 | struct sockaddr_storage bsdaddr; |
| 1273 | |
| 1274 | if (fromlen != NULL) |
| 1275 | msg.msg_namelen = *fromlen; |
| 1276 | else |
| 1277 | msg.msg_namelen = 0; |
| 1278 | |
| 1279 | msg.msg_name = &bsdaddr; |
| 1280 | msg.msg_iov = &aiov; |
| 1281 | msg.msg_iovlen = 1; |
| 1282 | aiov.iov_base = buf; |
| 1283 | aiov.iov_len = len; |
| 1284 | msg.msg_control = 0; |
| 1285 | msg.msg_flags = flags; |
| 1286 | if ((rc = kern_recvit(curthread, s, &msg, UIO_SYSSPACE, NULL))) |
| 1287 | goto kern_fail; |
| 1288 | rc = curthread->td_retval[0]; |
| 1289 | if (fromlen != NULL) |
| 1290 | *fromlen = msg.msg_namelen; |
| 1291 | |
| 1292 | if (from && msg.msg_namelen != 0) |
| 1293 | freebsd2linux_sockaddr(from, (struct sockaddr *)&bsdaddr); |
| 1294 | |
| 1295 | return (rc); |
| 1296 | kern_fail: |
| 1297 | ff_os_errno(rc); |
| 1298 | return (-1); |
| 1299 | } |
| 1300 | |
| 1301 | /* |
| 1302 | * It is considered here that the upper 4 bytes of |
no test coverage detected