2 * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
4 * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
11 #include <sys/socket.h>
13 #ifdef __NR_socketcall
14 extern int __socketcall(int call, unsigned long *args) attribute_hidden;
16 /* Various socketcall numbers */
22 #define SYS_GETSOCKNAME 6
23 #define SYS_GETPEERNAME 7
24 #define SYS_SOCKETPAIR 8
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
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)
43 unsigned long args[3];
46 args[1] = (unsigned long) addr;
47 args[2] = (unsigned long) addrlen;
48 return __socketcall(SYS_ACCEPT, args);
51 libc_hidden_def(accept)
55 /* libc_hidden_proto(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)
61 unsigned long args[3];
64 args[1] = (unsigned long) myaddr;
66 return __socketcall(SYS_BIND, args);
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)
78 unsigned long args[3];
81 args[1] = (unsigned long) saddr;
83 return __socketcall(SYS_CONNECT, args);
86 libc_hidden_def(connect)
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)
95 unsigned long args[3];
98 args[1] = (unsigned long) addr;
99 args[2] = (unsigned long) paddrlen;
100 return __socketcall(SYS_GETPEERNAME, args);
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)
112 unsigned long args[3];
115 args[1] = (unsigned long) addr;
116 args[2] = (unsigned long) paddrlen;
117 return __socketcall(SYS_GETSOCKNAME, args);
120 libc_hidden_def(getsockname)
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,
130 unsigned long args[5];
135 args[3] = (unsigned long) optval;
136 args[4] = (unsigned long) optlen;
137 return (__socketcall(SYS_GETSOCKOPT, args));
143 /* libc_hidden_proto(listen) */
145 _syscall2(int, listen, int, sockfd, int, backlog)
146 #elif defined(__NR_socketcall)
147 int listen(int sockfd, int backlog)
149 unsigned long args[2];
153 return __socketcall(SYS_LISTEN, args);
156 libc_hidden_def(listen)
161 _syscall4(ssize_t, recv, int, sockfd, __ptr_t, buffer, size_t, len,
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)
167 unsigned long args[4];
170 args[1] = (unsigned long) buffer;
173 return (__socketcall(SYS_RECV, args));
175 #elif defined(__NR_recvfrom)
176 /* libc_hidden_proto(recvfrom) */
177 ssize_t recv(int sockfd, __ptr_t buffer, size_t len, int flags)
179 return (recvfrom(sockfd, buffer, len, flags, NULL, NULL));
182 libc_hidden_def(recv)
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)
194 unsigned long args[6];
197 args[1] = (unsigned long) buffer;
200 args[4] = (unsigned long) to;
201 args[5] = (unsigned long) tolen;
202 return (__socketcall(SYS_RECVFROM, args));
205 libc_hidden_def(recvfrom)
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)
214 unsigned long args[3];
217 args[1] = (unsigned long) msg;
219 return (__socketcall(SYS_RECVMSG, args));
222 libc_hidden_def(recvmsg)
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)
232 unsigned long args[4];
235 args[1] = (unsigned long) buffer;
238 return (__socketcall(SYS_SEND, args));
240 #elif defined(__NR_sendto)
241 /* libc_hidden_proto(sendto) */
242 ssize_t send(int sockfd, const void *buffer, size_t len, int flags)
244 return (sendto(sockfd, buffer, len, flags, NULL, 0));
247 /* libc_hidden_proto(send) */
248 libc_hidden_def(send)
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)
257 unsigned long args[3];
260 args[1] = (unsigned long) msg;
262 return (__socketcall(SYS_SENDMSG, args));
265 libc_hidden_def(sendmsg)
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)
277 unsigned long args[6];
280 args[1] = (unsigned long) buffer;
283 args[4] = (unsigned long) to;
285 return (__socketcall(SYS_SENDTO, args));
288 libc_hidden_def(sendto)
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,
300 unsigned long args[5];
305 args[3] = (unsigned long) optval;
307 return (__socketcall(SYS_SETSOCKOPT, args));
310 libc_hidden_def(setsockopt)
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)
320 unsigned long args[2];
324 return (__socketcall(SYS_SHUTDOWN, args));
330 /* libc_hidden_proto(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)
336 unsigned long args[3];
340 args[2] = (unsigned long) protocol;
341 return __socketcall(SYS_SOCKET, args);
344 libc_hidden_def(socket)
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])
353 unsigned long args[4];
358 args[3] = (unsigned long) sockvec;
359 return __socketcall(SYS_SOCKETPAIR, args);