ssize_t INTERPOSE(recvmsg)(int fd, struct msghdr *msg, int flags) { __real_recvmsg_init(); const bool bypass_filter = getenv("SIXJACK_BYPASS") != NULL || is_socket(fd) == false; struct sockaddr_storage sa_local, *sa_local_ = &sa_local; socklen_t sa_local_len; get_sock_info(fd, &sa_local_, &sa_local_len, NULL, NULL); int ret = 0; int ret_errno = 0; bool bypass_call = false; size_t nbyte = (size_t) 0U; struct iovec * const vecs = msg->msg_iov; size_t i_vecs = 0U; while (i_vecs < (size_t) msg->msg_iovlen) { assert(SIZE_MAX - nbyte >= vecs[i_vecs].iov_len); nbyte += vecs[i_vecs].iov_len; i_vecs++; } size_t new_nbyte = nbyte; FilterReplyResultBase rb = { .pre = true, .ret = &ret, .ret_errno = &ret_errno, .fd = fd }; if (bypass_filter == false && (rb.filter = filter_get()) && filter_apply(&rb, sa_local_, sa_local_len, msg, &new_nbyte, &flags) == FILTER_REPLY_BYPASS) { bypass_call = true; } if (bypass_call == false) { ssize_t ret_ = __real_recvmsg(fd, msg, flags); ret_errno = errno; ret = (int) ret_; assert((ssize_t) ret_ == ret); } if (bypass_filter == false) { new_nbyte = ret; rb.pre = false; filter_apply(&rb, sa_local_, sa_local_len, msg, &new_nbyte, &flags); } errno = ret_errno; return ret; }
ssize_t __wrap_recvmsg(int fd, struct msghdr * msg, int flags) { if (fd >= __pse51_rtdm_fd_start) { int ret, oldtype; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); ret = set_errno(XENOMAI_SKINCALL3(__pse51_rtdm_muxid, __rtdm_recvmsg, fd - __pse51_rtdm_fd_start, msg, flags)); pthread_setcanceltype(oldtype, NULL); return ret; } else return __real_recvmsg(fd, msg, flags); }