mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

234 lines
4.8 KiB

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);
}