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

代理服务器

开发平台:

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-0349 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. #undef _XOPEN_SOURCE_EXTENDED
  44. #undef _SOCKADDR_LEN
  45. #define HAVE_OSF_OLDSTYLE 1
  46. #include "common.h"
  47. #if HAVE_EXTRA_OSF_SYMBOLS
  48. #if SOCKSLIBRARY_DYNAMIC
  49. /*
  50.  * use of bzero in SYSCALL_START produces vast amounts of warnings
  51.  * when compiling int_osf3.c (on osf)
  52.  */
  53. #define bzero(a, b) (memset(a, 0, b))
  54. #include "interposition.h"
  55. static const char rcsid[] =
  56. "$Id: int_osf3.c,v 1.15 1999/12/09 08:18:07 karls Exp $";
  57. #undef accept
  58. #undef bind
  59. #undef getpeername
  60. #undef getsockname
  61. #undef recvfrom
  62. #undef recvmsg
  63. #undef sendmsg
  64. #undef connect
  65. #undef readv
  66. #undef writev
  67. #undef sendto
  68. /* XXX Attempt to support old library calls, which use old version of
  69.    sockaddr and msghdr struct. Other parts of libdsocks are compiled
  70.    using the new versions. */
  71. /* sockaddr struct, with sa_len */
  72. struct n_sockaddr {
  73. unsigned char    sa_len; /* total length */
  74. sa_family_t sa_family; /* address family */
  75. char     sa_data[14]; /* actually longer; address value */
  76. };
  77. struct n_msghdr {
  78. void   *msg_name; /* optional address */
  79. size_t msg_namelen; /* size of address */
  80. struct iovec *msg_iov;/* scatter/gather array */
  81. int msg_iovlen; /* # elements in msg_iov */
  82. void    *msg_control; /* ancillary data, see below */
  83. size_t msg_controllen;/* ancillary data buffer len */
  84. int msg_flags; /* flags on received message */
  85. };
  86. __BEGIN_DECLS
  87. ssize_t Rsendto __P((int, const void *, size_t, int,
  88. const struct n_sockaddr *, socklen_t));
  89. int Rconnect __P((int, const struct n_sockaddr *, socklen_t));
  90. ssize_t Rsendmsg __P((int, const struct n_msghdr *, int));
  91. ssize_t Rrecvfrom __P((int, void *, int, int, struct n_sockaddr *, socklen_t *));
  92. int Rgetsockname __P((int, struct n_sockaddr *, socklen_t *));
  93. int Rgetpeername __P((int, struct n_sockaddr *, socklen_t *));
  94. int Raccept __P((int, struct n_sockaddr *, socklen_t *));
  95. ssize_t Rrecvmsg __P((int s, struct n_msghdr *msg, int flags));
  96. int Rbind __P((int, const struct n_sockaddr *, socklen_t));
  97. __END_DECLS
  98. /* 'old' versions (with sockaddr len) of the system calls. */
  99. int
  100. sys_accept(s, addr, addrlen)
  101. int s;
  102. struct sockaddr *addr;
  103. int *addrlen;
  104. {
  105. int rc;
  106. int (*function)(int s, struct sockaddr * addr, socklen_t *addrlen);
  107. SYSCALL_START(s);
  108. function = symbolfunction(SYMBOL_ACCEPT);
  109. rc = function(s, addr, (socklen_t *) addrlen);
  110. SYSCALL_END(s);
  111. return rc;
  112. }
  113. int
  114. sys_getpeername(s, name, namelen)
  115. int s;
  116. struct sockaddr *name;
  117. int *namelen;
  118. {
  119. int rc;
  120. int (*function)(int s, const struct sockaddr * name, socklen_t *namelen);
  121. SYSCALL_START(s);
  122. function = symbolfunction(SYMBOL_GETPEERNAME);
  123. rc = function(s, name, (socklen_t *) namelen);
  124. SYSCALL_END(s);
  125. return rc;
  126. }
  127. int
  128. sys_getsockname(s, name, namelen)
  129. int s;
  130. struct sockaddr *name;
  131. int *namelen;
  132. {
  133. int rc;
  134. int (*function)(int s, const struct sockaddr * name, socklen_t *namelen);
  135. SYSCALL_START(s);
  136. function = symbolfunction(SYMBOL_GETSOCKNAME);
  137. rc = function(s, name, (socklen_t *) namelen);
  138. SYSCALL_END(s);
  139. return rc;
  140. }
  141. int
  142. sys_recvfrom(s, buf, len, flags, from, fromlen)
  143. int s;
  144. void *buf;
  145. int len;
  146. int flags;
  147. struct sockaddr *from;
  148. int *fromlen;
  149. {
  150. int rc;
  151. int (*function)(int s, void *buf, size_t len, int flags,
  152.     struct sockaddr * from, socklen_t *fromlen);
  153. SYSCALL_START(s);
  154. function = symbolfunction(SYMBOL_RECVFROM);
  155. rc = function(s, buf, len, flags, from, (socklen_t *) fromlen);
  156. SYSCALL_END(s);
  157. return rc;
  158. }
  159. ssize_t
  160. sys_recvmsg(s, msg, flags)
  161. int s;
  162. struct msghdr *msg;
  163. int flags;
  164. {
  165. ssize_t rc;
  166. int (*function)(int s, struct msghdr *msg, int flags);
  167. SYSCALL_START(s);
  168. function = symbolfunction(SYMBOL_RECVMSG);
  169. rc = function(s, msg, flags);
  170. SYSCALL_END(s);
  171. return rc;
  172. }
  173. ssize_t
  174. sys_sendmsg(s, msg, flags)
  175. int s;
  176. struct msghdr *msg;
  177. int flags;
  178. {
  179. ssize_t rc;
  180. int (*function)(int s, const struct msghdr *msg, int flags);
  181. SYSCALL_START(s);
  182. function = symbolfunction(SYMBOL_SENDMSG);
  183. rc = function(s, msg, flags);
  184. SYSCALL_END(s);
  185. return rc;
  186. }
  187. ssize_t
  188. sys_readv(d, iov, iovcnt)
  189. int d;
  190. const struct iovec *iov;
  191. int iovcnt;
  192. {
  193. ssize_t rc;
  194. int (*function)(int d, const struct iovec *iov, int iovcnt);
  195. SYSCALL_START(d);
  196. function = symbolfunction(SYMBOL_READV);
  197. rc = function(d, iov, iovcnt);
  198. SYSCALL_END(d);
  199. return rc;
  200. }
  201. ssize_t
  202. sys_writev(d, iov, iovcnt)
  203. int d;
  204. struct iovec *iov;
  205. int iovcnt;
  206. {
  207. ssize_t rc;
  208. int (*function)(int d, const struct iovec *buf, int iovcnt);
  209. SYSCALL_START(d);
  210. function = symbolfunction(SYMBOL_WRITEV);
  211. rc = function(d, iov, iovcnt);
  212. SYSCALL_END(d);
  213. return rc;
  214. }
  215. int
  216. sys_connect(s, name, namelen)
  217. int s;
  218. const struct sockaddr *name;
  219. int namelen;
  220. {
  221. int rc;
  222. int (*function)(int s, const struct sockaddr * name, socklen_t namelen);
  223. SYSCALL_START(s);
  224. function = symbolfunction(SYMBOL_CONNECT);
  225. rc = function(s, name, namelen);
  226. SYSCALL_END(s);
  227. return rc;
  228. }
  229. int
  230. sys_bind(s, name, namelen)
  231. int s;
  232. const struct sockaddr *name;
  233. int namelen;
  234. {
  235. int rc;
  236. int (*function)(int s, const struct sockaddr *name, socklen_t namelen);
  237. SYSCALL_START(s);
  238. function = symbolfunction(SYMBOL_BIND);
  239. rc = function(s, name, namelen);
  240. SYSCALL_END(s);
  241. return rc;
  242. }
  243. int
  244. sys_sendto(s, msg, len, flags, to, tolen)
  245. int s;
  246. const void *msg;
  247. int len;
  248. int flags;
  249. const struct sockaddr *to;
  250. socklen_t tolen;
  251. {
  252. ssize_t rc;
  253. int (*function)(int s, const void *msg, size_t len, int flags,
  254.     const struct sockaddr *to, socklen_t tolen);
  255. SYSCALL_START(s);
  256. function = symbolfunction(SYMBOL_SENDTO);
  257. rc = function(s, msg, len, flags, to, tolen);
  258. SYSCALL_END(s);
  259. return rc;
  260. }
  261. /*
  262.  * the interpositioned functions.
  263.  */
  264. /* sockaddr *, new len */
  265. #define ADDRLEN_SET(a,b) (((a) == NULL) ? 0 : (b))
  266. #ifdef lint
  267. extern const int lintnoloop_int_osf3_c;
  268. #else
  269. #define lintnoloop_int_osf3_c 0
  270. #endif
  271. /* source sockaddr, len, dest sockaddr, len */
  272. #define SOCKADDR_COPYRES(a,b,c,d) 
  273.  do { if (((c) != NULL) && (*(d) > 0) && (*(b) > 0)) { 
  274. struct n_sockaddr n = *(a); 
  275. int tmplen = *(d); 
  276. if (tmplen >= sizeof(n.sa_family)) 
  277. (c)->sa_family = (unsigned short)n.sa_family; 
  278. tmplen -= sizeof((c)->sa_family); 
  279. tmplen = MAX(0, tmplen); 
  280. memcpy((c)->sa_data, n.sa_data, (size_t)tmplen); 
  281. *(d) = MIN(*d, sizeof(struct sockaddr)); 
  282.   } while (lintnoloop_int_osf3_c)
  283. /* source sockaddr, len, dest sockaddr, len */
  284. #define SOCKADDR_COPYPARAM(a,b,c,d) 
  285.  do { if (((a) != NULL) && (*(b) > 0)) { 
  286. struct n_sockaddr n; 
  287. int tmplen = *(b); 
  288. bzero((char *)&n, sizeof(n));  
  289. /* struct sockaddr -> sa_family == unsigned short */ 
  290. if (tmplen >= sizeof(unsigned short))  
  291. n.sa_family = (sa_family_t)(a)->sa_family; 
  292. tmplen -= sizeof(n.sa_family); 
  293. tmplen = MAX(0, tmplen); 
  294. memcpy(n.sa_data, (a)->sa_data, (size_t)tmplen); 
  295. *(d) = sizeof(n); 
  296. *c = n; 
  297. } else { 
  298. *(d) = *(b); 
  299.   } while (lintnoloop_int_osf3_c)
  300. int
  301. accept(s, addr, addrlen)
  302. int s;
  303. struct sockaddr *addr;
  304. int *addrlen;
  305. {
  306. struct n_sockaddr n_addr;
  307. socklen_t n_addrlen;
  308. int rc;
  309. if (ISSYSCALL(s))
  310. return sys_accept(s, addr, addrlen);
  311. n_addrlen = ADDRLEN_SET(addr, sizeof(n_addr));
  312. rc = Raccept(s, &n_addr, &n_addrlen);
  313. if (rc != -1)
  314. SOCKADDR_COPYRES(&n_addr, &n_addrlen, addr, addrlen);
  315. return rc;
  316. }
  317. int
  318. getpeername(s, name, namelen)
  319. int s;
  320. struct sockaddr *name;
  321. int *namelen;
  322. {
  323. struct n_sockaddr n_name;
  324. socklen_t n_namelen;
  325. int rc;
  326. if (ISSYSCALL(s))
  327. return sys_getpeername(s, name, namelen);
  328. n_namelen = ADDRLEN_SET(name, sizeof(n_name));
  329. rc = Rgetpeername(s, &n_name, &n_namelen);
  330. if (rc != -1)
  331. SOCKADDR_COPYRES(&n_name, &n_namelen, name, namelen);
  332. return rc;
  333. }
  334. int
  335. getsockname(s, name, namelen)
  336. int s;
  337. struct sockaddr *name;
  338. int *namelen;
  339. {
  340. struct n_sockaddr n_name;
  341. socklen_t n_namelen;
  342. int rc;
  343. if (ISSYSCALL(s))
  344. return sys_getsockname(s, name, namelen);
  345. n_namelen = ADDRLEN_SET(name, sizeof(n_name));
  346. rc = Rgetsockname(s, &n_name, &n_namelen);
  347. if (rc != -1)
  348. SOCKADDR_COPYRES(&n_name, &n_namelen, name, namelen);
  349. return rc;
  350. }
  351. int
  352. recvfrom(s, buf, len, flags, from, fromlen)
  353. int s;
  354. void *buf;
  355. int len;
  356. int flags;
  357. struct sockaddr *from;
  358. int *fromlen;
  359. {
  360. struct n_sockaddr n_from;
  361. socklen_t n_fromlen;
  362. ssize_t rc;
  363. if (ISSYSCALL(s))
  364. return sys_recvfrom(s, buf, len, flags, from, fromlen);
  365. n_fromlen = ADDRLEN_SET(from, sizeof(n_from));
  366. rc = Rrecvfrom(s, buf, len, flags, (struct n_sockaddr *)&n_from, &n_fromlen);
  367. if (rc != -1)
  368. SOCKADDR_COPYRES(&n_from, &n_fromlen, from, fromlen);
  369. return rc;
  370. }
  371. int
  372. recvmsg(s, msg, flags)
  373. int s;
  374. struct msghdr *msg;
  375. int flags;
  376. {
  377. struct n_msghdr n_msg;
  378. ssize_t rc;
  379. if (ISSYSCALL(s))
  380. return sys_recvmsg(s, msg, flags);
  381. bzero((char *)&n_msg, sizeof(struct n_msghdr));
  382. n_msg.msg_name = msg->msg_name;
  383. n_msg.msg_namelen = msg->msg_namelen;
  384. n_msg.msg_iov = msg->msg_iov;
  385. n_msg.msg_iovlen = msg->msg_iovlen;
  386. /* XXX msg_control/msg_accrights */
  387. rc = Rrecvmsg(s, &n_msg, flags);
  388. if (rc != -1) {
  389. msg->msg_name = n_msg.msg_name;
  390. msg->msg_namelen = n_msg.msg_namelen;
  391. msg->msg_iov = n_msg.msg_iov;
  392. msg->msg_iovlen = n_msg.msg_iovlen;
  393. /* XXX msg_control / msg_accrights */
  394. if (n_msg.msg_controllen != 0)
  395. swarn("warning: msg_accrights/controllen conversion not supported");
  396. }
  397. return rc;
  398. }
  399. int
  400. sendmsg(s, msg, flags)
  401. int s;
  402. struct msghdr *msg;
  403. int flags;
  404. {
  405. struct n_msghdr n_msg;
  406. ssize_t rc;
  407. if (ISSYSCALL(s))
  408. return sys_sendmsg(s, msg, flags);
  409. bzero((char *)&n_msg, sizeof(struct n_msghdr));
  410. n_msg.msg_name = msg->msg_name;
  411. n_msg.msg_namelen = msg->msg_namelen;
  412. n_msg.msg_iov = msg->msg_iov;
  413. n_msg.msg_iovlen = msg->msg_iovlen;
  414. /* XXX msg_control/msg_accrights */
  415. if  (msg->msg_accrightslen != 0)
  416. swarn("warning: msg_accrights/controllen conversion not supported");
  417. rc = Rsendmsg(s, (struct n_msghdr *)&n_msg, flags);
  418. if (rc != -1) {
  419. msg->msg_name = n_msg.msg_name;
  420. msg->msg_namelen = n_msg.msg_namelen;
  421. msg->msg_iov = n_msg.msg_iov;
  422. msg->msg_iovlen = n_msg.msg_iovlen;
  423. /* XXX msg_control / msg_accrights */
  424. }
  425. return rc;
  426. }
  427. int
  428. connect(s, name, namelen)
  429. int s;
  430. const struct sockaddr *name;
  431. int namelen;
  432. {
  433. struct n_sockaddr n_name;
  434. int n_namelen;
  435. if (ISSYSCALL(s))
  436. return sys_connect(s, name, namelen);
  437. SOCKADDR_COPYPARAM(name, &namelen, &n_name, &n_namelen);
  438. return Rconnect(s, &n_name, n_namelen);
  439. }
  440. int
  441. bind(s, name, namelen)
  442. int s;
  443. const struct sockaddr *name;
  444. int namelen;
  445. {
  446. struct n_sockaddr n_name;
  447. int n_namelen;
  448. if (ISSYSCALL(s))
  449. return sys_bind(s, name, namelen);
  450. SOCKADDR_COPYPARAM(name, &namelen, &n_name, &n_namelen);
  451. return Rbind(s, &n_name, n_namelen);
  452. }
  453. int
  454. sendto(s, msg, len, flags, to, tolen)
  455. int s;
  456. const void *msg;
  457. int len;
  458. int flags;
  459. const struct sockaddr *to;
  460. int tolen;
  461. {
  462. struct n_sockaddr n_to;
  463. int n_tolen;
  464. if (ISSYSCALL(s))
  465. return sys_sendto(s, msg, len, flags, to, tolen);
  466. SOCKADDR_COPYPARAM(to, &tolen, &n_to, &n_tolen);
  467. return Rsendto(s, msg, len, flags, &n_to, n_tolen);
  468. }
  469. ssize_t
  470. writev(d, iov, iovcnt)
  471. int d;
  472. struct iovec *iov;
  473. int iovcnt;
  474. {
  475. if (ISSYSCALL(d))
  476. return sys_writev(d, iov, iovcnt);
  477. return Rwritev(d, iov, iovcnt);
  478. }
  479. ssize_t
  480. readv(d, iov, iovcnt)
  481. int d;
  482. struct iovec *iov;
  483. int iovcnt;
  484. {
  485. if (ISSYSCALL(d))
  486. return sys_readv(d, iov, iovcnt);
  487. return Rreadv(d, iov, iovcnt);
  488. }
  489. #endif /* SOCKSLIBRARY_DYNAMIC */
  490. #endif /* HAVE_EXTRA_OSF_SYMBOLS */