sweep.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. ** sweep.c -- Sophos Anti-Virus binary RTLD wrapper
  3. */
  4. #define CONFIG_OLD "/etc/sav.conf"
  5. #define CONFIG_NEW "@l_prefix@/etc/sav/sav.conf"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdarg.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11. #include <limits.h>
  12. #if defined(PATH_MAX)
  13. #define PATH_ADJUST_MAXLEN PATH_MAX
  14. #elif defined(MAXPATHLEN)
  15. #define PATH_ADJUST_MAXLEN MAXPATHLEN
  16. #else
  17. #define PATH_ADJUST_MAXLEN 1024
  18. #endif
  19. static void path_adjust(char *buf, size_t buflen, const char *path)
  20. {
  21. size_t pathlen;
  22. /* special case first */
  23. if (path == NULL) {
  24. buf[0] = '\0';
  25. return;
  26. }
  27. /* take over path into buffer */
  28. pathlen = strlen(path);
  29. if (pathlen > buflen)
  30. pathlen = buflen;
  31. strncpy(buf, path, pathlen);
  32. buf[pathlen] = '\0';
  33. /* apply path adjustments */
  34. if (strcmp(buf, CONFIG_OLD) == 0)
  35. strcpy(buf, CONFIG_NEW);
  36. return;
  37. }
  38. #if OPENPKG_FREEBSD
  39. #include <dlfcn.h>
  40. #include <fcntl.h>
  41. int open(const char *path, int flags, ...)
  42. {
  43. static int (*func)(const char *, int, ...) = NULL;
  44. char path_adjusted[PATH_ADJUST_MAXLEN];
  45. int rv;
  46. int mode;
  47. va_list ap;
  48. /* initially resolve original open(2) function */
  49. if (func == NULL)
  50. func = dlsym(RTLD_NEXT, "open");
  51. /* adjust path */
  52. path_adjust(path_adjusted, sizeof(path_adjusted), path);
  53. /* execute original function */
  54. if (flags & O_CREAT) {
  55. va_start(ap, flags);
  56. mode = (int)va_arg(ap, int);
  57. rv = func(path_adjusted, flags, mode);
  58. va_end(ap);
  59. }
  60. else
  61. rv = func(path_adjusted, flags);
  62. /* pass-through return value */
  63. return rv;
  64. }
  65. /* ----------------------------------------------------------------- */
  66. #elif OPENPKG_LINUX
  67. #include <features.h>
  68. #define __USE_GNU
  69. #include <dlfcn.h>
  70. #undef __USE_GNU
  71. #include <fcntl.h>
  72. static int
  73. myopen(
  74. const char *func_name,
  75. int (**func_ptr)(const char *, int, ...),
  76. char *buf,
  77. size_t buflen,
  78. const char *path,
  79. int flags,
  80. va_list ap)
  81. {
  82. int rv;
  83. int mode;
  84. /* initially resolve original open(2) like function */
  85. if (*func_ptr == NULL) {
  86. if ((*func_ptr = dlsym(RTLD_NEXT, func_name)) == NULL) {
  87. fprintf(stderr, "sweep.so: unable to resolve function \"%s\"\n", func_name);
  88. abort();
  89. }
  90. }
  91. /* adjust path */
  92. path_adjust(buf, buflen, path);
  93. /* execute original function */
  94. if (flags & O_CREAT) {
  95. mode = (int)va_arg(ap, int);
  96. rv = (*func_ptr)(buf, flags, mode);
  97. }
  98. else
  99. rv = (*func_ptr)(buf, flags);
  100. /* pass-through return value */
  101. return rv;
  102. }
  103. #define genstub(name) \
  104. int name(const char *path, int flags, ...) \
  105. { \
  106. static int (*func)(const char *, int, ...) = NULL; \
  107. char path_adjusted[PATH_ADJUST_MAXLEN]; \
  108. va_list ap; \
  109. int rv; \
  110. \
  111. va_start(ap, flags); \
  112. rv = myopen(#name, &func, path_adjusted, sizeof(path_adjusted), path, flags, ap); \
  113. va_end(ap); \
  114. return rv; \
  115. }
  116. genstub(open)
  117. genstub(open64)
  118. genstub(__open)
  119. genstub(__open64)
  120. genstub(__libc_open)
  121. genstub(__libc_open64)
  122. #elif OPENPKG_SOLARIS
  123. #include <sys/types.h>
  124. #include <sys/stat.h>
  125. #include <fcntl.h>
  126. #include <dlfcn.h>
  127. int open(const char *path, int flags, ...)
  128. {
  129. static int (*func)(const char *, int, ...) = NULL;
  130. char path_adjusted[PATH_ADJUST_MAXLEN];
  131. int rv;
  132. int mode;
  133. va_list ap;
  134. /* initially resolve original open(2) function */
  135. if (func == NULL)
  136. func = dlsym(RTLD_NEXT, "open");
  137. /* adjust path */
  138. path_adjust(path_adjusted, sizeof(path_adjusted), path);
  139. /* execute original function */
  140. if (flags & O_CREAT) {
  141. va_start(ap, flags);
  142. mode = (int)va_arg(ap, int);
  143. rv = func(path_adjusted, flags, mode);
  144. va_end(ap);
  145. }
  146. else
  147. rv = func(path_adjusted, flags);
  148. /* pass-through return value */
  149. return rv;
  150. }
  151. #endif