| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
| * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
| * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
| * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| */ |
| #include <unistd.h> |
| #include <sys/socket.h> |
| #include <sys/linux-syscalls.h> |
| |
| enum |
| { |
| SYS_SOCKET = 1, |
| SYS_BIND, |
| SYS_CONNECT, |
| SYS_LISTEN, |
| SYS_ACCEPT, |
| SYS_GETSOCKNAME, |
| SYS_GETPEERNAME, |
| SYS_SOCKETPAIR, |
| SYS_SEND, |
| SYS_RECV, |
| SYS_SENDTO, |
| SYS_RECVFROM, |
| SYS_SHUTDOWN, |
| SYS_SETSOCKOPT, |
| SYS_GETSOCKOPT, |
| SYS_SENDMSG, |
| SYS_RECVMSG |
| }; |
| |
| #ifndef __NR_socket |
| int socket(int domain, int type, int protocol) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) domain; |
| t[1] = (unsigned long) type; |
| t[2] = (unsigned long) protocol; |
| |
| return (int) __socketcall( SYS_SOCKET, t ); |
| } |
| #endif /* !__NR_socket */ |
| |
| |
| #ifndef __NR_bind |
| int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) sockfd; |
| t[1] = (unsigned long) my_addr; |
| t[2] = (unsigned long) addrlen; |
| |
| return (int) __socketcall( SYS_BIND, t ); |
| } |
| #endif /* !__NR_bind */ |
| |
| #ifndef __NR_connect |
| int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen ) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) sockfd; |
| t[1] = (unsigned long) serv_addr; |
| t[2] = (unsigned long) addrlen; |
| |
| return (int) __socketcall( SYS_CONNECT, t ); |
| } |
| #endif /* !__NR_connect */ |
| |
| #ifndef __NR_listen |
| int listen(int s, int backlog) |
| { |
| unsigned long t[2]; |
| |
| t[0] = (unsigned long) s; |
| t[1] = (unsigned long) backlog; |
| |
| return (int) __socketcall( SYS_LISTEN, t ); |
| } |
| #endif /* __NR_listen */ |
| |
| #ifndef __NR_accept |
| int accept(int sock, struct sockaddr *adresse, socklen_t *longueur) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) sock; |
| t[1] = (unsigned long) adresse; |
| t[2] = (unsigned long) longueur; |
| |
| return (int) __socketcall( SYS_ACCEPT, t ); |
| } |
| #endif /* __NR_accept */ |
| |
| #ifndef __NR_getsockname |
| int getsockname(int s, struct sockaddr * name, socklen_t * namelen ) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) s; |
| t[1] = (unsigned long) name; |
| t[2] = (unsigned long) namelen; |
| |
| return (int) __socketcall( SYS_GETSOCKNAME, t ); |
| } |
| #endif /* __NR_getsockname */ |
| |
| #ifndef __NR_getpeername |
| int getpeername(int s, struct sockaddr *name, socklen_t *namelen) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) s; |
| t[1] = (unsigned long) name; |
| t[2] = (unsigned long) namelen; |
| |
| return (int) __socketcall( SYS_GETPEERNAME, t ); |
| } |
| #endif /* !__NR_getpeername */ |
| |
| #ifndef __NR_socketpair |
| int socketpair(int d, int type, int protocol, int sv[2]) |
| { |
| unsigned long t[4]; |
| |
| t[0] = (unsigned long) d; |
| t[1] = (unsigned long) type; |
| t[2] = (unsigned long) protocol; |
| t[3] = (unsigned long) sv; |
| |
| return (int) __socketcall( SYS_SOCKETPAIR, t ); |
| } |
| #endif /* __NR_socketpair */ |
| |
| #ifndef __NR_sendto |
| ssize_t sendto(int socket, const void *message, size_t length, int flags, |
| const struct sockaddr *dest_addr, socklen_t dest_len) |
| { |
| unsigned long t[6]; |
| |
| t[0] = (unsigned long) socket; |
| t[1] = (unsigned long) message; |
| t[2] = (unsigned long) length; |
| t[3] = (unsigned long) flags; |
| t[4] = (unsigned long) dest_addr; |
| t[5] = (unsigned long) dest_len; |
| |
| return __socketcall( SYS_SENDTO, t ); |
| } |
| #endif /* !__NR_sendto */ |
| |
| #ifndef __NR_recvfrom |
| ssize_t recvfrom(int socket, void *buffer, size_t length, unsigned int flags, |
| const struct sockaddr *address, socklen_t *address_len) |
| { |
| unsigned long t[6]; |
| |
| t[0] = (unsigned long) socket; |
| t[1] = (unsigned long) buffer; |
| t[2] = (unsigned long) length; |
| t[3] = (unsigned long) flags; |
| t[4] = (unsigned long) address; |
| t[5] = (unsigned long) address_len; |
| |
| return __socketcall( SYS_RECVFROM, t ); |
| } |
| #endif /* !__NR_recvfrom */ |
| |
| #ifndef __NR_shutdown |
| int shutdown(int socket, int how) |
| { |
| unsigned long t[2]; |
| |
| t[0] = (unsigned long) socket; |
| t[1] = (unsigned long) how; |
| |
| return (int) __socketcall( SYS_SHUTDOWN, t ); |
| } |
| #endif /* !__NR_shutdown */ |
| |
| #ifndef __NR_setsockopt |
| int setsockopt( int s, int level, int optname, const void* optval, socklen_t optlen ) |
| { |
| unsigned long t[5]; |
| |
| t[0] = (unsigned long) s; |
| t[1] = (unsigned long) level; |
| t[2] = (unsigned long) optname; |
| t[3] = (unsigned long) optval; |
| t[4] = (unsigned long) optlen; |
| |
| return (int) __socketcall( SYS_SETSOCKOPT, t ); |
| } |
| #endif /* !__NR_setsockopt */ |
| |
| #ifndef __NR_getsockopt |
| int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) |
| { |
| unsigned long t[5]; |
| |
| t[0] = (unsigned long) s; |
| t[1] = (unsigned long) level; |
| t[2] = (unsigned long) optname; |
| t[3] = (unsigned long) optval; |
| t[4] = (unsigned long) optlen; |
| |
| return (int) __socketcall( SYS_GETSOCKOPT, t ); |
| } |
| #endif /* !__NR_getsockopt */ |
| |
| #ifndef __NR_sendmsg |
| int sendmsg (int socket, const struct msghdr *message, unsigned int flags) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) socket; |
| t[1] = (unsigned long) message; |
| t[2] = (unsigned long) flags; |
| |
| return __socketcall( SYS_SENDMSG, t ); |
| } |
| #endif /* __NR_sendmsg */ |
| |
| #ifndef __NR_recvmsg |
| int recvmsg(int socket, struct msghdr *message, unsigned int flags) |
| { |
| unsigned long t[3]; |
| |
| t[0] = (unsigned long) socket; |
| t[1] = (unsigned long) message; |
| t[2] = (unsigned long) flags; |
| |
| return __socketcall( SYS_RECVMSG, t ); |
| } |
| #endif /* __NR_recvmsg */ |
| |