Commit 4be9fbcb authored by Ramon Nou's avatar Ramon Nou
Browse files

fopen issue

parent 9a5bc72e
Loading
Loading
Loading
Loading
+63 −49
Original line number Diff line number Diff line
@@ -897,24 +897,24 @@ dlsym_mmap(void* addr, size_t length, int prot, int flags, int fd,
FILE*
dlsym_fopen(const char* filename, const char* mode) {
    if(real_fopen == NULL) {
        real_fopen = (FILE* (*)(const char*, const char*)) dlsym(RTLD_NEXT, "fopen");
        real_fopen = (FILE * (*) (const char*, const char*) )
                dlsym(RTLD_NEXT, "fopen");
    }

    FILE* ret = real_fopen(filename, mode);

    return ret;

}
FILE*
dlsym_fdopen(int fd, const char* mode) {
    if(real_fdopen == NULL) {
        real_fdopen = (FILE* (*)(int, const char*)) dlsym(RTLD_NEXT, "fdopen");
        real_fdopen =
                (FILE * (*) (int, const char*) ) dlsym(RTLD_NEXT, "fdopen");
    }

    FILE* ret = real_fdopen(fd, mode);

    return ret;

}

int
@@ -931,7 +931,8 @@ dlsym_fclose(FILE* stream) {
size_t
dlsym_fread(void* ptr, size_t size, size_t nmemb, FILE* stream) {
    if(real_fread == NULL) {
        real_fread = (size_t (*)(void*, size_t, size_t, FILE*)) dlsym(RTLD_NEXT, "fread");
        real_fread = (size_t(*)(void*, size_t, size_t, FILE*)) dlsym(RTLD_NEXT,
                                                                     "fread");
    }

    size_t ret = real_fread(ptr, size, nmemb, stream);
@@ -941,13 +942,13 @@ dlsym_fread(void* ptr, size_t size, size_t nmemb, FILE* stream){
size_t
dlsym_fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream) {
    if(real_fwrite == NULL) {
        real_fwrite = (size_t (*)(const void*, size_t, size_t, FILE*)) dlsym(RTLD_NEXT, "fwrite");
        real_fwrite = (size_t(*)(const void*, size_t, size_t, FILE*)) dlsym(
                RTLD_NEXT, "fwrite");
    }

    size_t ret = real_fwrite(ptr, size, nmemb, stream);

    return ret;

}

int
@@ -959,7 +960,6 @@ dlsym_fseek(FILE* stream, long int offset, int whence){
    int ret = real_fseek(stream, offset, whence);

    return ret;

}
long
dlsym_ftell(FILE* stream) {
@@ -970,7 +970,6 @@ dlsym_ftell(FILE* stream){
    long ret = real_ftell(stream);

    return ret;

}
void
dlsym_rewind(FILE* stream) {
@@ -1012,11 +1011,9 @@ dlsym_fgets(char* str, int n, FILE* stream) {
    }

    return real_fgets(str, n, stream);

}



/**
 * stat management
 */
@@ -2624,7 +2621,6 @@ fdopen(int fd, const char* mode) {
}



FILE*
fopen(const char* filename, const char* mode) {
    debug_info("[BYPASS] >> fopen.... %s \n", filename);
@@ -2639,7 +2635,24 @@ fopen(const char* filename, const char* mode) {
                return NULL;
            case gkfs::preload::RelativizeStatus::internal:
            {
                int fd = gkfs::syscall::gkfs_open(resolved, 0, O_RDONLY);
                int fd = 0;
                debug_info("[BYPASS] >> fopen GEKKO.... %s \n", filename);
                // convert mode to open mode

                int open_flags = 0;
                if(strchr(mode, 'r') != NULL) {
                    open_flags |= O_RDONLY;
                }
                if(strchr(mode, 'w') != NULL) {
                    open_flags |= O_WRONLY | O_CREAT | O_TRUNC;
                }
                if(strchr(mode, 'a') != NULL) {
                    open_flags |= O_WRONLY | O_CREAT | O_APPEND;
                }
                if(strchr(mode, '+') != NULL) {
                    open_flags |= O_RDWR | O_CREAT;
                }
                fd = gkfs::syscall::gkfs_open(resolved, 0666, open_flags);
                if(fd == -1) {
                    return NULL;
                }
@@ -2650,7 +2663,9 @@ fopen(const char* filename, const char* mode) {
                break;
        }
    }
    return dlsym_fopen(filename, mode);

    ret = dlsym_fopen(filename, mode);
    return ret;
}


@@ -2662,8 +2677,7 @@ fread(void* ptr, size_t size, size_t nmemb, FILE* stream) {
    if(CTX->interception_enabled()) {
        if(CTX->file_map()->exist(stream->_fileno)) {
            debug_info("[BYPASS] >> fread.... \n");
            return gkfs::syscall::gkfs_read(stream->_fileno, ptr,
                                            size * nmemb);
            return gkfs::syscall::gkfs_read(stream->_fileno, ptr, size * nmemb);
        }
    }