OSDN Git Service

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