extern int close(int fd); int (*orig_close)(int fd) = 0; int close(int fd) { int old_errno=errno; int rc; if (!orig_close) orig_close = get_dl_symbol("close"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original close(%d) at %p (wrapper is at %p).\n", getpid(), fd, orig_close, close); # endif errno=old_errno; rc = orig_close(fd); old_errno=errno; # if FD_TRACKER == 1 if (rc == 0 || errno == EBADF) { struct pid_reg *pidreg = *find_pid(getpid()); if (pidreg) { struct fd_reg *fdreg = *find_fd(pidreg, fd); if (fdreg) { handle_file_access_after("close", fdreg->filename, &fdreg->status); deregister_fd(fd); } } } # endif errno=old_errno; return rc; } extern int fclose(FILE* f); int (*orig_fclose)(FILE* f) = 0; int fclose(FILE* f) { int old_errno=errno; int rc; int fd=fileno(f); if (!orig_fclose) orig_fclose = get_dl_symbol("fclose"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original fclose(%d) at %p (wrapper is at %p).\n", getpid(), fd, orig_fclose, fclose); # endif errno=old_errno; rc = orig_fclose(f); old_errno=errno; # if FD_TRACKER == 1 if (rc == 0) { struct pid_reg *pidreg = *find_pid(getpid()); if (pidreg) { struct fd_reg *fdreg = *find_fd(pidreg, fd); if (fdreg) { handle_file_access_after("fclose", fdreg->filename, &fdreg->status); deregister_fd(fd); } } } # endif errno=old_errno; return rc; } /* extern int fcloseall(); int (*orig_fcloseall)() = 0; int fcloseall() { int old_errno=errno; int rc; if (!orig_fcloseall) orig_fcloseall = get_dl_symbol("fcloseall"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original fcloseall() at %p (wrapper is at %p).\n", getpid(), orig_fcloseall, fcloseall); # endif errno=old_errno; rc = orig_fcloseall(); return rc; } */ extern int fork(); int (*orig_fork)() = 0; int fork() { int old_errno = errno; int rc; # if FD_TRACKER == 1 int caller_pid = getpid(); # endif if (!orig_fork) orig_fork = get_dl_symbol("fork"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original fork() at %p (wrapper is at %p).\n", getpid(), orig_fork, fork); # endif errno = old_errno; rc = orig_fork(); old_errno = errno; # if FD_TRACKER == 1 if ( rc == 0) copy_fds(caller_pid, getpid()); # endif # if DEBUG == 1 struct pid_reg *pid = pid_head; while (pid) { struct fd_reg *fd = pid->fd_head; if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: fork: found PID %d.\n", getpid(), pid->id); while (fd) { if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: fork: found fd %d (%s).\n", getpid(), fd->fd, fd->filename); fd = fd->next; } pid = pid->next; } # endif errno=old_errno; return rc; } extern void exit(int status) __attribute__ ((noreturn)); void (*orig_exit)(int status) = 0; void exit(int status) { int old_errno = errno; if (!orig_exit) orig_exit = get_dl_symbol("exit"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original exit(%d) at %p (wrapper is at %p).\n", getpid(), status, orig_exit, exit); # endif # if FD_TRACKER == 1 struct pid_reg *pid = *find_pid(getpid()); if (pid) { struct fd_reg **fd_iter = &pid->fd_head; while (*fd_iter) { handle_file_access_after("exit", (*fd_iter)->filename, &(*fd_iter)->status); deregister_fd((*fd_iter)->fd); } } # endif errno=old_errno; orig_exit(status); } extern void _exit(int status) __attribute__ ((noreturn)); void (*orig__exit)(int status) = 0; void _exit(int status) { int old_errno = errno; if (!orig__exit) orig__exit = get_dl_symbol("_exit"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original _exit(%d) at %p (wrapper is at %p).\n", getpid(), status, orig__exit, _exit); # endif # if FD_TRACKER == 1 struct pid_reg *pid = *find_pid(getpid()); if (pid) { struct fd_reg **fd_iter = &pid->fd_head; while (*fd_iter) { handle_file_access_after("_exit", (*fd_iter)->filename, &(*fd_iter)->status); deregister_fd((*fd_iter)->fd); } } # endif errno=old_errno; orig__exit(status); } extern void _Exit(int status) __attribute__ ((noreturn)); void (*orig__Exit)(int status) = 0; void _Exit(int status) { int old_errno = errno; if (!orig__Exit) orig__Exit = get_dl_symbol("_Exit"); # if DEBUG == 1 if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original _Exit(%d) at %p (wrapper is at %p).\n", getpid(), status, orig__Exit, _Exit); # endif # if FD_TRACKER == 1 struct pid_reg *pid = *find_pid(getpid()); if (pid) { struct fd_reg **fd_iter = &pid->fd_head; while (*fd_iter) { handle_file_access_after("_Exit", (*fd_iter)->filename, &(*fd_iter)->status); deregister_fd((*fd_iter)->fd); } } # endif errno=old_errno; orig__Exit(status); }