Commit 55f37b2e authored by Julius Athenstaedt's avatar Julius Athenstaedt Committed by sevenuz
Browse files

correcting syscall return types

parent 7e1c7cce
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -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);

@@ -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);

@@ -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
@@ -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
+81 −67
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#include <common/path_util.hpp>
#include <gsl/gsl>

#include <gsl/util>
#include <memory>

extern "C" {
@@ -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;
@@ -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
@@ -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

@@ -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;
@@ -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

@@ -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
@@ -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;
@@ -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,
@@ -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__,
@@ -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
@@ -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) {

@@ -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,
@@ -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__,
@@ -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,
@@ -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) {

@@ -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;
@@ -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;
@@ -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

@@ -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;
@@ -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;
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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,
@@ -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) {

@@ -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);
}


@@ -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;
@@ -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;
@@ -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
@@ -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: {}",
@@ -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) {
@@ -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
@@ -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
@@ -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
@@ -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 '{}'",