ssize_t _sendmsg(int fd, const struct msghdr *msg, int flags) { struct pthread *curthread = _get_curthread(); int ret; if ((ret = _FD_LOCK(fd, FD_WRITE, NULL)) == 0) { while ((ret = __sys_sendmsg(fd, msg, flags)) < 0) { if (!(_thread_fd_getflags(fd) & O_NONBLOCK) && ((errno == EWOULDBLOCK) || (errno == EAGAIN))) { curthread->data.fd.fd = fd; /* Set the timeout: */ _thread_kern_set_timeout(NULL); curthread->interrupted = 0; _thread_kern_sched_state(PS_FDW_WAIT, __FILE__, __LINE__); /* Check if the operation was interrupted: */ if (curthread->interrupted) { errno = EINTR; ret = -1; break; } } else { ret = -1; break; } } _FD_UNLOCK(fd, FD_WRITE); } return (ret); }
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned flags) { if (flags & MSG_CMSG_COMPAT) return -EINVAL; return __sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); }
COMPAT_SYSCALL_DEFINE3(sendmsg, int, fd, struct compat_msghdr __user *, msg, unsigned int, flags) { return __sys_sendmsg(fd, (struct user_msghdr __user *)msg, flags | MSG_CMSG_COMPAT); }