Loading include/client/hooks.hpp +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ int hook_fchmod(unsigned int dirfd, mode_t mode); int hook_chdir(const char* path); int hook_fchdir(unsigned int fd); int hook_getcwd(char * buf, unsigned long size); int hook_readlinkat(int dirfd, const char * cpath, char * buf, int bufsiz); int hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg); Loading src/client/hooks.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -449,6 +449,32 @@ int hook_getcwd(char * buf, unsigned long size) { return (CTX->cwd().size() + 1); } int hook_readlinkat(int dirfd, const char * cpath, char * buf, int bufsiz) { CTX->log()->trace("{}() called with path '{}' dirfd {}, bufsize {}", __func__, cpath, dirfd, bufsiz); std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false); switch(rstatus) { case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_readlinkat, dirfd, cpath, buf, bufsiz); case RelativizeStatus::external: return syscall_no_intercept(SYS_readlinkat, dirfd, resolved.c_str(), buf, bufsiz); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: CTX->log()->warn("{}() not supported", __func__); return -ENOTSUP; default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } } int hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) { CTX->log()->trace("{}() called with fd {}, cmd {}, arg {}", __func__, fd, cmd, arg); if (!CTX->file_map()->exist(fd)) { Loading src/client/intercept.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -217,6 +217,20 @@ static inline int hook(long syscall_number, static_cast<unsigned long>(arg1)); break; case SYS_readlink: *result = hook_readlinkat(AT_FDCWD, reinterpret_cast<const char *>(arg0), reinterpret_cast<char *>(arg1), static_cast<int>(arg2)); break; case SYS_readlinkat: *result = hook_readlinkat(static_cast<int>(arg0), reinterpret_cast<const char *>(arg1), reinterpret_cast<char *>(arg2), static_cast<int>(arg3)); break; case SYS_fcntl: *result = hook_fcntl(static_cast<unsigned int>(arg0), static_cast<unsigned int>(arg1), Loading Loading
include/client/hooks.hpp +1 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ int hook_fchmod(unsigned int dirfd, mode_t mode); int hook_chdir(const char* path); int hook_fchdir(unsigned int fd); int hook_getcwd(char * buf, unsigned long size); int hook_readlinkat(int dirfd, const char * cpath, char * buf, int bufsiz); int hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg); Loading
src/client/hooks.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -449,6 +449,32 @@ int hook_getcwd(char * buf, unsigned long size) { return (CTX->cwd().size() + 1); } int hook_readlinkat(int dirfd, const char * cpath, char * buf, int bufsiz) { CTX->log()->trace("{}() called with path '{}' dirfd {}, bufsize {}", __func__, cpath, dirfd, bufsiz); std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false); switch(rstatus) { case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_readlinkat, dirfd, cpath, buf, bufsiz); case RelativizeStatus::external: return syscall_no_intercept(SYS_readlinkat, dirfd, resolved.c_str(), buf, bufsiz); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: CTX->log()->warn("{}() not supported", __func__); return -ENOTSUP; default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } } int hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) { CTX->log()->trace("{}() called with fd {}, cmd {}, arg {}", __func__, fd, cmd, arg); if (!CTX->file_map()->exist(fd)) { Loading
src/client/intercept.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -217,6 +217,20 @@ static inline int hook(long syscall_number, static_cast<unsigned long>(arg1)); break; case SYS_readlink: *result = hook_readlinkat(AT_FDCWD, reinterpret_cast<const char *>(arg0), reinterpret_cast<char *>(arg1), static_cast<int>(arg2)); break; case SYS_readlinkat: *result = hook_readlinkat(static_cast<int>(arg0), reinterpret_cast<const char *>(arg1), reinterpret_cast<char *>(arg2), static_cast<int>(arg3)); break; case SYS_fcntl: *result = hook_fcntl(static_cast<unsigned int>(arg0), static_cast<unsigned int>(arg1), Loading