__attribute__((always_inline)) int __wrap_read(int fd, char* buf, size_t count) { struct fake_fd* ffd; if(ffd = get_fake_fd(fd)) { size_t len = count; if((ffd->file_len - ffd->file_pos) < len) len = ffd->file_len - ffd->file_pos; memcpy(buf, &(ffd->file_chars[ffd->file_pos]), len); ffd->file_pos += len; return len; } else { return __real_read(fd, buf, count); } }
ssize_t __wrap_read(int fd, void *buf, size_t nbyte) { if (fd >= __pse51_rtdm_fd_start) { int ret, oldtype; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); ret = set_errno(XENOMAI_SKINCALL3(__pse51_rtdm_muxid, __rtdm_read, fd - __pse51_rtdm_fd_start, buf, nbyte)); pthread_setcanceltype(oldtype, NULL); return ret; } else return __real_read(fd, buf, nbyte); }
ssize_t INTERPOSE(read)(int fd, void *buf, size_t nbyte) { __real_read_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) == FILTER_REPLY_BYPASS) { bypass_call = true; } if (bypass_call == false) { ssize_t ret_ = __real_read(fd, buf, new_nbyte); 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); } errno = ret_errno; return ret; }