Verified Commit d57cc232 authored by Tommaso Tocci's avatar Tommaso Tocci
Browse files

Intercept file buffer related functions

parent 57cabb5f
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -21,6 +21,13 @@ extern void* libc_feof;
extern void* libc_ferror;
extern void* libc_fileno;
extern void* libc_fflush;
extern void* libc_fpurge;
extern void* libc___fpurge;

extern void* libc_setbuf;
extern void* libc_setbuffer;
extern void* libc_setlinebuf;
extern void* libc_setvbuf;

extern void* libc_putc;
extern void* libc_fputc;
+72 −0
Original line number Diff line number Diff line
@@ -277,6 +277,78 @@ int fflush(FILE *stream) {
    return (reinterpret_cast<decltype(&fflush)>(libc_fflush))(stream);
}

int fpurge(FILE *stream) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
        auto fd = file_to_fd(stream);
        if(CTX->file_map()->exist(fd)) {
            CTX->log()->trace("{}() called on fd {}", __func__, fd);
            return 0;
        }
    }
    return (reinterpret_cast<decltype(&fpurge)>(libc_fpurge))(stream);
}

void __fpurge(FILE *stream) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
        auto fd = file_to_fd(stream);
        if(CTX->file_map()->exist(fd)) {
            CTX->log()->trace("{}() called on fd {}", __func__, fd);
            return;
        }
    }
    return (reinterpret_cast<decltype(&__fpurge)>(libc___fpurge))(stream);
}

void setbuf(FILE *stream, char *buf) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
        auto fd = file_to_fd(stream);
        if(CTX->file_map()->exist(fd)) {
            CTX->log()->trace("{}() called on fd {}", __func__, fd);
            return;
        }
    }
    return (reinterpret_cast<decltype(&setbuf)>(libc_setbuf))(stream, buf);
}

void setbuffer(FILE *stream, char *buf, size_t size) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
        auto fd = file_to_fd(stream);
        if(CTX->file_map()->exist(fd)) {
            CTX->log()->trace("{}() called on fd {}", __func__, fd);
            return;
        }
    }
    return (reinterpret_cast<decltype(&setbuffer)>(libc_setbuffer))(stream, buf, size);
}

void setlinebuf(FILE *stream) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
        auto fd = file_to_fd(stream);
        if(CTX->file_map()->exist(fd)) {
            CTX->log()->trace("{}() called on fd {}", __func__, fd);
            return;
        }
    }
    return (reinterpret_cast<decltype(&setlinebuf)>(libc_setlinebuf))(stream);
}

int setvbuf(FILE *stream, char *buf, int mode, size_t size) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
        auto fd = file_to_fd(stream);
        if(CTX->file_map()->exist(fd)) {
            CTX->log()->trace("{}() called on fd {}", __func__, fd);
            return 0;
        }
    }
    return (reinterpret_cast<decltype(&setvbuf)>(libc_setvbuf))(stream, buf, mode, size);
}

int putc(int c, FILE *stream) {
    init_passthrough_if_needed();
    if(CTX->initialized() && (stream != nullptr)) {
+14 −0
Original line number Diff line number Diff line
@@ -25,6 +25,13 @@ void* libc_feof;
void* libc_ferror;
void* libc_fileno;
void* libc_fflush;
void* libc_fpurge;
void* libc___fpurge;

void* libc_setbuf;
void* libc_setbuffer;
void* libc_setlinebuf;
void* libc_setvbuf;

void* libc_putc;
void* libc_fputc;
@@ -112,6 +119,13 @@ void init_passthrough_() {
    libc_ferror = dlsym(libc, "ferror");
    libc_fileno = dlsym(libc, "fileno");
    libc_fflush = dlsym(libc, "fflush");
    libc_fpurge = dlsym(libc, "fpurge");
    libc___fpurge = dlsym(libc, "__fpurge");

    libc_setbuf = dlsym(libc, "setbuf");
    libc_setbuffer = dlsym(libc, "setbuffer");
    libc_setlinebuf = dlsym(libc, "setlinebuf");
    libc_setvbuf = dlsym(libc, "setvbuf");

    libc_putc = dlsym(libc, "putc");
    libc_fputc = dlsym(libc, "fputc");