1 /*
2  * Copyright (c) 1997, 1998, 1999, 2000, 2001, 2008, 2009, 2010
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  *  Gaustadall�en 21
36  *  NO-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 
44 #include "common.h"
45 
46 #if HAVE_EXTRA_OSF_SYMBOLS
47 
48 #if SOCKSLIBRARY_DYNAMIC
49 
50 static const char rcsid[] =
51 "$Id: int_osf2.c,v 1.21 2011/05/18 13:48:45 karls Exp $";
52 
53 #undef accept
54 #undef getpeername
55 #undef getsockname
56 #undef recvfrom
57 #undef recvmsg
58 #undef sendmsg
59 
60    /* nfoo versions (with sockaddr len) of the system calls. */
61 
62 int
sys_naccept(s,addr,addrlen)63 sys_naccept(s, addr, addrlen)
64    int s;
65    struct sockaddr *addr;
66    socklen_t *addrlen;
67 {
68    int rc;
69    int (*function)(int s, struct sockaddr *addr, socklen_t *addrlen);
70 
71    socks_syscall_start(s);
72    function = symbolfunction(SYMBOL_NACCEPT);
73    rc = function(s, addr, addrlen);
74    socks_syscall_end(s);
75    return rc;
76 }
77 
78 int
sys_ngetpeername(s,name,namelen)79 sys_ngetpeername(s, name, namelen)
80    int s;
81    struct sockaddr *name;
82    socklen_t *namelen;
83 {
84    int rc;
85    int (*function)(int s, const struct sockaddr *name, socklen_t *namelen);
86 
87    socks_syscall_start(s);
88    function = symbolfunction(SYMBOL_NGETPEERNAME);
89    rc = function(s, name, namelen);
90    socks_syscall_end(s);
91    return rc;
92 }
93 
94 int
sys_ngetsockname(s,name,namelen)95 sys_ngetsockname(s, name, namelen)
96    int s;
97    struct sockaddr *name;
98    socklen_t *namelen;
99 {
100    int rc;
101    int (*function)(int s, const struct sockaddr *name, socklen_t *namelen);
102 
103    socks_syscall_start(s);
104    function = symbolfunction(SYMBOL_NGETSOCKNAME);
105    rc = function(s, name, namelen);
106    socks_syscall_end(s);
107    return rc;
108 }
109 
110 int
sys_nrecvfrom(s,buf,len,flags,from,fromlen)111 sys_nrecvfrom(s, buf, len, flags, from, fromlen)
112    int s;
113    void *buf;
114    size_t len;
115    int flags;
116    struct sockaddr *from;
117    size_t *fromlen;
118 {
119    int rc;
120    int (*function)(int s, void *buf, size_t len, int flags,
121                    struct sockaddr *from, socklen_t *fromlen);
122 
123    socks_syscall_start(s);
124    function = symbolfunction(SYMBOL_NRECVFROM);
125    rc = function(s, buf, len, flags, from, fromlen);
126    socks_syscall_end(s);
127    return rc;
128 }
129 
130 ssize_t
sys_nrecvmsg(s,msg,flags)131 sys_nrecvmsg(s, msg, flags)
132    int s;
133    struct msghdr *msg;
134    int flags;
135 {
136    ssize_t rc;
137    int (*function)(int s, struct msghdr *msg, int flags);
138 
139    socks_syscall_start(s);
140    function = symbolfunction(SYMBOL_NRECVMSG);
141    rc = function(s, msg, flags);
142    socks_syscall_end(s);
143    return rc;
144 }
145 
146 ssize_t
sys_nsendmsg(s,msg,flags)147 sys_nsendmsg(s, msg, flags)
148    int s;
149    const struct msghdr *msg;
150    int flags;
151 {
152    ssize_t rc;
153    int (*function)(int s, const struct msghdr *msg, int flags);
154 
155    socks_syscall_start(s);
156    function = symbolfunction(SYMBOL_NSENDMSG);
157    rc = function(s, msg, flags);
158    socks_syscall_end(s);
159    return rc;
160 }
161 
162    /*
163     * the interpositioned functions.
164     */
165 
166 int
naccept(s,addr,addrlen)167 naccept(s, addr, addrlen)
168    int s;
169    struct sockaddr *addr;
170    socklen_t *addrlen;
171 {
172    if (socks_issyscall(s, SYMBOL_NACCEPT))
173       return sys_naccept(s, addr, addrlen);
174    return Raccept(s, addr, addrlen);
175 }
176 int
ngetpeername(s,name,namelen)177 ngetpeername(s, name, namelen)
178    int s;
179    struct sockaddr *name;
180    socklen_t *namelen;
181 {
182    if (socks_issyscall(s, SYMBOL_NGETPEERNAME))
183       return sys_ngetpeername(s, name, namelen);
184    return Rgetpeername(s, name, namelen);
185 }
186 
187 int
ngetsockname(s,name,namelen)188 ngetsockname(s, name, namelen)
189    int s;
190    struct sockaddr *name;
191    socklen_t *namelen;
192 {
193    if (socks_issyscall(s, SYMBOL_NGETSOCKNAME))
194       return sys_ngetpeername(s, name, namelen);
195    return Rgetsockname(s, name, namelen);
196 }
197 
198 ssize_t
nrecvfrom(s,buf,len,flags,from,fromlen)199 nrecvfrom(s, buf, len, flags, from, fromlen)
200    int s;
201    void *buf;
202    size_t len;
203    int flags;
204    struct sockaddr *from;
205    size_t *fromlen;
206 {
207    if (socks_issyscall(s, SYMBOL_NRECVFROM))
208       return sys_nrecvfrom(s, buf, len, flags, from, fromlen);
209    return Rrecvfrom(s, buf, len, flags, from, fromlen);
210 }
211 
212 ssize_t
nrecvmsg(s,msg,flags)213 nrecvmsg(s, msg, flags)
214    int s;
215    struct msghdr *msg;
216    int flags;
217 {
218    if (socks_issyscall(s, SYMBOL_NRECVMSG))
219       return sys_nrecvmsg(s, msg, flags);
220    return Rrecvmsg(s, msg, flags);
221 }
222 
223 ssize_t
nsendmsg(s,msg,flags)224 nsendmsg(s, msg, flags)
225    int s;
226    const struct msghdr *msg;
227    int flags;
228 {
229    if (socks_issyscall(s, SYMBOL_NSENDMSG))
230       return sys_nsendmsg(s, msg, flags);
231    return Rsendmsg(s, msg, flags);
232 }
233 
234 #endif /* SOCKSLIBRARY_DYNAMIC */
235 
236 #endif /* HAVE_EXTRA_OSF_SYMBOLS */
237