Commit e5aa1417 authored by Ramon Nou's avatar Ramon Nou
Browse files

final implementation

parent e67167f2
Loading
Loading
Loading
Loading
+33 −18
Original line number Diff line number Diff line
@@ -2265,31 +2265,46 @@ pwritev2(int fd, const struct iovec* iov, int iovcnt, off_t offset, int flags) {
// tails.

//            */

DLSYM_WRAPPER(int, aio_write, (struct aiocb * aiocbp), (aiocbp), "aio_write");
int
aio_write(struct aiocb* aiocbp) {
    initializeGekko();
    if(gkfs::preload::PreloadContext::getInstance()->interception_enabled() &&
       is_gkfs_fd(fd)) {
        auto res = gkfs::syscall::gkfs_write(
                aiocbp->aio_fildes, (const void*)aiocbp->aio_buf, aiocbp->aio_nbytes);
        /*
    if(CTX->interception_enabled() && is_gkfs_fd(aiocbp->aio_fildes)) {
        gkfs::syscall::gkfs_write(aiocbp->aio_fildes,
                                  (const void*) aiocbp->aio_buf,
                                  aiocbp->aio_nbytes);


        // TODO : SIGNALING IS WRONG*/
        // return 0;
    }

    GKFS_FALLBACK(aio_write, aiocbp)
}

DLSYM_WRAPPER(int, aio_read, (struct aiocb * aiocbp), (aiocbp), "aio_read");
int
aio_read(struct aiocb* aiocbp) {
    initializeGekko();
    if(CTX->interception_enabled() && is_gkfs_fd(aiocbp->aio_fildes)) {
        gkfs::syscall::gkfs_read(aiocbp->aio_fildes, (void*) aiocbp->aio_buf,
                                 aiocbp->aio_nbytes);


        if(aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL) {
            // send signal of completation
            sigaction(aiocbp->aio_sigevent.sigev_signo, NULL, NULL);

        } else
        if (aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD){
            aiocbp->aio_sigevent.sigev_notify_function(aiocbp->aio_sigevent.sigev_value);
        } else
        if (aiocbp->aio_sigevent.sigev_notify == SIGEV_NONE){
            kill(getpid(), aiocbp->aio_sigevent.sigev_signo);

        } else if(aiocbp->aio_sigevent.sigev_notify == SIGEV_THREAD) {
            aiocbp->aio_sigevent.sigev_notify_function(
                    aiocbp->aio_sigevent.sigev_value);
        } else if(aiocbp->aio_sigevent.sigev_notify == SIGEV_NONE) {
        }
        */

        // TODO : SIGNALING IS WRONG
       // return res;
        // return 0;
    }

    GKFS_FALLBACK(aio_write, aiocbp)
    aiocbp->aio_nbytes = 0; // TODO : NOt overwrite the buffer
    GKFS_FALLBACK(aio_read, aiocbp)
}