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.

241 lines
5.1 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 FD_TRACKER == 1
  104. # if DEBUG == 1
  105. struct pid_reg *pid = pid_head;
  106. while (pid)
  107. {
  108. struct fd_reg *fd = pid->fd_head;
  109. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: fork: found PID %d.\n",
  110. getpid(), pid->id);
  111. while (fd)
  112. {
  113. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: fork: found fd %d (%s).\n",
  114. getpid(), fd->fd, fd->filename);
  115. fd = fd->next;
  116. }
  117. pid = pid->next;
  118. }
  119. # endif
  120. # endif
  121. errno=old_errno;
  122. return rc;
  123. }
  124. extern void exit(int status) __attribute__ ((noreturn));
  125. void (*orig_exit)(int status) __attribute__ ((noreturn)) = 0;
  126. void exit(int status)
  127. {
  128. int old_errno = errno;
  129. if (!orig_exit) orig_exit = get_dl_symbol("exit");
  130. # if DEBUG == 1
  131. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original exit(%d) at %p (wrapper is at %p).\n",
  132. getpid(), status, orig_exit, exit);
  133. # endif
  134. # if FD_TRACKER == 1
  135. struct pid_reg *pid = *find_pid(getpid());
  136. if (pid)
  137. {
  138. struct fd_reg *fd_iter = pid->fd_head;
  139. while (fd_iter)
  140. {
  141. struct fd_reg *new_fd_iter=fd_iter->next;
  142. handle_file_access_after("exit", fd_iter->filename, &fd_iter->status);
  143. deregister_fd(fd_iter->fd);
  144. fd_iter=new_fd_iter;
  145. }
  146. }
  147. # endif
  148. errno=old_errno;
  149. orig_exit(status);
  150. }
  151. extern void _exit(int status) __attribute__ ((noreturn));
  152. void (*orig__exit)(int status) __attribute__ ((noreturn)) = 0;
  153. void _exit(int status)
  154. {
  155. int old_errno = errno;
  156. if (!orig__exit) orig__exit = get_dl_symbol("_exit");
  157. # if DEBUG == 1
  158. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original _exit(%d) at %p (wrapper is at %p).\n",
  159. getpid(), status, orig__exit, _exit);
  160. # endif
  161. # if FD_TRACKER == 1
  162. struct pid_reg *pid = *find_pid(getpid());
  163. if (pid)
  164. {
  165. struct fd_reg *fd_iter = pid->fd_head;
  166. while (fd_iter)
  167. {
  168. struct fd_reg *new_fd_iter=fd_iter->next;
  169. handle_file_access_after("_exit", fd_iter->filename, &fd_iter->status);
  170. deregister_fd(fd_iter->fd);
  171. fd_iter=new_fd_iter;
  172. }
  173. }
  174. # endif
  175. errno=old_errno;
  176. orig__exit(status);
  177. }
  178. extern void _Exit(int status) __attribute__ ((noreturn));
  179. void (*orig__Exit)(int status) __attribute__ ((noreturn)) = 0;
  180. void _Exit(int status)
  181. {
  182. int old_errno = errno;
  183. if (!orig__Exit) orig__Exit = get_dl_symbol("_Exit");
  184. # if DEBUG == 1
  185. if (debug) fprintf(stderr, "fl_wrapper.so debug [%d]: going to run original _Exit(%d) at %p (wrapper is at %p).\n",
  186. getpid(), status, orig__Exit, _Exit);
  187. # endif
  188. # if FD_TRACKER == 1
  189. struct pid_reg *pid = *find_pid(getpid());
  190. if (pid)
  191. {
  192. struct fd_reg *fd_iter = pid->fd_head;
  193. while (fd_iter)
  194. {
  195. struct fd_reg *new_fd_iter=fd_iter->next;
  196. handle_file_access_after("_Exit", fd_iter->filename, &fd_iter->status);
  197. deregister_fd(fd_iter->fd);
  198. fd_iter=new_fd_iter;
  199. }
  200. }
  201. # endif
  202. errno=old_errno;
  203. orig__Exit(status);
  204. }