Changeset View
Changeset View
Standalone View
Standalone View
head/sys/compat/cloudabi/cloudabi_sock.c
Show First 20 Lines • Show All 114 Lines • ▼ Show 20 Lines | for (chdr = CMSG_FIRSTHDR(&hdr); chdr != NULL; | ||||
if (chdr->cmsg_level == SOL_SOCKET && | if (chdr->cmsg_level == SOL_SOCKET && | ||||
chdr->cmsg_type == SCM_RIGHTS) { | chdr->cmsg_type == SCM_RIGHTS) { | ||||
size_t nfds; | size_t nfds; | ||||
nfds = (chdr->cmsg_len - CMSG_LEN(0)) / | nfds = (chdr->cmsg_len - CMSG_LEN(0)) / | ||||
sizeof(int); | sizeof(int); | ||||
if (nfds > fdslen) { | if (nfds > fdslen) { | ||||
/* Unable to store file descriptors. */ | /* Unable to store file descriptors. */ | ||||
nfds = fdslen; | |||||
*rflags |= | *rflags |= | ||||
CLOUDABI_SOCK_RECV_FDS_TRUNCATED; | CLOUDABI_SOCK_RECV_FDS_TRUNCATED; | ||||
m_dispose_extcontrolm(control); | |||||
break; | |||||
} | } | ||||
error = copyout(CMSG_DATA(chdr), fds, | error = copyout(CMSG_DATA(chdr), fds, | ||||
nfds * sizeof(int)); | nfds * sizeof(int)); | ||||
if (error != 0) { | if (error != 0) | ||||
m_free(control); | break; | ||||
return (error); | |||||
} | |||||
fds += nfds; | fds += nfds; | ||||
fdslen -= nfds; | fdslen -= nfds; | ||||
*rfdslen += nfds; | *rfdslen += nfds; | ||||
} | } | ||||
} | } | ||||
if (control != NULL) { | |||||
if (error != 0) | |||||
m_dispose_extcontrolm(control); | |||||
m_free(control); | m_free(control); | ||||
} | } | ||||
return (0); | } | ||||
return (error); | |||||
} | } | ||||
int | int | ||||
cloudabi_sock_send(struct thread *td, cloudabi_fd_t fd, struct iovec *data, | cloudabi_sock_send(struct thread *td, cloudabi_fd_t fd, struct iovec *data, | ||||
size_t datalen, const cloudabi_fd_t *fds, size_t fdslen, size_t *rdatalen) | size_t datalen, const cloudabi_fd_t *fds, size_t fdslen, size_t *rdatalen) | ||||
{ | { | ||||
struct msghdr hdr = { | struct msghdr hdr = { | ||||
.msg_iov = data, | .msg_iov = data, | ||||
Show All 35 Lines |