OSDN Git Service

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