Loading include/client/hooks.hpp +11 −11 Original line number Diff line number Diff line Loading @@ -94,29 +94,29 @@ hook_fstat(unsigned int fd, struct stat* buf); int hook_fstatat(int dirfd, const char* cpath, struct stat* buf, int flags); int ssize_t hook_read(unsigned int fd, void* buf, size_t count); int ssize_t hook_pread(unsigned int fd, char* buf, size_t count, loff_t pos); int hook_readv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt); int ssize_t hook_preadv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h); int ssize_t hook_write(unsigned int fd, const char* buf, size_t count); int ssize_t hook_pwrite(unsigned int fd, const char* buf, size_t count, loff_t pos); int ssize_t hook_writev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt); int ssize_t hook_pwritev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h); Loading Loading @@ -158,10 +158,10 @@ hook_dup2(unsigned int oldfd, unsigned int newfd); int hook_dup3(unsigned int oldfd, unsigned int newfd, int flags); int long hook_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count); int ssize_t hook_getdents64(unsigned int fd, struct linux_dirent64* dirp, unsigned int count); Loading @@ -183,7 +183,7 @@ hook_fchdir(unsigned int fd); int hook_getcwd(char* buf, unsigned long size); int ssize_t hook_readlinkat(int dirfd, const char* cpath, char* buf, int bufsiz); int Loading @@ -202,7 +202,7 @@ hook_fstatfs(unsigned int fd, struct statfs* buf); int hook_fsync(unsigned int fd); int ssize_t hook_getxattr(const char* path, const char* name, void* value, size_t size); int Loading src/client/hooks.cpp +81 −67 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <common/path_util.hpp> #include <gsl/gsl> #include <gsl/util> #include <memory> extern "C" { Loading Loading @@ -68,12 +69,12 @@ hook_openat(int dirfd, const char* cpath, int flags, mode_t mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_openat, dirfd, cpath, flags, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_openat, dirfd, cpath, flags, mode)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_openat, dirfd, resolved.c_str(), flags, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_openat, dirfd, resolved.c_str(), flags, mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -97,7 +98,7 @@ hook_close(int fd) { if(ret == 0) return 0; return syscall_no_intercept_wrapper(SYS_close, fd); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper(SYS_close, fd)); } #ifdef SYS_stat int Loading @@ -111,7 +112,8 @@ hook_stat(const char* path, struct stat* buf) { return with_errno(gkfs::syscall::gkfs_stat(rel_path, buf)); } return syscall_no_intercept_wrapper(SYS_stat, rel_path.c_str(), buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_stat, rel_path.c_str(), buf)); } #endif Loading @@ -129,12 +131,12 @@ hook_statx(int dirfd, const char* path, int flags, unsigned int mask, auto rstatus = CTX->relativize_fd_path(dirfd, path, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_statx, dirfd, path, flags, mask, buf); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_statx, dirfd, path, flags, mask, buf)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper( SYS_statx, dirfd, resolved.c_str(), flags, mask, buf); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_statx, dirfd, resolved.c_str(), flags, mask, buf)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -164,7 +166,8 @@ hook_lstat(const char* path, struct stat* buf) { if(CTX->relativize_path(path, rel_path)) { return with_errno(gkfs::syscall::gkfs_stat(rel_path, buf)); } return syscall_no_intercept_wrapper(SYS_lstat, rel_path.c_str(), buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_lstat, rel_path.c_str(), buf)); } #endif Loading @@ -185,7 +188,8 @@ hook_fstat(unsigned int fd, struct stat* buf) { #endif return with_errno(gkfs::syscall::gkfs_stat(path, buf)); } return syscall_no_intercept_wrapper(SYS_fstat, fd, buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fstat, fd, buf)); } int Loading @@ -198,12 +202,12 @@ hook_fstatat(int dirfd, const char* cpath, struct stat* buf, int flags) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, flags); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_newfstatat, dirfd, cpath, buf, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_newfstatat, dirfd, cpath, buf, flags)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_newfstatat, dirfd, resolved.c_str(), buf, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_newfstatat, dirfd, resolved.c_str(), buf, flags)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -217,7 +221,7 @@ hook_fstatat(int dirfd, const char* cpath, struct stat* buf, int flags) { } } int ssize_t hook_read(unsigned int fd, void* buf, size_t count) { LOG(DEBUG, "{}() called with fd: {}, buf: {} count: {}", __func__, fd, Loading @@ -229,7 +233,7 @@ hook_read(unsigned int fd, void* buf, size_t count) { return syscall_no_intercept_wrapper(SYS_read, fd, buf, count); } int ssize_t hook_pread(unsigned int fd, char* buf, size_t count, loff_t pos) { LOG(DEBUG, "{}() called with fd: {}, buf: {}, count: {}, pos: {}", __func__, Loading @@ -240,7 +244,7 @@ hook_pread(unsigned int fd, char* buf, size_t count, loff_t pos) { } /* Since kernel 2.6: pread() became pread64(), and pwrite() became * pwrite64(). */ return gsl::narrow<int>(syscall_no_intercept_wrapper(SYS_pread64, fd, buf, count, pos)); return syscall_no_intercept_wrapper(SYS_pread64, fd, buf, count, pos); } int Loading @@ -255,7 +259,7 @@ hook_readv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt) { return syscall_no_intercept_wrapper(SYS_readv, fd, iov, iovcnt); } int ssize_t hook_preadv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h) { Loading @@ -271,7 +275,7 @@ hook_preadv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, return syscall_no_intercept_wrapper(SYS_preadv, fd, iov, iovcnt, pos_l); } int ssize_t hook_write(unsigned int fd, const char* buf, size_t count) { LOG(DEBUG, "{}() called with fd: {}, buf: {}, count {}", __func__, fd, Loading @@ -283,7 +287,7 @@ hook_write(unsigned int fd, const char* buf, size_t count) { return syscall_no_intercept_wrapper(SYS_write, fd, buf, count); } int ssize_t hook_pwrite(unsigned int fd, const char* buf, size_t count, loff_t pos) { LOG(DEBUG, "{}() called with fd: {}, buf: {}, count: {}, pos: {}", __func__, Loading @@ -294,10 +298,10 @@ hook_pwrite(unsigned int fd, const char* buf, size_t count, loff_t pos) { } /* Since kernel 2.6: pread() became pread64(), and pwrite() became * pwrite64(). */ return gsl::narrow<int>(syscall_no_intercept_wrapper(SYS_pwrite64, fd, buf, count, pos)); return syscall_no_intercept_wrapper(SYS_pwrite64, fd, buf, count, pos); } int ssize_t hook_writev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt) { LOG(DEBUG, "{}() called with fd: {}, iov: {}, iovcnt: {}", __func__, fd, Loading @@ -309,7 +313,7 @@ hook_writev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt) { return syscall_no_intercept_wrapper(SYS_writev, fd, iov, iovcnt); } int ssize_t hook_pwritev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h) { Loading Loading @@ -340,12 +344,12 @@ hook_unlinkat(int dirfd, const char* cpath, int flags) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_unlinkat, dirfd, cpath, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_unlinkat, dirfd, cpath, flags)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_unlinkat, dirfd, resolved.c_str(), flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_unlinkat, dirfd, resolved.c_str(), flags)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -380,12 +384,12 @@ hook_symlinkat(const char* oldname, int newdfd, const char* newname) { CTX->relativize_fd_path(newdfd, newname, newname_resolved, false); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_symlinkat, oldname, newdfd, newname); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_symlinkat, oldname, newdfd, newname)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_symlinkat, oldname, newdfd, newname_resolved.c_str()); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_symlinkat, oldname, newdfd, newname_resolved.c_str())); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -425,7 +429,8 @@ hook_access(const char* path, int mask) { } return ret; } return syscall_no_intercept_wrapper(SYS_access, rel_path.c_str(), mask); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_access, rel_path.c_str(), mask)); } #endif Loading @@ -439,12 +444,12 @@ hook_faccessat(int dirfd, const char* cpath, int mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_faccessat, dirfd, cpath, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat, dirfd, cpath, mode)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_faccessat, dirfd, resolved.c_str(), mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat, dirfd, resolved.c_str(), mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -470,12 +475,12 @@ hook_faccessat2(int dirfd, const char* cpath, int mode, int flags) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_faccessat2, dirfd, cpath, mode, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat2, dirfd, cpath, mode, flags)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_faccessat2, dirfd, resolved.c_str(), mode, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat2, dirfd, resolved.c_str(), mode, flags)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -521,7 +526,8 @@ hook_truncate(const char* path, long length) { if(CTX->relativize_path(path, rel_path)) { return with_errno(gkfs::syscall::gkfs_truncate(rel_path, length)); } return syscall_no_intercept_wrapper(SYS_truncate, rel_path.c_str(), length); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_truncate, rel_path.c_str(), length)); } int Loading @@ -533,7 +539,8 @@ hook_ftruncate(unsigned int fd, unsigned long length) { auto path = CTX->file_map()->get(fd)->path(); return with_errno(gkfs::syscall::gkfs_truncate(path, length)); } return syscall_no_intercept_wrapper(SYS_ftruncate, fd, length); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_ftruncate, fd, length)); } int Loading @@ -544,7 +551,7 @@ hook_dup(unsigned int fd) { if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_dup(fd)); } return syscall_no_intercept_wrapper(SYS_dup, fd); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper(SYS_dup, fd)); } #ifdef SYS_dup2 int Loading @@ -555,7 +562,8 @@ hook_dup2(unsigned int oldfd, unsigned int newfd) { if(CTX->file_map()->exist(oldfd)) { return with_errno(gkfs::syscall::gkfs_dup2(oldfd, newfd)); } return syscall_no_intercept_wrapper(SYS_dup2, oldfd, newfd); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_dup2, oldfd, newfd)); } #endif int Loading @@ -570,10 +578,11 @@ hook_dup3(unsigned int oldfd, unsigned int newfd, int flags) { LOG(WARNING, "{}() Not supported", __func__); return -ENOTSUP; } return syscall_no_intercept_wrapper(SYS_dup3, oldfd, newfd, flags); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_dup3, oldfd, newfd, flags)); } #ifdef SYS_getdents int long hook_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count) { LOG(DEBUG, "{}() called with fd: {}, dirp: {}, count: {}", __func__, fd, Loading @@ -586,7 +595,7 @@ hook_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count) { } #endif int ssize_t hook_getdents64(unsigned int fd, struct linux_dirent64* dirp, unsigned int count) { Loading @@ -596,7 +605,7 @@ hook_getdents64(unsigned int fd, struct linux_dirent64* dirp, if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_getdents64(fd, dirp, count)); } return gsl::narrow<int>(syscall_no_intercept_wrapper(SYS_getdents64, fd, dirp, count)); return syscall_no_intercept_wrapper(SYS_getdents64, fd, dirp, count); } Loading @@ -610,12 +619,12 @@ hook_mkdirat(int dirfd, const char* cpath, mode_t mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_mkdirat, dirfd, resolved.c_str(), mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_mkdirat, dirfd, resolved.c_str(), mode)); case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_mkdirat, dirfd, cpath, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_mkdirat, dirfd, cpath, mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -640,12 +649,12 @@ hook_fchmodat(int dirfd, const char* cpath, mode_t mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_fchmodat, dirfd, cpath, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_fchmodat, dirfd, cpath, mode)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_fchmodat, dirfd, resolved.c_str(), mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_fchmodat, dirfd, resolved.c_str(), mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -669,7 +678,8 @@ hook_fchmod(unsigned int fd, mode_t mode) { LOG(WARNING, "{}() operation not supported", __func__); return -ENOTSUP; } return syscall_no_intercept_wrapper(SYS_fchmod, fd, mode); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fchmod, fd, mode)); } int Loading Loading @@ -760,7 +770,7 @@ hook_getcwd(char* buf, unsigned long size) { return (CTX->cwd().size() + 1); } int ssize_t hook_readlinkat(int dirfd, const char* cpath, char* buf, int bufsiz) { LOG(DEBUG, "{}() called with dirfd: {}, path \"{}\", buf: {}, bufsize: {}", Loading Loading @@ -797,7 +807,8 @@ hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) { arg); if(!CTX->file_map()->exist(fd)) { return syscall_no_intercept_wrapper(SYS_fcntl, fd, cmd, arg); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fcntl, fd, cmd, arg)); } int ret; switch(cmd) { Loading Loading @@ -928,8 +939,8 @@ hook_renameat(int olddfd, const char* oldname, int newdfd, const char* newname, return -EINVAL; } return syscall_no_intercept_wrapper(SYS_renameat2, olddfd, oldpath_pass, newdfd, newpath_pass, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_renameat2, olddfd, oldpath_pass, newdfd, newpath_pass, flags)); } int Loading @@ -942,7 +953,8 @@ hook_statfs(const char* path, struct statfs* buf) { if(CTX->relativize_path(path, rel_path)) { return with_errno(gkfs::syscall::gkfs_statfs(buf)); } return syscall_no_intercept_wrapper(SYS_statfs, rel_path.c_str(), buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_statfs, rel_path.c_str(), buf)); } int Loading @@ -953,7 +965,8 @@ hook_fstatfs(unsigned int fd, struct statfs* buf) { if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_statfs(buf)); } return syscall_no_intercept_wrapper(SYS_fstatfs, fd, buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fstatfs, fd, buf)); } /* The function should broadcast a flush message (pmem_persist i.e.) if the Loading @@ -965,10 +978,11 @@ hook_fsync(unsigned int fd) { if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_fsync(fd)); } return syscall_no_intercept_wrapper(SYS_fsync, fd); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper(SYS_fsync, fd)); } int ssize_t hook_getxattr(const char* path, const char* name, void* value, size_t size) { LOG(DEBUG, "{}() called with path '{}' name '{}' value '{}' size '{}'", Loading Loading
include/client/hooks.hpp +11 −11 Original line number Diff line number Diff line Loading @@ -94,29 +94,29 @@ hook_fstat(unsigned int fd, struct stat* buf); int hook_fstatat(int dirfd, const char* cpath, struct stat* buf, int flags); int ssize_t hook_read(unsigned int fd, void* buf, size_t count); int ssize_t hook_pread(unsigned int fd, char* buf, size_t count, loff_t pos); int hook_readv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt); int ssize_t hook_preadv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h); int ssize_t hook_write(unsigned int fd, const char* buf, size_t count); int ssize_t hook_pwrite(unsigned int fd, const char* buf, size_t count, loff_t pos); int ssize_t hook_writev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt); int ssize_t hook_pwritev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h); Loading Loading @@ -158,10 +158,10 @@ hook_dup2(unsigned int oldfd, unsigned int newfd); int hook_dup3(unsigned int oldfd, unsigned int newfd, int flags); int long hook_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count); int ssize_t hook_getdents64(unsigned int fd, struct linux_dirent64* dirp, unsigned int count); Loading @@ -183,7 +183,7 @@ hook_fchdir(unsigned int fd); int hook_getcwd(char* buf, unsigned long size); int ssize_t hook_readlinkat(int dirfd, const char* cpath, char* buf, int bufsiz); int Loading @@ -202,7 +202,7 @@ hook_fstatfs(unsigned int fd, struct statfs* buf); int hook_fsync(unsigned int fd); int ssize_t hook_getxattr(const char* path, const char* name, void* value, size_t size); int Loading
src/client/hooks.cpp +81 −67 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ #include <common/path_util.hpp> #include <gsl/gsl> #include <gsl/util> #include <memory> extern "C" { Loading Loading @@ -68,12 +69,12 @@ hook_openat(int dirfd, const char* cpath, int flags, mode_t mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_openat, dirfd, cpath, flags, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_openat, dirfd, cpath, flags, mode)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_openat, dirfd, resolved.c_str(), flags, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_openat, dirfd, resolved.c_str(), flags, mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -97,7 +98,7 @@ hook_close(int fd) { if(ret == 0) return 0; return syscall_no_intercept_wrapper(SYS_close, fd); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper(SYS_close, fd)); } #ifdef SYS_stat int Loading @@ -111,7 +112,8 @@ hook_stat(const char* path, struct stat* buf) { return with_errno(gkfs::syscall::gkfs_stat(rel_path, buf)); } return syscall_no_intercept_wrapper(SYS_stat, rel_path.c_str(), buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_stat, rel_path.c_str(), buf)); } #endif Loading @@ -129,12 +131,12 @@ hook_statx(int dirfd, const char* path, int flags, unsigned int mask, auto rstatus = CTX->relativize_fd_path(dirfd, path, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_statx, dirfd, path, flags, mask, buf); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_statx, dirfd, path, flags, mask, buf)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper( SYS_statx, dirfd, resolved.c_str(), flags, mask, buf); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_statx, dirfd, resolved.c_str(), flags, mask, buf)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -164,7 +166,8 @@ hook_lstat(const char* path, struct stat* buf) { if(CTX->relativize_path(path, rel_path)) { return with_errno(gkfs::syscall::gkfs_stat(rel_path, buf)); } return syscall_no_intercept_wrapper(SYS_lstat, rel_path.c_str(), buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_lstat, rel_path.c_str(), buf)); } #endif Loading @@ -185,7 +188,8 @@ hook_fstat(unsigned int fd, struct stat* buf) { #endif return with_errno(gkfs::syscall::gkfs_stat(path, buf)); } return syscall_no_intercept_wrapper(SYS_fstat, fd, buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fstat, fd, buf)); } int Loading @@ -198,12 +202,12 @@ hook_fstatat(int dirfd, const char* cpath, struct stat* buf, int flags) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, flags); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_newfstatat, dirfd, cpath, buf, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_newfstatat, dirfd, cpath, buf, flags)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_newfstatat, dirfd, resolved.c_str(), buf, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_newfstatat, dirfd, resolved.c_str(), buf, flags)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -217,7 +221,7 @@ hook_fstatat(int dirfd, const char* cpath, struct stat* buf, int flags) { } } int ssize_t hook_read(unsigned int fd, void* buf, size_t count) { LOG(DEBUG, "{}() called with fd: {}, buf: {} count: {}", __func__, fd, Loading @@ -229,7 +233,7 @@ hook_read(unsigned int fd, void* buf, size_t count) { return syscall_no_intercept_wrapper(SYS_read, fd, buf, count); } int ssize_t hook_pread(unsigned int fd, char* buf, size_t count, loff_t pos) { LOG(DEBUG, "{}() called with fd: {}, buf: {}, count: {}, pos: {}", __func__, Loading @@ -240,7 +244,7 @@ hook_pread(unsigned int fd, char* buf, size_t count, loff_t pos) { } /* Since kernel 2.6: pread() became pread64(), and pwrite() became * pwrite64(). */ return gsl::narrow<int>(syscall_no_intercept_wrapper(SYS_pread64, fd, buf, count, pos)); return syscall_no_intercept_wrapper(SYS_pread64, fd, buf, count, pos); } int Loading @@ -255,7 +259,7 @@ hook_readv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt) { return syscall_no_intercept_wrapper(SYS_readv, fd, iov, iovcnt); } int ssize_t hook_preadv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h) { Loading @@ -271,7 +275,7 @@ hook_preadv(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, return syscall_no_intercept_wrapper(SYS_preadv, fd, iov, iovcnt, pos_l); } int ssize_t hook_write(unsigned int fd, const char* buf, size_t count) { LOG(DEBUG, "{}() called with fd: {}, buf: {}, count {}", __func__, fd, Loading @@ -283,7 +287,7 @@ hook_write(unsigned int fd, const char* buf, size_t count) { return syscall_no_intercept_wrapper(SYS_write, fd, buf, count); } int ssize_t hook_pwrite(unsigned int fd, const char* buf, size_t count, loff_t pos) { LOG(DEBUG, "{}() called with fd: {}, buf: {}, count: {}, pos: {}", __func__, Loading @@ -294,10 +298,10 @@ hook_pwrite(unsigned int fd, const char* buf, size_t count, loff_t pos) { } /* Since kernel 2.6: pread() became pread64(), and pwrite() became * pwrite64(). */ return gsl::narrow<int>(syscall_no_intercept_wrapper(SYS_pwrite64, fd, buf, count, pos)); return syscall_no_intercept_wrapper(SYS_pwrite64, fd, buf, count, pos); } int ssize_t hook_writev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt) { LOG(DEBUG, "{}() called with fd: {}, iov: {}, iovcnt: {}", __func__, fd, Loading @@ -309,7 +313,7 @@ hook_writev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt) { return syscall_no_intercept_wrapper(SYS_writev, fd, iov, iovcnt); } int ssize_t hook_pwritev(unsigned long fd, const struct iovec* iov, unsigned long iovcnt, unsigned long pos_l, unsigned long pos_h) { Loading Loading @@ -340,12 +344,12 @@ hook_unlinkat(int dirfd, const char* cpath, int flags) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved, false); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_unlinkat, dirfd, cpath, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_unlinkat, dirfd, cpath, flags)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_unlinkat, dirfd, resolved.c_str(), flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_unlinkat, dirfd, resolved.c_str(), flags)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -380,12 +384,12 @@ hook_symlinkat(const char* oldname, int newdfd, const char* newname) { CTX->relativize_fd_path(newdfd, newname, newname_resolved, false); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_symlinkat, oldname, newdfd, newname); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_symlinkat, oldname, newdfd, newname)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_symlinkat, oldname, newdfd, newname_resolved.c_str()); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_symlinkat, oldname, newdfd, newname_resolved.c_str())); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -425,7 +429,8 @@ hook_access(const char* path, int mask) { } return ret; } return syscall_no_intercept_wrapper(SYS_access, rel_path.c_str(), mask); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_access, rel_path.c_str(), mask)); } #endif Loading @@ -439,12 +444,12 @@ hook_faccessat(int dirfd, const char* cpath, int mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_faccessat, dirfd, cpath, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat, dirfd, cpath, mode)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_faccessat, dirfd, resolved.c_str(), mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat, dirfd, resolved.c_str(), mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -470,12 +475,12 @@ hook_faccessat2(int dirfd, const char* cpath, int mode, int flags) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_faccessat2, dirfd, cpath, mode, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat2, dirfd, cpath, mode, flags)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_faccessat2, dirfd, resolved.c_str(), mode, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_faccessat2, dirfd, resolved.c_str(), mode, flags)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading Loading @@ -521,7 +526,8 @@ hook_truncate(const char* path, long length) { if(CTX->relativize_path(path, rel_path)) { return with_errno(gkfs::syscall::gkfs_truncate(rel_path, length)); } return syscall_no_intercept_wrapper(SYS_truncate, rel_path.c_str(), length); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_truncate, rel_path.c_str(), length)); } int Loading @@ -533,7 +539,8 @@ hook_ftruncate(unsigned int fd, unsigned long length) { auto path = CTX->file_map()->get(fd)->path(); return with_errno(gkfs::syscall::gkfs_truncate(path, length)); } return syscall_no_intercept_wrapper(SYS_ftruncate, fd, length); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_ftruncate, fd, length)); } int Loading @@ -544,7 +551,7 @@ hook_dup(unsigned int fd) { if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_dup(fd)); } return syscall_no_intercept_wrapper(SYS_dup, fd); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper(SYS_dup, fd)); } #ifdef SYS_dup2 int Loading @@ -555,7 +562,8 @@ hook_dup2(unsigned int oldfd, unsigned int newfd) { if(CTX->file_map()->exist(oldfd)) { return with_errno(gkfs::syscall::gkfs_dup2(oldfd, newfd)); } return syscall_no_intercept_wrapper(SYS_dup2, oldfd, newfd); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_dup2, oldfd, newfd)); } #endif int Loading @@ -570,10 +578,11 @@ hook_dup3(unsigned int oldfd, unsigned int newfd, int flags) { LOG(WARNING, "{}() Not supported", __func__); return -ENOTSUP; } return syscall_no_intercept_wrapper(SYS_dup3, oldfd, newfd, flags); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_dup3, oldfd, newfd, flags)); } #ifdef SYS_getdents int long hook_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count) { LOG(DEBUG, "{}() called with fd: {}, dirp: {}, count: {}", __func__, fd, Loading @@ -586,7 +595,7 @@ hook_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count) { } #endif int ssize_t hook_getdents64(unsigned int fd, struct linux_dirent64* dirp, unsigned int count) { Loading @@ -596,7 +605,7 @@ hook_getdents64(unsigned int fd, struct linux_dirent64* dirp, if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_getdents64(fd, dirp, count)); } return gsl::narrow<int>(syscall_no_intercept_wrapper(SYS_getdents64, fd, dirp, count)); return syscall_no_intercept_wrapper(SYS_getdents64, fd, dirp, count); } Loading @@ -610,12 +619,12 @@ hook_mkdirat(int dirfd, const char* cpath, mode_t mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_mkdirat, dirfd, resolved.c_str(), mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_mkdirat, dirfd, resolved.c_str(), mode)); case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_mkdirat, dirfd, cpath, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_mkdirat, dirfd, cpath, mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -640,12 +649,12 @@ hook_fchmodat(int dirfd, const char* cpath, mode_t mode) { auto rstatus = CTX->relativize_fd_path(dirfd, cpath, resolved); switch(rstatus) { case gkfs::preload::RelativizeStatus::fd_unknown: return syscall_no_intercept_wrapper(SYS_fchmodat, dirfd, cpath, mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_fchmodat, dirfd, cpath, mode)); case gkfs::preload::RelativizeStatus::external: return syscall_no_intercept_wrapper(SYS_fchmodat, dirfd, resolved.c_str(), mode); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_fchmodat, dirfd, resolved.c_str(), mode)); case gkfs::preload::RelativizeStatus::fd_not_a_dir: return -ENOTDIR; Loading @@ -669,7 +678,8 @@ hook_fchmod(unsigned int fd, mode_t mode) { LOG(WARNING, "{}() operation not supported", __func__); return -ENOTSUP; } return syscall_no_intercept_wrapper(SYS_fchmod, fd, mode); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fchmod, fd, mode)); } int Loading Loading @@ -760,7 +770,7 @@ hook_getcwd(char* buf, unsigned long size) { return (CTX->cwd().size() + 1); } int ssize_t hook_readlinkat(int dirfd, const char* cpath, char* buf, int bufsiz) { LOG(DEBUG, "{}() called with dirfd: {}, path \"{}\", buf: {}, bufsize: {}", Loading Loading @@ -797,7 +807,8 @@ hook_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) { arg); if(!CTX->file_map()->exist(fd)) { return syscall_no_intercept_wrapper(SYS_fcntl, fd, cmd, arg); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fcntl, fd, cmd, arg)); } int ret; switch(cmd) { Loading Loading @@ -928,8 +939,8 @@ hook_renameat(int olddfd, const char* oldname, int newdfd, const char* newname, return -EINVAL; } return syscall_no_intercept_wrapper(SYS_renameat2, olddfd, oldpath_pass, newdfd, newpath_pass, flags); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper( SYS_renameat2, olddfd, oldpath_pass, newdfd, newpath_pass, flags)); } int Loading @@ -942,7 +953,8 @@ hook_statfs(const char* path, struct statfs* buf) { if(CTX->relativize_path(path, rel_path)) { return with_errno(gkfs::syscall::gkfs_statfs(buf)); } return syscall_no_intercept_wrapper(SYS_statfs, rel_path.c_str(), buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_statfs, rel_path.c_str(), buf)); } int Loading @@ -953,7 +965,8 @@ hook_fstatfs(unsigned int fd, struct statfs* buf) { if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_statfs(buf)); } return syscall_no_intercept_wrapper(SYS_fstatfs, fd, buf); return gsl::narrow_cast<int>( syscall_no_intercept_wrapper(SYS_fstatfs, fd, buf)); } /* The function should broadcast a flush message (pmem_persist i.e.) if the Loading @@ -965,10 +978,11 @@ hook_fsync(unsigned int fd) { if(CTX->file_map()->exist(fd)) { return with_errno(gkfs::syscall::gkfs_fsync(fd)); } return syscall_no_intercept_wrapper(SYS_fsync, fd); return gsl::narrow_cast<int>(syscall_no_intercept_wrapper(SYS_fsync, fd)); } int ssize_t hook_getxattr(const char* path, const char* name, void* value, size_t size) { LOG(DEBUG, "{}() called with path '{}' name '{}' value '{}' size '{}'", Loading