Verified Commit 57cabb5f authored by Tommaso Tocci's avatar Tommaso Tocci
Browse files

intercept (f)putc

parent ae5d4d4a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -22,6 +22,9 @@ extern void* libc_ferror;
extern void* libc_fileno;
extern void* libc_fflush;

extern void* libc_putc;
extern void* libc_fputc;

extern void* libc_mkdir;
extern void* libc_mkdirat;
extern void* libc_unlink;
+26 −1
Original line number Diff line number Diff line
@@ -275,7 +275,32 @@ int fflush(FILE *stream) {
        }
    }
    return (reinterpret_cast<decltype(&fflush)>(libc_fflush))(stream);
}

int putc(int c, 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()->error("{}() NOT SUPPORTED", __func__);
            errno = ENOTSUP;
            return EOF;
        }
    }
    return (reinterpret_cast<decltype(&putc)>(libc_putc))(c, stream);
}

int fputc(int c, 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()->error("{}() NOT SUPPORTED", __func__);
            errno = ENOTSUP;
            return EOF;
        }
    }
    return (reinterpret_cast<decltype(&fputc)>(libc_fputc))(c, stream);
}

/******  FILE OPS  ******/
+6 −0
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@ void* libc_ferror;
void* libc_fileno;
void* libc_fflush;

void* libc_putc;
void* libc_fputc;

void* libc_mkdir;
void* libc_mkdirat;
void* libc_unlink;
@@ -110,6 +113,9 @@ void init_passthrough_() {
    libc_fileno = dlsym(libc, "fileno");
    libc_fflush = dlsym(libc, "fflush");

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

    libc_mkdir = dlsym(libc, "mkdir");
    libc_mkdirat = dlsym(libc, "mkdirat");