Loading include/client/hooks.hpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -21,7 +21,8 @@ int hook_openat(int dirfd, const char *cpath, int flags, mode_t mode); int hook_close(int fd); int hook_close(int fd); int hook_stat(const char* path, struct stat* buf); int hook_stat(const char* path, struct stat* buf); int hook_lstat(const char* path, struct stat* buf); int hook_lstat(const char* path, struct stat* buf); int hook_fstat(unsigned int, struct stat* buf); int hook_fstat(unsigned int fd, struct stat* buf); int hook_fstatat(int dirfd, const char * cpath, struct stat * buf, int flags); int hook_read(unsigned int fd, void* buf, size_t count); int hook_read(unsigned int fd, void* buf, size_t count); int hook_pread(unsigned int fd, char * buf, size_t count, loff_t pos); int hook_pread(unsigned int fd, char * buf, size_t count, loff_t pos); int hook_write(unsigned int fd, const char * buf, size_t count); int hook_write(unsigned int fd, const char * buf, size_t count); Loading src/client/hooks.cpp +29 −0 Original line number Original line Diff line number Diff line Loading @@ -91,6 +91,35 @@ int hook_fstat(unsigned int fd, struct stat* buf) { return syscall_no_intercept(SYS_fstat, fd, buf); return syscall_no_intercept(SYS_fstat, fd, buf); } } int hook_fstatat(int dirfd, const char * cpath, struct stat * buf, int flags) { CTX->log()->trace("{}() called with path '{}' and fd {}", __func__, cpath, dirfd); if(flags & AT_EMPTY_PATH) { CTX->log()->error("{}() AT_EMPTY_PATH flag not supported", __func__); return -ENOTSUP; } std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_newfstatat, dirfd, cpath, buf, flags); case RelativizeStatus::external: return syscall_no_intercept(SYS_newfstatat, dirfd, resolved.c_str(), buf, flags); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: return with_errno(adafs_stat(resolved, buf)); default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } } int hook_read(unsigned int fd, void* buf, size_t count) { int hook_read(unsigned int fd, void* buf, size_t count) { CTX->log()->trace("{}() called with fd {}, count {}", __func__, fd, count); CTX->log()->trace("{}() called with fd {}, count {}", __func__, fd, count); if (CTX->file_map()->exist(fd)) { if (CTX->file_map()->exist(fd)) { Loading src/client/intercept.cpp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -69,6 +69,13 @@ static inline int hook(long syscall_number, reinterpret_cast<struct stat*>(arg1)); reinterpret_cast<struct stat*>(arg1)); break; break; case SYS_newfstatat: *result = hook_fstatat(static_cast<int>(arg0), reinterpret_cast<const char*>(arg1), reinterpret_cast<struct stat *>(arg2), static_cast<int>(arg3)); break; case SYS_read: case SYS_read: *result = hook_read(static_cast<unsigned int>(arg0), *result = hook_read(static_cast<unsigned int>(arg0), reinterpret_cast<void*>(arg1), reinterpret_cast<void*>(arg1), Loading Loading
include/client/hooks.hpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -21,7 +21,8 @@ int hook_openat(int dirfd, const char *cpath, int flags, mode_t mode); int hook_close(int fd); int hook_close(int fd); int hook_stat(const char* path, struct stat* buf); int hook_stat(const char* path, struct stat* buf); int hook_lstat(const char* path, struct stat* buf); int hook_lstat(const char* path, struct stat* buf); int hook_fstat(unsigned int, struct stat* buf); int hook_fstat(unsigned int fd, struct stat* buf); int hook_fstatat(int dirfd, const char * cpath, struct stat * buf, int flags); int hook_read(unsigned int fd, void* buf, size_t count); int hook_read(unsigned int fd, void* buf, size_t count); int hook_pread(unsigned int fd, char * buf, size_t count, loff_t pos); int hook_pread(unsigned int fd, char * buf, size_t count, loff_t pos); int hook_write(unsigned int fd, const char * buf, size_t count); int hook_write(unsigned int fd, const char * buf, size_t count); Loading
src/client/hooks.cpp +29 −0 Original line number Original line Diff line number Diff line Loading @@ -91,6 +91,35 @@ int hook_fstat(unsigned int fd, struct stat* buf) { return syscall_no_intercept(SYS_fstat, fd, buf); return syscall_no_intercept(SYS_fstat, fd, buf); } } int hook_fstatat(int dirfd, const char * cpath, struct stat * buf, int flags) { CTX->log()->trace("{}() called with path '{}' and fd {}", __func__, cpath, dirfd); if(flags & AT_EMPTY_PATH) { CTX->log()->error("{}() AT_EMPTY_PATH flag not supported", __func__); return -ENOTSUP; } std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_newfstatat, dirfd, cpath, buf, flags); case RelativizeStatus::external: return syscall_no_intercept(SYS_newfstatat, dirfd, resolved.c_str(), buf, flags); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: return with_errno(adafs_stat(resolved, buf)); default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } } int hook_read(unsigned int fd, void* buf, size_t count) { int hook_read(unsigned int fd, void* buf, size_t count) { CTX->log()->trace("{}() called with fd {}, count {}", __func__, fd, count); CTX->log()->trace("{}() called with fd {}, count {}", __func__, fd, count); if (CTX->file_map()->exist(fd)) { if (CTX->file_map()->exist(fd)) { Loading
src/client/intercept.cpp +7 −0 Original line number Original line Diff line number Diff line Loading @@ -69,6 +69,13 @@ static inline int hook(long syscall_number, reinterpret_cast<struct stat*>(arg1)); reinterpret_cast<struct stat*>(arg1)); break; break; case SYS_newfstatat: *result = hook_fstatat(static_cast<int>(arg0), reinterpret_cast<const char*>(arg1), reinterpret_cast<struct stat *>(arg2), static_cast<int>(arg3)); break; case SYS_read: case SYS_read: *result = hook_read(static_cast<unsigned int>(arg0), *result = hook_read(static_cast<unsigned int>(arg0), reinterpret_cast<void*>(arg1), reinterpret_cast<void*>(arg1), Loading