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

implement fputs / fgets

parent b75e5c52
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -156,6 +156,12 @@ void
dlsym_rewind(FILE* stream);
int
dlsym_feof(FILE* stream);
//
//fgets and fputs
char*
dlsym_fgets(char* s, int size, FILE* stream);
char*
dlsym_fputs(const char* s, FILE* stream);


// Directory API
@@ -342,6 +348,37 @@ clone(int (*fn)(void*), void* stack, int flags, void* arg, ...);

/* ................................................................... */

FILE*
fopen(const char* filename, const char* mode);


size_t
fread(void* ptr, size_t size, size_t nmemb, FILE* stream);

size_t
fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);
int
fseek(FILE* stream, long int offset, int whence);
long
ftell(FILE* stream);

void
rewind(FILE* stream);
int
fclose(FILE* stream);

// feof implementation with lseek
int
feof(FILE* stream);

// fgets implementation
char*
fgets(char* str, int size, FILE* stream);

// fputs implementation
int
fputs(const char* str, FILE* stream);

#ifdef __cplusplus
}
#endif
+85 −2
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@ int (*real_fseek)(FILE*, long int, int) = NULL;
long (*real_ftell)(FILE*) = NULL;
void (*real_rewind)(FILE*) = NULL;
int (*real_feof)(FILE*) = NULL;
//fputs and fgets
int (*real_fputs)(const char*, FILE*) = NULL;
int (*real_fgets)(char*, int, FILE*) = NULL;


void
initializeGekko() {
@@ -988,6 +992,54 @@ dlsym_feof(FILE* stream){
    return ret;
}


// fgets and fputs
int
dlsym_fputs(const char* str, FILE* stream) {
    if(real_fputs == NULL) {
        real_fputs = (int (*)(const char*, FILE*)) dlsym(RTLD_NEXT, "fputs");
    }

    int ret = real_fputs(str, stream);

    return ret;
}

int
dlsym_fgets(char* str, int n, FILE* stream) {
    if(real_fgets == NULL) {
        real_fgets = (int (*)(char*, int, FILE*)) dlsym(RTLD_NEXT, "fgets");
    }

    int ret = real_fgets(str, n, stream);

    return ret;
}

int
fputs(const char* str, FILE* stream) {
    initializeGekko();
    if(CTX->file_map()->exist(fileno(stream))) {
        return gkfs::syscall::gkfs_fputs(str, stream);
    }

    int ret = dlsym_fputs(str, stream);

    return ret;
}

int
fgets(char* str, int n, FILE* stream) {
    initializeGekko();
    if(CTX->file_map()->exist(fileno(stream))) {
        return gkfs::syscall::gkfs_fgets(str, n, stream);
    }

    int ret = dlsym_fgets(str, n, stream);

    return ret;
}

/**
 * stat management
 */
@@ -2628,11 +2680,12 @@ fopen(const char* filename, const char* mode) {

size_t
fread(void* ptr, size_t size, size_t nmemb, FILE* stream) {
    debug_info("[BYPASS] >> fread.... \n");
    
    initializeGekko();
    size_t ret;
    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);
        }
@@ -2644,11 +2697,12 @@ fread(void* ptr, size_t size, size_t nmemb, FILE* stream) {

size_t
fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream) {
    debug_info("[BYPASS] >> fwrite.... \n");
    
    initializeGekko();
    size_t ret;
    if(CTX->interception_enabled()) {
        if(CTX->file_map()->exist(stream->_fileno)) {
            debug_info("[BYPASS] >> fwrite.... \n");
            return gkfs::syscall::gkfs_write(stream->_fileno, ptr,
                                             size * nmemb);
        }
@@ -2738,5 +2792,34 @@ feof(FILE* stream) {
    return ret;
}

// fgets implementation
char*
fgets(char* str, int size, FILE* stream) {
    debug_info("[BYPASS] >> fgets.... \n");
    initializeGekko();
    char* ret;
    if(CTX->interception_enabled()) {
        if(CTX->file_map()->exist(stream->_fileno)) {
            return gkfs::syscall::gkfs_fgets(str, size, stream);
        }
    }

    ret = dlsym_fgets(str, size, stream);
    return ret;
}

// fputs implementation
int
fputs(const char* str, FILE* stream) {
    debug_info("[BYPASS] >> fputs.... \n");
    initializeGekko();
    int ret;
    if(CTX->interception_enabled()) {
        if(CTX->file_map()->exist(stream->_fileno)) {
            return gkfs::syscall::gkfs_fputs(str, stream);
        }
    }

    ret = dlsym_fputs(str, stream);
    return ret;
}