Loading include/client/hooks.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ int hook_lstat(const char* path, struct stat* buf); int hook_fstat(unsigned int, struct stat* buf); int hook_read(int fd, void* buf, size_t count); int hook_write(int fd, void* buf, size_t count); int hook_unlink(const char* path); int hook_unlinkat(int dirfd, const char * cpath, int flags); int hook_access(const char* path, int mask); int hook_lseek(unsigned int fd, off_t offset, unsigned int whence); int hook_dup(unsigned int fd); Loading src/client/hooks.cpp +31 −10 Original line number Diff line number Diff line Loading @@ -115,17 +115,38 @@ int hook_write(int fd, void* buf, size_t count) { return syscall_no_intercept(SYS_write, fd, buf, count); } int hook_unlink(const char* path) { CTX->log()->trace("{}() called with path '{}'", __func__, path); std::string rel_path; if (CTX->relativize_path(path, rel_path)) { auto ret = adafs_rm_node(rel_path); if(ret < 0) { return -errno; int hook_unlinkat(int dirfd, const char * cpath, int flags) { CTX->log()->trace("{}() called with path '{}' dirfd {}, flags {}", __func__, cpath, dirfd, flags); if ((flags & ~AT_REMOVEDIR) != 0) { CTX->log()->error("{}() Flags unknown: {}", __func__, flags); return -EINVAL; } return ret; std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false); switch(rstatus) { case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_unlinkat, dirfd, cpath, flags); case RelativizeStatus::external: return syscall_no_intercept(SYS_unlinkat, dirfd, resolved.c_str(), flags); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: if(flags & AT_REMOVEDIR) { return with_errno(adafs_rmdir(resolved)); } else { return with_errno(adafs_rm_node(resolved)); } default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } return syscall_no_intercept(SYS_unlink, rel_path.c_str()); } int hook_access(const char* path, int mask) { Loading src/client/intercept.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -82,7 +82,15 @@ static inline int hook(long syscall_number, break; case SYS_unlink: *result = hook_unlink(reinterpret_cast<char*>(arg0)); *result = hook_unlinkat(AT_FDCWD, reinterpret_cast<const char *>(arg0), 0); break; case SYS_unlinkat: *result = hook_unlinkat(static_cast<int>(arg0), reinterpret_cast<const char*>(arg1), static_cast<int>(arg2)); break; case SYS_access: Loading Loading
include/client/hooks.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ int hook_lstat(const char* path, struct stat* buf); int hook_fstat(unsigned int, struct stat* buf); int hook_read(int fd, void* buf, size_t count); int hook_write(int fd, void* buf, size_t count); int hook_unlink(const char* path); int hook_unlinkat(int dirfd, const char * cpath, int flags); int hook_access(const char* path, int mask); int hook_lseek(unsigned int fd, off_t offset, unsigned int whence); int hook_dup(unsigned int fd); Loading
src/client/hooks.cpp +31 −10 Original line number Diff line number Diff line Loading @@ -115,17 +115,38 @@ int hook_write(int fd, void* buf, size_t count) { return syscall_no_intercept(SYS_write, fd, buf, count); } int hook_unlink(const char* path) { CTX->log()->trace("{}() called with path '{}'", __func__, path); std::string rel_path; if (CTX->relativize_path(path, rel_path)) { auto ret = adafs_rm_node(rel_path); if(ret < 0) { return -errno; int hook_unlinkat(int dirfd, const char * cpath, int flags) { CTX->log()->trace("{}() called with path '{}' dirfd {}, flags {}", __func__, cpath, dirfd, flags); if ((flags & ~AT_REMOVEDIR) != 0) { CTX->log()->error("{}() Flags unknown: {}", __func__, flags); return -EINVAL; } return ret; std::string resolved; auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false); switch(rstatus) { case RelativizeStatus::fd_unknown: return syscall_no_intercept(SYS_unlinkat, dirfd, cpath, flags); case RelativizeStatus::external: return syscall_no_intercept(SYS_unlinkat, dirfd, resolved.c_str(), flags); case RelativizeStatus::fd_not_a_dir: return -ENOTDIR; case RelativizeStatus::internal: if(flags & AT_REMOVEDIR) { return with_errno(adafs_rmdir(resolved)); } else { return with_errno(adafs_rm_node(resolved)); } default: CTX->log()->error("{}() relativize status unknown: {}", __func__); return -EINVAL; } return syscall_no_intercept(SYS_unlink, rel_path.c_str()); } int hook_access(const char* path, int mask) { Loading
src/client/intercept.cpp +9 −1 Original line number Diff line number Diff line Loading @@ -82,7 +82,15 @@ static inline int hook(long syscall_number, break; case SYS_unlink: *result = hook_unlink(reinterpret_cast<char*>(arg0)); *result = hook_unlinkat(AT_FDCWD, reinterpret_cast<const char *>(arg0), 0); break; case SYS_unlinkat: *result = hook_unlinkat(static_cast<int>(arg0), reinterpret_cast<const char*>(arg1), static_cast<int>(arg2)); break; case SYS_access: Loading