OSDN Git Service

if both __NR_send and __NR_socketcall do not exist, fall back to __NR_sendto (same...
[uclinux-h8/uclibc-ng.git] / libc / inet / socketcalls.c
1 #define __FORCE_GLIBC
2 #include <features.h>
3 #include <errno.h>
4 #include <syscall.h>
5 #include <sys/socket.h>
6
7 #ifdef __NR_socketcall
8 extern int __socketcall(int call, unsigned long *args);
9
10 /* Various socketcall numbers */
11 #define SYS_SOCKET      1
12 #define SYS_BIND        2
13 #define SYS_CONNECT     3
14 #define SYS_LISTEN      4
15 #define SYS_ACCEPT      5
16 #define SYS_GETSOCKNAME 6
17 #define SYS_GETPEERNAME 7
18 #define SYS_SOCKETPAIR  8
19 #define SYS_SEND        9
20 #define SYS_RECV        10
21 #define SYS_SENDTO      11
22 #define SYS_RECVFROM    12
23 #define SYS_SHUTDOWN    13
24 #define SYS_SETSOCKOPT  14
25 #define SYS_GETSOCKOPT  15
26 #define SYS_SENDMSG     16
27 #define SYS_RECVMSG     17
28 #endif
29
30
31 #ifdef L_accept
32 #ifdef __NR_accept
33 #define __NR___libc_accept  __NR_accept
34 _syscall3(int, __libc_accept, int, call, struct sockaddr *, addr, socklen_t *,addrlen);
35 #elif defined(__NR_socketcall)
36 int __libc_accept(int s, struct sockaddr *addr, socklen_t * addrlen)
37 {
38         unsigned long args[3];
39
40         args[0] = s;
41         args[1] = (unsigned long) addr;
42         args[2] = (unsigned long) addrlen;
43         return __socketcall(SYS_ACCEPT, args);
44 }
45 #endif
46 weak_alias(__libc_accept, accept);
47 #endif
48
49 #ifdef L_bind
50 #ifdef __NR_bind
51 _syscall3(int, bind, int, sockfd, const struct sockaddr *, myaddr, socklen_t, addrlen);
52 #elif defined(__NR_socketcall)
53 int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
54 {
55         unsigned long args[3];
56
57         args[0] = sockfd;
58         args[1] = (unsigned long) myaddr;
59         args[2] = addrlen;
60         return __socketcall(SYS_BIND, args);
61 }
62 #endif
63 #endif
64
65 #ifdef L_connect
66 #ifdef __NR_connect
67 #define __NR___libc_connect __NR_connect
68 _syscall3(int, __libc_connect, int, sockfd, const struct sockaddr *, saddr, socklen_t, addrlen);
69 #elif defined(__NR_socketcall)
70 int __libc_connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen)
71 {
72         unsigned long args[3];
73
74         args[0] = sockfd;
75         args[1] = (unsigned long) saddr;
76         args[2] = addrlen;
77         return __socketcall(SYS_CONNECT, args);
78 }
79 #endif
80 weak_alias(__libc_connect, connect);
81 #endif
82
83 #ifdef L_getpeername
84 #ifdef __NR_getpeername
85 _syscall3(int, getpeername, int, sockfd, struct sockaddr *, addr, socklen_t *,paddrlen);
86 #elif defined(__NR_socketcall)
87 int getpeername(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
88 {
89         unsigned long args[3];
90
91         args[0] = sockfd;
92         args[1] = (unsigned long) addr;
93         args[2] = (unsigned long) paddrlen;
94         return __socketcall(SYS_GETPEERNAME, args);
95 }
96 #endif
97 #endif
98
99 #ifdef L_getsockname
100 #ifdef __NR_getsockname
101 _syscall3(int, getsockname, int, sockfd, struct sockaddr *, addr, socklen_t *,paddrlen);
102 #elif defined(__NR_socketcall)
103 int getsockname(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
104 {
105         unsigned long args[3];
106
107         args[0] = sockfd;
108         args[1] = (unsigned long) addr;
109         args[2] = (unsigned long) paddrlen;
110         return __socketcall(SYS_GETSOCKNAME, args);
111 }
112 #endif
113 #endif
114
115 #ifdef L_getsockopt
116 #ifdef __NR_getsockopt
117 _syscall5(int, getsockopt, int, fd, int, level, int, optname, __ptr_t, optval, socklen_t *, optlen);
118 #elif defined(__NR_socketcall)
119 int getsockopt(int fd, int level, int optname, __ptr_t optval,
120                    socklen_t * optlen)
121 {
122         unsigned long args[5];
123
124         args[0] = fd;
125         args[1] = level;
126         args[2] = optname;
127         args[3] = (unsigned long) optval;
128         args[4] = (unsigned long) optlen;
129         return (__socketcall(SYS_GETSOCKOPT, args));
130 }
131 #endif
132 #endif
133
134 #ifdef L_listen
135 #ifdef __NR_listen
136 _syscall2(int, listen, int, sockfd, int, backlog);
137 #elif defined(__NR_socketcall)
138 int listen(int sockfd, int backlog)
139 {
140         unsigned long args[2];
141
142         args[0] = sockfd;
143         args[1] = backlog;
144         return __socketcall(SYS_LISTEN, args);
145 }
146 #endif
147 #endif
148
149 #ifdef L_recv
150 #ifdef __NR_recv
151 #define __NR___libc_recv __NR_recv
152 _syscall4(ssize_t, __libc_recv, int, sockfd, __ptr_t, buffer, size_t, len, int, flags);
153 weak_alias(__libc_recv, recv);
154 #elif defined(__NR_socketcall)
155 /* recv, recvfrom added by bir7@leland.stanford.edu */
156 ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)
157 {
158         unsigned long args[4];
159
160         args[0] = sockfd;
161         args[1] = (unsigned long) buffer;
162         args[2] = len;
163         args[3] = flags;
164         return (__socketcall(SYS_RECV, args));
165 }
166 weak_alias(__libc_recv, recv);
167 #elif defined(__NR_recvfrom)
168 ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)
169 {
170         return (recvfrom(sockfd, buffer, len, flags, NULL, NULL));
171 }
172 weak_alias(__libc_recv, recv);
173 #endif
174 #endif
175
176 #ifdef L_recvfrom
177 #ifdef __NR_recvfrom
178 #define __NR___libc_recvfrom __NR_recvfrom
179 _syscall6(ssize_t, __libc_recvfrom, int, sockfd, __ptr_t, buffer, size_t, len, int, flags, 
180         struct sockaddr *, to, socklen_t *, tolen);
181 #elif defined(__NR_socketcall)
182 /* recv, recvfrom added by bir7@leland.stanford.edu */
183 ssize_t __libc_recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,
184                  struct sockaddr *to, socklen_t * tolen)
185 {
186         unsigned long args[6];
187
188         args[0] = sockfd;
189         args[1] = (unsigned long) buffer;
190         args[2] = len;
191         args[3] = flags;
192         args[4] = (unsigned long) to;
193         args[5] = (unsigned long) tolen;
194         return (__socketcall(SYS_RECVFROM, args));
195 }
196 #endif
197 weak_alias(__libc_recvfrom, recvfrom);
198 #endif
199
200 #ifdef L_recvmsg
201 #ifdef __NR_recvmsg
202 #define __NR___libc_recvmsg __NR_recvmsg
203 _syscall3(ssize_t, __libc_recvmsg, int, sockfd, struct msghdr *, msg, int, flags);
204 #elif defined(__NR_socketcall)
205 ssize_t __libc_recvmsg(int sockfd, struct msghdr *msg, int flags)
206 {
207         unsigned long args[3];
208
209         args[0] = sockfd;
210         args[1] = (unsigned long) msg;
211         args[2] = flags;
212         return (__socketcall(SYS_RECVMSG, args));
213 }
214 #endif
215 weak_alias(__libc_recvmsg, recvmsg);
216 #endif
217
218 #ifdef L_send
219 #ifdef __NR_send
220 #define __NR___libc_send    __NR_send
221 _syscall4(ssize_t, __libc_send, int, sockfd, const void *, buffer, size_t, len, int, flags);
222 weak_alias(__libc_send, send);
223 #elif defined(__NR_socketcall)
224 /* send, sendto added by bir7@leland.stanford.edu */
225 ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)
226 {
227         unsigned long args[4];
228
229         args[0] = sockfd;
230         args[1] = (unsigned long) buffer;
231         args[2] = len;
232         args[3] = flags;
233         return (__socketcall(SYS_SEND, args));
234 }
235 weak_alias(__libc_send, send);
236 #elif defined(__NR_sendto)
237 ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)
238 {
239         return (sendto(sockfd, buffer, len, flags, NULL, 0));
240 }
241 weak_alias(__libc_send, send);
242 #endif
243 #endif
244
245 #ifdef L_sendmsg
246 #ifdef __NR_sendmsg
247 #define __NR___libc_sendmsg __NR_sendmsg
248 _syscall3(ssize_t, __libc_sendmsg, int, sockfd, const struct msghdr *, msg, int, flags);
249 #elif defined(__NR_socketcall)
250 ssize_t __libc_sendmsg(int sockfd, const struct msghdr *msg, int flags)
251 {
252         unsigned long args[3];
253
254         args[0] = sockfd;
255         args[1] = (unsigned long) msg;
256         args[2] = flags;
257         return (__socketcall(SYS_SENDMSG, args));
258 }
259 #endif
260 weak_alias(__libc_sendmsg, sendmsg);
261 #endif
262
263 #ifdef L_sendto
264 #ifdef __NR_sendto
265 #define __NR___libc_sendto  __NR_sendto
266 _syscall6(ssize_t, __libc_sendto, int, sockfd, const void *, buffer, size_t, len, 
267         int, flags, const struct sockaddr *, to, socklen_t, tolen);
268 #elif defined(__NR_socketcall)
269 /* send, sendto added by bir7@leland.stanford.edu */
270 ssize_t __libc_sendto(int sockfd, const void *buffer, size_t len, int flags,
271            const struct sockaddr *to, socklen_t tolen)
272 {
273         unsigned long args[6];
274
275         args[0] = sockfd;
276         args[1] = (unsigned long) buffer;
277         args[2] = len;
278         args[3] = flags;
279         args[4] = (unsigned long) to;
280         args[5] = tolen;
281         return (__socketcall(SYS_SENDTO, args));
282 }
283 #endif
284 weak_alias(__libc_sendto, sendto);
285 #endif
286
287 #ifdef L_setsockopt
288 #ifdef __NR_setsockopt
289 _syscall5(int, setsockopt, int, fd, int, level, int, optname, const void *, optval, socklen_t, optlen);
290 #elif defined(__NR_socketcall)
291 /* [sg]etsockoptions by bir7@leland.stanford.edu */
292 int setsockopt(int fd, int level, int optname, const void *optval,
293                    socklen_t optlen)
294 {
295         unsigned long args[5];
296
297         args[0] = fd;
298         args[1] = level;
299         args[2] = optname;
300         args[3] = (unsigned long) optval;
301         args[4] = optlen;
302         return (__socketcall(SYS_SETSOCKOPT, args));
303 }
304 #endif
305 #endif
306
307 #ifdef L_shutdown
308 #ifdef __NR_shutdown
309 _syscall2(int, shutdown, int, sockfd, int, how);
310 #elif defined(__NR_socketcall)
311 /* shutdown by bir7@leland.stanford.edu */
312 int shutdown(int sockfd, int how)
313 {
314         unsigned long args[2];
315
316         args[0] = sockfd;
317         args[1] = how;
318         return (__socketcall(SYS_SHUTDOWN, args));
319 }
320 #endif
321 #endif
322
323 #ifdef L_socket
324 #ifdef __NR_socket
325 _syscall3(int, socket, int, family, int, type, int, protocol);
326 #elif defined(__NR_socketcall)
327 int socket(int family, int type, int protocol)
328 {
329         unsigned long args[3];
330
331         args[0] = family;
332         args[1] = type;
333         args[2] = (unsigned long) protocol;
334         return __socketcall(SYS_SOCKET, args);
335 }
336 #endif
337 #endif
338
339 #ifdef L_socketpair
340 #ifdef __NR_socketpair
341 _syscall4(int, socketpair, int, family, int, type, int, protocol, int *, sockvec);
342 #elif defined(__NR_socketcall)
343 int socketpair(int family, int type, int protocol, int sockvec[2])
344 {
345         unsigned long args[4];
346
347         args[0] = family;
348         args[1] = type;
349         args[2] = protocol;
350         args[3] = (unsigned long) sockvec;
351         return __socketcall(SYS_SOCKETPAIR, args);
352 }
353 #endif
354 #endif
355