Loading include/client/hooks.hpp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ int hook_dup(unsigned int fd); int hook_dup2(unsigned int oldfd, unsigned int newfd); int hook_dup3(unsigned int oldfd, unsigned int newfd, int flags); int hook_getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count); int hook_mkdirat(int dirfd, const char * cpath, mode_t mode); #endif src/client/hooks.cpp +25 −0 Original line number Diff line number Diff line Loading @@ -189,3 +189,28 @@ int hook_getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count } return syscall_no_intercept(SYS_getdents, fd, dirp, count); } int hook_mkdirat(int dirfd, const char * cpath, mode_t mode) { CTX->log()->trace("{}() called with fd: {}, path: {}, mode: {}", __func__, dirfd, cpath, mode); std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case RelativizeStatus::external: return syscall_no_intercept(SYS_mkdirat, dirfd, resolved.c_str(), mode); case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_mkdirat, dirfd, cpath, mode); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: return with_errno(adafs_mk_node(resolved, mode | S_IFDIR)); default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } } src/client/intercept.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,18 @@ static inline int hook(long syscall_number, static_cast<unsigned int>(arg2)); break; case SYS_mkdirat: *result = hook_mkdirat(static_cast<unsigned int>(arg0), reinterpret_cast<const char *>(arg1), static_cast<mode_t>(arg2)); break; case SYS_mkdir: *result = hook_mkdirat(AT_FDCWD, reinterpret_cast<const char *>(arg0), static_cast<mode_t>(arg1)); break; default: /* * Ignore any other syscalls Loading Loading
include/client/hooks.hpp +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ int hook_dup(unsigned int fd); int hook_dup2(unsigned int oldfd, unsigned int newfd); int hook_dup3(unsigned int oldfd, unsigned int newfd, int flags); int hook_getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count); int hook_mkdirat(int dirfd, const char * cpath, mode_t mode); #endif
src/client/hooks.cpp +25 −0 Original line number Diff line number Diff line Loading @@ -189,3 +189,28 @@ int hook_getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count } return syscall_no_intercept(SYS_getdents, fd, dirp, count); } int hook_mkdirat(int dirfd, const char * cpath, mode_t mode) { CTX->log()->trace("{}() called with fd: {}, path: {}, mode: {}", __func__, dirfd, cpath, mode); std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case RelativizeStatus::external: return syscall_no_intercept(SYS_mkdirat, dirfd, resolved.c_str(), mode); case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_mkdirat, dirfd, cpath, mode); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: return with_errno(adafs_mk_node(resolved, mode | S_IFDIR)); default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } }
src/client/intercept.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,18 @@ static inline int hook(long syscall_number, static_cast<unsigned int>(arg2)); break; case SYS_mkdirat: *result = hook_mkdirat(static_cast<unsigned int>(arg0), reinterpret_cast<const char *>(arg1), static_cast<mode_t>(arg2)); break; case SYS_mkdir: *result = hook_mkdirat(AT_FDCWD, reinterpret_cast<const char *>(arg0), static_cast<mode_t>(arg1)); break; default: /* * Ignore any other syscalls Loading