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

  1. extern int close(int fd);
  2. int (*orig_close)(int fd) = 0;
  3. int close(int fd)
  4. {
  5. int old_errno=errno;
  6. int rc;
  7. if (!orig_close) orig_close = get_dl_symbol("close");
  8. # if DEBUG == 1
  9. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original close(%d) at %p (wrapper is at %p).\n",
  10. getpid(), fd, orig_close, close);
  11. # endif
  12. errno=old_errno;
  13. rc = orig_close(fd);
  14. old_errno=errno;
  15. # if FD_TRACKER == 1
  16. if (rc == 0 || errno == EBADF)
  17. {
  18. struct pid_reg *pidreg = *find_pid(getpid());
  19. if (pidreg)
  20. {
  21. struct fd_reg *fdreg = *find_fd(pidreg, fd);
  22. if (fdreg)
  23. {
  24. handle_file_access_after("close", fdreg->filename, &fdreg->status);
  25. deregister_fd(fd);
  26. }
  27. }
  28. }
  29. # endif
  30. errno=old_errno;
  31. return rc;
  32. }
  33. extern int fclose(FILE* f);
  34. int (*orig_fclose)(FILE* f) = 0;
  35. int fclose(FILE* f)
  36. {
  37. int old_errno=errno;
  38. int rc;
  39. int fd=fileno(f);
  40. if (!orig_fclose) orig_fclose = get_dl_symbol("fclose");
  41. # if DEBUG == 1
  42. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original fclose(%d) at %p (wrapper is at %p).\n",
  43. getpid(), fd, orig_fclose, fclose);
  44. # endif
  45. errno=old_errno;
  46. rc = orig_fclose(f);
  47. old_errno=errno;
  48. # if FD_TRACKER == 1
  49. if (rc == 0)
  50. {
  51. struct pid_reg *pidreg = *find_pid(getpid());
  52. if (pidreg)
  53. {
  54. struct fd_reg *fdreg = *find_fd(pidreg, fd);
  55. if (fdreg)
  56. {
  57. handle_file_access_after("fclose", fdreg->filename, &fdreg->status);
  58. deregister_fd(fd);
  59. }
  60. }
  61. }
  62. # endif
  63. errno=old_errno;
  64. return rc;
  65. }
  66. /*
  67. extern int fcloseall();
  68. int (*orig_fcloseall)() = 0;
  69. int fcloseall()
  70. {
  71. int old_errno=errno;
  72. int rc;
  73. if (!orig_fcloseall) orig_fcloseall = get_dl_symbol("fcloseall");
  74. # if DEBUG == 1
  75. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original fcloseall() at %p (wrapper is at %p).\n",
  76. getpid(), orig_fcloseall, fcloseall);
  77. # endif
  78. errno=old_errno;
  79. rc = orig_fcloseall();
  80. return rc;
  81. }
  82. */
  83. extern int fork();
  84. int (*orig_fork)() = 0;
  85. int fork()
  86. {
  87. int old_errno = errno;
  88. int rc;
  89. # if FD_TRACKER == 1
  90. int caller_pid = getpid();
  91. # endif
  92. if (!orig_fork) orig_fork = get_dl_symbol("fork");
  93. # if DEBUG == 1
  94. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original fork() at %p (wrapper is at %p).\n",
  95. getpid(), orig_fork, fork);
  96. # endif
  97. errno = old_errno;
  98. rc = orig_fork();
  99. old_errno = errno;
  100. # if FD_TRACKER == 1
  101. if ( rc == 0) copy_fds(caller_pid, getpid());
  102. # endif
  103. # if DEBUG == 1
  104. struct pid_reg *pid = pid_head;
  105. while (pid)
  106. {
  107. struct fd_reg *fd = pid->fd_head;
  108. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: fork: found PID %d.\n",
  109. getpid(), pid->id);
  110. while (fd)
  111. {
  112. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: fork: found fd %d (%s).\n",
  113. getpid(), fd->fd, fd->filename);
  114. fd = fd->next;
  115. }
  116. pid = pid->next;
  117. }
  118. # endif
  119. errno=old_errno;
  120. return rc;
  121. }
  122. extern void exit(int status) __attribute__ ((noreturn));
  123. void (*orig_exit)(int status) = 0;
  124. void exit(int status)
  125. {
  126. int old_errno = errno;
  127. if (!orig_exit) orig_exit = get_dl_symbol("exit");
  128. # if DEBUG == 1
  129. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original exit(%d) at %p (wrapper is at %p).\n",
  130. getpid(), status, orig_exit, exit);
  131. # endif
  132. # if FD_TRACKER == 1
  133. struct pid_reg *pid = *find_pid(getpid());
  134. if (pid)
  135. {
  136. struct fd_reg **fd_iter = &pid->fd_head;
  137. while (*fd_iter)
  138. {
  139. handle_file_access_after("exit", (*fd_iter)->filename, &(*fd_iter)->status);
  140. deregister_fd((*fd_iter)->fd);
  141. }
  142. }
  143. # endif
  144. errno=old_errno;
  145. orig_exit(status);
  146. }
  147. extern void _exit(int status) __attribute__ ((noreturn));
  148. void (*orig__exit)(int status) = 0;
  149. void _exit(int status)
  150. {
  151. int old_errno = errno;
  152. if (!orig__exit) orig__exit = get_dl_symbol("_exit");
  153. # if DEBUG == 1
  154. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original _exit(%d) at %p (wrapper is at %p).\n",
  155. getpid(), status, orig__exit, _exit);
  156. # endif
  157. # if FD_TRACKER == 1
  158. struct pid_reg *pid = *find_pid(getpid());
  159. if (pid)
  160. {
  161. struct fd_reg **fd_iter = &pid->fd_head;
  162. while (*fd_iter)
  163. {
  164. handle_file_access_after("_exit", (*fd_iter)->filename, &(*fd_iter)->status);
  165. deregister_fd((*fd_iter)->fd);
  166. }
  167. }
  168. # endif
  169. errno=old_errno;
  170. orig__exit(status);
  171. }
  172. extern void _Exit(int status) __attribute__ ((noreturn));
  173. void (*orig__Exit)(int status) = 0;
  174. void _Exit(int status)
  175. {
  176. int old_errno = errno;
  177. if (!orig__Exit) orig__Exit = get_dl_symbol("_Exit");
  178. # if DEBUG == 1
  179. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original _Exit(%d) at %p (wrapper is at %p).\n",
  180. getpid(), status, orig__Exit, _Exit);
  181. # endif
  182. # if FD_TRACKER == 1
  183. struct pid_reg *pid = *find_pid(getpid());
  184. if (pid)
  185. {
  186. struct fd_reg **fd_iter = &pid->fd_head;
  187. while (*fd_iter)
  188. {
  189. handle_file_access_after("_Exit", (*fd_iter)->filename, &(*fd_iter)->status);
  190. deregister_fd((*fd_iter)->fd);
  191. }
  192. }
  193. # endif
  194. errno=old_errno;
  195. orig__Exit(status);
  196. }