1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28#include <unistd.h> 29#include <sys/socket.h> 30#include <sys/linux-syscalls.h> 31 32enum 33{ 34 SYS_SOCKET = 1, 35 SYS_BIND, 36 SYS_CONNECT, 37 SYS_LISTEN, 38 SYS_ACCEPT, 39 SYS_GETSOCKNAME, 40 SYS_GETPEERNAME, 41 SYS_SOCKETPAIR, 42 SYS_SEND, 43 SYS_RECV, 44 SYS_SENDTO, 45 SYS_RECVFROM, 46 SYS_SHUTDOWN, 47 SYS_SETSOCKOPT, 48 SYS_GETSOCKOPT, 49 SYS_SENDMSG, 50 SYS_RECVMSG 51}; 52 53#ifndef __NR_socket 54int socket(int domain, int type, int protocol) 55{ 56 unsigned long t[3]; 57 58 t[0] = (unsigned long) domain; 59 t[1] = (unsigned long) type; 60 t[2] = (unsigned long) protocol; 61 62 return (int) __socketcall( SYS_SOCKET, t ); 63} 64#endif /* !__NR_socket */ 65 66 67#ifndef __NR_bind 68int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) 69{ 70 unsigned long t[3]; 71 72 t[0] = (unsigned long) sockfd; 73 t[1] = (unsigned long) my_addr; 74 t[2] = (unsigned long) addrlen; 75 76 return (int) __socketcall( SYS_BIND, t ); 77} 78#endif /* !__NR_bind */ 79 80#ifndef __NR_connect 81int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen ) 82{ 83 unsigned long t[3]; 84 85 t[0] = (unsigned long) sockfd; 86 t[1] = (unsigned long) serv_addr; 87 t[2] = (unsigned long) addrlen; 88 89 return (int) __socketcall( SYS_CONNECT, t ); 90} 91#endif /* !__NR_connect */ 92 93#ifndef __NR_listen 94int listen(int s, int backlog) 95{ 96 unsigned long t[2]; 97 98 t[0] = (unsigned long) s; 99 t[1] = (unsigned long) backlog; 100 101 return (int) __socketcall( SYS_LISTEN, t ); 102} 103#endif /* __NR_listen */ 104 105#ifndef __NR_accept 106int accept(int sock, struct sockaddr *adresse, socklen_t *longueur) 107{ 108 unsigned long t[3]; 109 110 t[0] = (unsigned long) sock; 111 t[1] = (unsigned long) adresse; 112 t[2] = (unsigned long) longueur; 113 114 return (int) __socketcall( SYS_ACCEPT, t ); 115} 116#endif /* __NR_accept */ 117 118#ifndef __NR_getsockname 119int getsockname(int s, struct sockaddr * name, socklen_t * namelen ) 120{ 121 unsigned long t[3]; 122 123 t[0] = (unsigned long) s; 124 t[1] = (unsigned long) name; 125 t[2] = (unsigned long) namelen; 126 127 return (int) __socketcall( SYS_GETSOCKNAME, t ); 128} 129#endif /* __NR_getsockname */ 130 131#ifndef __NR_getpeername 132int getpeername(int s, struct sockaddr *name, socklen_t *namelen) 133{ 134 unsigned long t[3]; 135 136 t[0] = (unsigned long) s; 137 t[1] = (unsigned long) name; 138 t[2] = (unsigned long) namelen; 139 140 return (int) __socketcall( SYS_GETPEERNAME, t ); 141} 142#endif /* !__NR_getpeername */ 143 144#ifndef __NR_socketpair 145int socketpair(int d, int type, int protocol, int sv[2]) 146{ 147 unsigned long t[4]; 148 149 t[0] = (unsigned long) d; 150 t[1] = (unsigned long) type; 151 t[2] = (unsigned long) protocol; 152 t[3] = (unsigned long) sv; 153 154 return (int) __socketcall( SYS_SOCKETPAIR, t ); 155} 156#endif /* __NR_socketpair */ 157 158#ifndef __NR_sendto 159ssize_t sendto(int socket, const void *message, size_t length, int flags, 160 const struct sockaddr *dest_addr, socklen_t dest_len) 161{ 162 unsigned long t[6]; 163 164 t[0] = (unsigned long) socket; 165 t[1] = (unsigned long) message; 166 t[2] = (unsigned long) length; 167 t[3] = (unsigned long) flags; 168 t[4] = (unsigned long) dest_addr; 169 t[5] = (unsigned long) dest_len; 170 171 return __socketcall( SYS_SENDTO, t ); 172} 173#endif /* !__NR_sendto */ 174 175#ifndef __NR_recvfrom 176ssize_t recvfrom(int socket, void *buffer, size_t length, unsigned int flags, 177 const struct sockaddr *address, socklen_t *address_len) 178{ 179 unsigned long t[6]; 180 181 t[0] = (unsigned long) socket; 182 t[1] = (unsigned long) buffer; 183 t[2] = (unsigned long) length; 184 t[3] = (unsigned long) flags; 185 t[4] = (unsigned long) address; 186 t[5] = (unsigned long) address_len; 187 188 return __socketcall( SYS_RECVFROM, t ); 189} 190#endif /* !__NR_recvfrom */ 191 192#ifndef __NR_shutdown 193int shutdown(int socket, int how) 194{ 195 unsigned long t[2]; 196 197 t[0] = (unsigned long) socket; 198 t[1] = (unsigned long) how; 199 200 return (int) __socketcall( SYS_SHUTDOWN, t ); 201} 202#endif /* !__NR_shutdown */ 203 204#ifndef __NR_setsockopt 205int setsockopt( int s, int level, int optname, const void* optval, socklen_t optlen ) 206{ 207 unsigned long t[5]; 208 209 t[0] = (unsigned long) s; 210 t[1] = (unsigned long) level; 211 t[2] = (unsigned long) optname; 212 t[3] = (unsigned long) optval; 213 t[4] = (unsigned long) optlen; 214 215 return (int) __socketcall( SYS_SETSOCKOPT, t ); 216} 217#endif /* !__NR_setsockopt */ 218 219#ifndef __NR_getsockopt 220int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) 221{ 222 unsigned long t[5]; 223 224 t[0] = (unsigned long) s; 225 t[1] = (unsigned long) level; 226 t[2] = (unsigned long) optname; 227 t[3] = (unsigned long) optval; 228 t[4] = (unsigned long) optlen; 229 230 return (int) __socketcall( SYS_GETSOCKOPT, t ); 231} 232#endif /* !__NR_getsockopt */ 233 234#ifndef __NR_sendmsg 235int sendmsg (int socket, const struct msghdr *message, unsigned int flags) 236{ 237 unsigned long t[3]; 238 239 t[0] = (unsigned long) socket; 240 t[1] = (unsigned long) message; 241 t[2] = (unsigned long) flags; 242 243 return __socketcall( SYS_SENDMSG, t ); 244} 245#endif /* __NR_sendmsg */ 246 247#ifndef __NR_recvmsg 248int recvmsg(int socket, struct msghdr *message, unsigned int flags) 249{ 250 unsigned long t[3]; 251 252 t[0] = (unsigned long) socket; 253 t[1] = (unsigned long) message; 254 t[2] = (unsigned long) flags; 255 256 return __socketcall( SYS_RECVMSG, t ); 257} 258#endif /* __NR_recvmsg */ 259 260