ssize_t __wrap_recv(int fd, void *buf, size_t len, int flags) { if (fd >= __pse51_rtdm_fd_start) { struct iovec iov = { buf, len }; struct msghdr msg = { NULL, 0, &iov, 1, NULL, 0 }; 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_recv(fd, buf, len, flags); }
ssize_t INTERPOSE(recv)(int fd, void *buf, size_t nbyte, int flags) { __real_recv_init(); const bool bypass_filter = getenv("SIXJACK_BYPASS") != NULL || is_socket(fd) == false; struct sockaddr_storage sa_local, *sa_local_ = &sa_local; struct sockaddr_storage sa_remote, *sa_remote_ = &sa_remote; socklen_t sa_local_len, sa_remote_len; get_sock_info(fd, &sa_local_, &sa_local_len, &sa_remote_, &sa_remote_len); int ret = 0; int ret_errno = 0; bool bypass_call = false; 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, sa_remote_, sa_remote_len, NULL, &new_nbyte, &flags) == FILTER_REPLY_BYPASS) { bypass_call = true; } if (bypass_call == false) { ssize_t ret_ = __real_recv(fd, buf, new_nbyte, flags); ret_errno = errno; ret = (int) ret_; assert((ssize_t) ret_ == ret); } if (bypass_filter == false) { rb.pre = false; filter_apply(&rb, sa_local_, sa_local_len, sa_remote_, sa_remote_len, buf, &new_nbyte, &flags); } errno = ret_errno; return ret; }