interposition.h
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:10k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1997, 1998, 1999
  3.  *      Inferno Nettverk A/S, Norway.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. The above copyright notice, this list of conditions and the following
  9.  *    disclaimer must appear in all copies of the software, derivative works
  10.  *    or modified versions, and any portions thereof, aswell as in all
  11.  *    supporting documentation.
  12.  * 2. All advertising materials mentioning features or use of this software
  13.  *    must display the following acknowledgement:
  14.  *      This product includes software developed by
  15.  *      Inferno Nettverk A/S, Norway.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  20.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  21.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  23.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * Inferno Nettverk A/S requests users of this software to return to
  31.  *
  32.  *  Software Distribution Coordinator  or  sdc@inet.no
  33.  *  Inferno Nettverk A/S
  34.  *  Oslo Research Park
  35.  *  Gaustadal閑n 21
  36.  *  N-0371 Oslo
  37.  *  Norway
  38.  *
  39.  * any improvements or extensions that they make and grant Inferno Nettverk A/S
  40.  * the rights to redistribute these changes.
  41.  *
  42.  */
  43. /* $Id: interposition.h,v 1.23 1999/12/22 09:29:15 karls Exp $ */
  44. #ifdef HAVE_CONFIG_H
  45. #include "autoconf.h"
  46. #endif  /* HAVE_CONFIG_H */
  47. #ifndef LIBRARY_PATH
  48. #define LIBRARY_PATH ""
  49. #endif
  50. #if HAVE_NO_SYMBOL_UNDERSCORE
  51. #define SYMBOL_ACCEPT "accept"
  52. #define SYMBOL_BIND "bind"
  53. #define SYMBOL_BINDRESVPORT "bindresvport"
  54. #define SYMBOL_CONNECT "connect"
  55. #define SYMBOL_GETHOSTBYNAME "gethostbyname"
  56. #define SYMBOL_GETHOSTBYNAME2 "gethostbyname2"
  57. #define SYMBOL_GETPEERNAME "getpeername"
  58. #define SYMBOL_GETSOCKNAME "getsockname"
  59. #define SYMBOL_RRESVPORT "rresvport"
  60. #define SYMBOL_RECVFROM "recvfrom"
  61. #define SYMBOL_SENDTO "sendto"
  62. #define SYMBOL_READV "readv"
  63. #define SYMBOL_WRITEV "writev"
  64. #define SYMBOL_SEND "send"
  65. #define SYMBOL_RECV "recv"
  66. #define SYMBOL_RECVMSG "recvmsg"
  67. #define SYMBOL_SENDMSG "sendmsg"
  68. #define SYMBOL_WRITE "write"
  69. #define SYMBOL_READ "read"
  70. #endif /* HAVE_NO_SYMBOL_UNDERSCORE */
  71. /* XXX */
  72. #ifndef LIBRARY_LIBC
  73. #define LIBRARY_LIBC __CONCAT(LIBRARY_PATH, "libc.so")
  74. #endif
  75. #ifndef SYMBOL_ACCEPT
  76. #define SYMBOL_ACCEPT "_accept"
  77. #endif
  78. #ifndef LIBRARY_ACCEPT
  79. #define LIBRARY_ACCEPT LIBRARY_LIBC
  80. #endif
  81. #ifndef SYMBOL_BIND
  82. #define SYMBOL_BIND "_bind"
  83. #endif
  84. #ifndef LIBRARY_BIND
  85. #define LIBRARY_BIND LIBRARY_LIBC
  86. #endif
  87. #ifndef SYMBOL_CONNECT
  88. #define SYMBOL_CONNECT "_connect"
  89. #endif
  90. #ifndef LIBRARY_CONNECT
  91. #define LIBRARY_CONNECT LIBRARY_LIBC
  92. #endif
  93. #ifndef SYMBOL_BINDRESVPORT
  94. #define SYMBOL_BINDRESVPORT "_bindresvport"
  95. #endif
  96. #ifndef LIBRARY_BINDRESVPORT
  97. #define LIBRARY_BINDRESVPORT LIBRARY_LIBC
  98. #endif
  99. #ifndef SYMBOL_GETHOSTBYNAME
  100. #define SYMBOL_GETHOSTBYNAME "_gethostbyname"
  101. #endif
  102. #ifndef LIBRARY_GETHOSTBYNAME
  103. #define LIBRARY_GETHOSTBYNAME LIBRARY_LIBC
  104. #endif
  105. #ifndef SYMBOL_GETHOSTBYNAME2
  106. #define SYMBOL_GETHOSTBYNAME2 "_gethostbyname2"
  107. #endif
  108. #ifndef LIBRARY_GETHOSTBYNAME2
  109. #define LIBRARY_GETHOSTBYNAME2 LIBRARY_LIBC
  110. #endif
  111. #ifndef SYMBOL_GETPEERNAME
  112. #define SYMBOL_GETPEERNAME "_getpeername"
  113. #endif
  114. #ifndef LIBRARY_GETPEERNAME
  115. #define LIBRARY_GETPEERNAME LIBRARY_LIBC
  116. #endif
  117. #ifndef SYMBOL_GETSOCKNAME
  118. #define SYMBOL_GETSOCKNAME "_getsockname"
  119. #endif
  120. #ifndef LIBRARY_GETSOCKNAME
  121. #define LIBRARY_GETSOCKNAME LIBRARY_LIBC
  122. #endif
  123. #ifndef SYMBOL_READ
  124. #define SYMBOL_READ "_read"
  125. #endif
  126. #ifndef LIBRARY_READ
  127. #define LIBRARY_READ LIBRARY_LIBC
  128. #endif
  129. #ifndef SYMBOL_READV
  130. #define SYMBOL_READV "_readv"
  131. #endif
  132. #ifndef LIBRARY_READV
  133. #define LIBRARY_READV LIBRARY_LIBC
  134. #endif
  135. #ifndef SYMBOL_RECV
  136. #define SYMBOL_RECV "_recv"
  137. #endif
  138. #ifndef LIBRARY_RECV
  139. #define LIBRARY_RECV LIBRARY_LIBC
  140. #endif
  141. #ifndef SYMBOL_RECVMSG
  142. #define SYMBOL_RECVMSG "_recvmsg"
  143. #endif
  144. #ifndef LIBRARY_RECVMSG
  145. #define LIBRARY_RECVMSG LIBRARY_LIBC
  146. #endif
  147. #ifndef SYMBOL_RECVFROM
  148. #define SYMBOL_RECVFROM "_recvfrom"
  149. #endif
  150. #ifndef LIBRARY_RECVFROM
  151. #define LIBRARY_RECVFROM LIBRARY_LIBC
  152. #endif
  153. #ifndef SYMBOL_RRESVPORT
  154. #define SYMBOL_RRESVPORT "_rresvport"
  155. #endif
  156. #ifndef LIBRARY_RRESVPORT
  157. #define LIBRARY_RRESVPORT LIBRARY_LIBC
  158. #endif
  159. #ifndef SYMBOL_SEND
  160. #define SYMBOL_SEND "_send"
  161. #endif
  162. #ifndef LIBRARY_SEND
  163. #define LIBRARY_SEND LIBRARY_LIBC
  164. #endif
  165. #ifndef SYMBOL_SENDMSG
  166. #define SYMBOL_SENDMSG "_sendmsg"
  167. #endif
  168. #ifndef LIBRARY_SENDMSG
  169. #define LIBRARY_SENDMSG LIBRARY_LIBC
  170. #endif
  171. #ifndef SYMBOL_SENDTO
  172. #define SYMBOL_SENDTO "_sendto"
  173. #endif
  174. #ifndef LIBRARY_SENDTO
  175. #define LIBRARY_SENDTO LIBRARY_LIBC
  176. #endif
  177. #ifndef SYMBOL_WRITE
  178. #define SYMBOL_WRITE "_write"
  179. #endif
  180. #ifndef LIBRARY_WRITE
  181. #define LIBRARY_WRITE LIBRARY_LIBC
  182. #endif
  183. #ifndef SYMBOL_WRITEV
  184. #define SYMBOL_WRITEV "_writev"
  185. #endif
  186. #ifndef LIBRARY_WRITEV
  187. #define LIBRARY_WRITEV LIBRARY_LIBC
  188. #endif
  189. /* only used on osf */
  190. #if HAVE_EXTRA_OSF_SYMBOLS
  191. #ifndef SYMBOL_EACCEPT
  192. #define SYMBOL_EACCEPT "_Eaccept"
  193. #endif
  194. #ifndef LIBRARY_EACCEPT
  195. #define LIBRARY_EACCEPT LIBRARY_LIBC
  196. #endif
  197. #ifndef SYMBOL_EGETPEERNAME
  198. #define SYMBOL_EGETPEERNAME "_Egetpeername"
  199. #endif
  200. #ifndef LIBRARY_EGETPEERNAME
  201. #define LIBRARY_EGETPEERNAME LIBRARY_LIBC
  202. #endif
  203. #ifndef SYMBOL_EGETSOCKNAME
  204. #define SYMBOL_EGETSOCKNAME "_Egetsockname"
  205. #endif
  206. #ifndef LIBRARY_EGETSOCKNAME
  207. #define LIBRARY_EGETSOCKNAME LIBRARY_LIBC
  208. #endif
  209. #ifndef SYMBOL_EREADV
  210. #define SYMBOL_EREADV "_Ereadv"
  211. #endif
  212. #ifndef LIBRARY_EREADV
  213. #define LIBRARY_EREADV LIBRARY_LIBC
  214. #endif
  215. #ifndef SYMBOL_ERECVFROM
  216. #define SYMBOL_ERECVFROM "_Erecvfrom"
  217. #endif
  218. #ifndef LIBRARY_ERECVFROM
  219. #define LIBRARY_ERECVFROM LIBRARY_LIBC
  220. #endif
  221. #ifndef SYMBOL_ERECVMSG
  222. #define SYMBOL_ERECVMSG "_Erecvmsg"
  223. #endif
  224. #ifndef LIBRARY_ERECVMSG
  225. #define LIBRARY_ERECVMSG LIBRARY_LIBC
  226. #endif
  227. #ifndef SYMBOL_ESENDMSG
  228. #define SYMBOL_ESENDMSG "_Esendmsg"
  229. #endif
  230. #ifndef LIBRARY_ESENDMSG
  231. #define LIBRARY_ESENDMSG LIBRARY_LIBC
  232. #endif
  233. #ifndef SYMBOL_EWRITEV
  234. #define SYMBOL_EWRITEV "_Ewritev"
  235. #endif
  236. #ifndef LIBRARY_EWRITEV
  237. #define LIBRARY_EWRITEV LIBRARY_LIBC
  238. #endif
  239. /* more osf functions */
  240. #ifndef SYMBOL_NACCEPT
  241. #define SYMBOL_NACCEPT "naccept"
  242. #endif
  243. #ifndef LIBRARY_NACCEPT
  244. #define LIBRARY_NACCEPT LIBRARY_LIBC
  245. #endif
  246. #ifndef SYMBOL_NGETPEERNAME
  247. #define SYMBOL_NGETPEERNAME "ngetpeername"
  248. #endif
  249. #ifndef LIBRARY_NGETPEERNAME
  250. #define LIBRARY_NGETPEERNAME LIBRARY_LIBC
  251. #endif
  252. #ifndef SYMBOL_NGETSOCKNAME
  253. #define SYMBOL_NGETSOCKNAME "ngetsockname"
  254. #endif
  255. #ifndef LIBRARY_NGETSOCKNAME
  256. #define LIBRARY_NGETSOCKNAME LIBRARY_LIBC
  257. #endif
  258. #ifndef SYMBOL_NRECVFROM
  259. #define SYMBOL_NRECVFROM "nrecvfrom"
  260. #endif
  261. #ifndef LIBRARY_NRECVFROM
  262. #define LIBRARY_NRECVFROM LIBRARY_LIBC
  263. #endif
  264. #ifndef SYMBOL_NRECVMSG
  265. #define SYMBOL_NRECVMSG "nrecvmsg"
  266. #endif
  267. #ifndef LIBRARY_NRECVMSG
  268. #define LIBRARY_NRECVMSG LIBRARY_LIBC
  269. #endif
  270. #ifndef SYMBOL_NSENDMSG
  271. #define SYMBOL_NSENDMSG "nsendmsg"
  272. #endif
  273. #ifndef LIBRARY_NSENDMSG
  274. #define LIBRARY_NSENDMSG LIBRARY_LIBC
  275. #endif
  276. #endif  /* HAVE_EXTRA_OSF_SYMBOLS */
  277. #ifdef lint
  278. extern const int lintnoloop_interposition_h;
  279. #else
  280. #define lintnoloop_interposition_h 0
  281. #endif
  282. struct libsymbol_t {
  283. char *symbol; /* the symbol. */
  284. char *library; /* library symbol is in. */
  285. void *handle; /* our handle to the library. */
  286. void *function; /* the bound symbol. */
  287. };
  288. #if DIAGNOSTIC
  289. #define SIGBLOCK() 
  290. sigset_t oldmask;
  291. do {
  292. sigset_t newmask;
  293. sigemptyset(&newmask);
  294. sigaddset(&newmask, SIGALRM);
  295. if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) != 0)
  296. swarn("SYSCALL_START(): sigprocmask()");
  297. } while (0)
  298. #else /* */
  299. #define SIGBLOCK() do { } while (lintnoloop_interposition_h)
  300. #endif
  301. #if DIAGNOSTIC
  302. #define SIGUNBLOCK() 
  303. do { 
  304. if (socksfd->state.system == 0)
  305. cc_socksfdv(-1);
  306. if (sigprocmask(SIG_SETMASK, &oldmask, NULL) != 0)
  307. swarn("SYSCALL_END(): sigprocmask()");
  308. } while (lintnoloop_interposition_h)
  309. #else
  310. #define SIGUNBLOCK() do { } while (lintnoloop_interposition_h)
  311. #endif
  312. #define SYSCALL_START(s) 
  313. int socksfd_added = 0;
  314. SIGBLOCK();
  315. do {
  316. struct socksfd_t socksfdmem, *socksfd;
  317. if ((socksfd = socks_getaddr((unsigned int)s)) == NULL) {
  318. bzero(&socksfdmem, sizeof(socksfdmem));
  319. socksfdmem.state.command  = -1;
  320. socksfd = socks_addaddr((unsigned int)s, &socksfdmem);
  321. socksfd_added = 1;
  322. }
  323. SASSERTX(socksfd->state.system >= 0);
  324. ++socksfd->state.system;
  325. } while (lintnoloop_interposition_h)
  326. #define SYSCALL_END(s) 
  327. do {
  328. struct socksfd_t *socksfd = socks_getaddr((unsigned int)s);
  329. SASSERTX(socksfd != NULL);
  330. SASSERTX(socksfd->state.system > 0);
  331. --socksfd->state.system;
  332. SIGUNBLOCK();
  333. if (socksfd_added) {
  334. SASSERTX(socksfd->state.system == 0);
  335. socks_rmaddr((unsigned int)s);
  336. }
  337. } while (lintnoloop_interposition_h)
  338. #define ISSYSCALL(s)
  339. (socks_getaddr((unsigned int)(s)) != NULL
  340.  && socks_getaddr((unsigned int)(s))->state.system)
  341. __BEGIN_DECLS
  342. void *
  343. symbolfunction __P((char *symbol));
  344. /*
  345.  * Returns the address binding of the symbol "symbol" and updates
  346.  * libsymbol_t structure "symbol" is defined in if necessary.
  347.  * Exits on failure.
  348.  */
  349. __END_DECLS