socketcalls.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #define __FORCE_GLIBC
  2. #include <features.h>
  3. #include <errno.h>
  4. #include <syscall.h>
  5. #include <sys/socket.h>
  6. extern int socketcall(int call, unsigned long *args);
  7. /* Various socketcall numbers */
  8. #define SYS_SOCKET 1
  9. #define SYS_BIND 2
  10. #define SYS_CONNECT 3
  11. #define SYS_LISTEN 4
  12. #define SYS_ACCEPT 5
  13. #define SYS_GETSOCKNAME 6
  14. #define SYS_GETPEERNAME 7
  15. #define SYS_SOCKETPAIR 8
  16. #define SYS_SEND 9
  17. #define SYS_RECV 10
  18. #define SYS_SENDTO 11
  19. #define SYS_RECVFROM 12
  20. #define SYS_SHUTDOWN 13
  21. #define SYS_SETSOCKOPT 14
  22. #define SYS_GETSOCKOPT 15
  23. #define SYS_SENDMSG 16
  24. #define SYS_RECVMSG 17
  25. #ifdef L_accept
  26. int __libc_accept(int s, struct sockaddr *addr, socklen_t * addrlen)
  27. {
  28. unsigned long args[3];
  29. args[0] = s;
  30. args[1] = (unsigned long) addr;
  31. args[2] = (unsigned long) addrlen;
  32. return socketcall(SYS_ACCEPT, args);
  33. }
  34. weak_alias(__libc_accept, accept);
  35. #endif
  36. #ifdef L_bind
  37. int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
  38. {
  39. unsigned long args[3];
  40. args[0] = sockfd;
  41. args[1] = (unsigned long) myaddr;
  42. args[2] = addrlen;
  43. return socketcall(SYS_BIND, args);
  44. }
  45. #endif
  46. #ifdef L_connect
  47. int __libc_connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen)
  48. {
  49. unsigned long args[3];
  50. args[0] = sockfd;
  51. args[1] = (unsigned long) saddr;
  52. args[2] = addrlen;
  53. return socketcall(SYS_CONNECT, args);
  54. }
  55. weak_alias(__libc_connect, connect);
  56. #endif
  57. #ifdef L_getpeername
  58. int getpeername(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
  59. {
  60. unsigned long args[3];
  61. args[0] = sockfd;
  62. args[1] = (unsigned long) addr;
  63. args[2] = (unsigned long) paddrlen;
  64. return socketcall(SYS_GETPEERNAME, args);
  65. }
  66. #endif
  67. #ifdef L_getsockname
  68. int getsockname(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
  69. {
  70. unsigned long args[3];
  71. args[0] = sockfd;
  72. args[1] = (unsigned long) addr;
  73. args[2] = (unsigned long) paddrlen;
  74. return socketcall(SYS_GETSOCKNAME, args);
  75. }
  76. #endif
  77. #ifdef L_getsockopt
  78. int getsockopt(int fd, int level, int optname, __ptr_t optval,
  79. socklen_t * optlen)
  80. {
  81. unsigned long args[5];
  82. args[0] = fd;
  83. args[1] = level;
  84. args[2] = optname;
  85. args[3] = (unsigned long) optval;
  86. args[4] = (unsigned long) optlen;
  87. return (socketcall(SYS_GETSOCKOPT, args));
  88. }
  89. #endif
  90. #ifdef L_listen
  91. int listen(int sockfd, int backlog)
  92. {
  93. unsigned long args[2];
  94. args[0] = sockfd;
  95. args[1] = backlog;
  96. return socketcall(SYS_LISTEN, args);
  97. }
  98. #endif
  99. #ifdef L_recv
  100. /* recv, recvfrom added by bir7@leland.stanford.edu */
  101. int __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)
  102. {
  103. unsigned long args[4];
  104. args[0] = sockfd;
  105. args[1] = (unsigned long) buffer;
  106. args[2] = len;
  107. args[3] = flags;
  108. return (socketcall(SYS_RECV, args));
  109. }
  110. weak_alias(__libc_recv, recv);
  111. #endif
  112. #ifdef L_recvfrom
  113. /* recv, recvfrom added by bir7@leland.stanford.edu */
  114. int __libc_recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,
  115. struct sockaddr *to, socklen_t * tolen)
  116. {
  117. unsigned long args[6];
  118. args[0] = sockfd;
  119. args[1] = (unsigned long) buffer;
  120. args[2] = len;
  121. args[3] = flags;
  122. args[4] = (unsigned long) to;
  123. args[5] = (unsigned long) tolen;
  124. return (socketcall(SYS_RECVFROM, args));
  125. }
  126. weak_alias(__libc_recvfrom, recvfrom);
  127. #endif
  128. #ifdef L_recvmsg
  129. int __libc_recvmsg(int sockfd, struct msghdr *msg, int flags)
  130. {
  131. unsigned long args[3];
  132. args[0] = sockfd;
  133. args[1] = (unsigned long) msg;
  134. args[2] = flags;
  135. return (socketcall(SYS_RECVMSG, args));
  136. }
  137. weak_alias(__libc_recvmsg, recvmsg);
  138. #endif
  139. #ifdef L_send
  140. /* send, sendto added by bir7@leland.stanford.edu */
  141. int __libc_send(int sockfd, const void *buffer, size_t len, int flags)
  142. {
  143. unsigned long args[4];
  144. args[0] = sockfd;
  145. args[1] = (unsigned long) buffer;
  146. args[2] = len;
  147. args[3] = flags;
  148. return (socketcall(SYS_SEND, args));
  149. }
  150. weak_alias(__libc_send, send);
  151. #endif
  152. #ifdef L_sendmsg
  153. int __libc_sendmsg(int sockfd, const struct msghdr *msg, int flags)
  154. {
  155. unsigned long args[3];
  156. args[0] = sockfd;
  157. args[1] = (unsigned long) msg;
  158. args[2] = flags;
  159. return (socketcall(SYS_SENDMSG, args));
  160. }
  161. weak_alias(__libc_sendmsg, sendmsg);
  162. #endif
  163. #ifdef L_sendto
  164. /* send, sendto added by bir7@leland.stanford.edu */
  165. int __libc_sendto(int sockfd, const void *buffer, size_t len, int flags,
  166. const struct sockaddr *to, socklen_t tolen)
  167. {
  168. unsigned long args[6];
  169. args[0] = sockfd;
  170. args[1] = (unsigned long) buffer;
  171. args[2] = len;
  172. args[3] = flags;
  173. args[4] = (unsigned long) to;
  174. args[5] = tolen;
  175. return (socketcall(SYS_SENDTO, args));
  176. }
  177. weak_alias(__libc_sendto, sendto);
  178. #endif
  179. #ifdef L_setsockopt
  180. /* [sg]etsockoptions by bir7@leland.stanford.edu */
  181. int setsockopt(int fd, int level, int optname, const void *optval,
  182. socklen_t optlen)
  183. {
  184. unsigned long args[5];
  185. args[0] = fd;
  186. args[1] = level;
  187. args[2] = optname;
  188. args[3] = (unsigned long) optval;
  189. args[4] = optlen;
  190. return (socketcall(SYS_SETSOCKOPT, args));
  191. }
  192. #endif
  193. #ifdef L_shutdown
  194. /* shutdown by bir7@leland.stanford.edu */
  195. int shutdown(int sockfd, int how)
  196. {
  197. unsigned long args[2];
  198. args[0] = sockfd;
  199. args[1] = how;
  200. return (socketcall(SYS_SHUTDOWN, args));
  201. }
  202. #endif
  203. #ifdef L_socket
  204. int socket(int family, int type, int protocol)
  205. {
  206. unsigned long args[3];
  207. args[0] = family;
  208. args[1] = type;
  209. args[2] = (unsigned long) protocol;
  210. return socketcall(SYS_SOCKET, args);
  211. }
  212. #endif
  213. #ifdef L_socketpair
  214. int socketpair(int family, int type, int protocol, int sockvec[2])
  215. {
  216. unsigned long args[4];
  217. args[0] = family;
  218. args[1] = type;
  219. args[2] = protocol;
  220. args[3] = (unsigned long) sockvec;
  221. return socketcall(SYS_SOCKETPAIR, args);
  222. }
  223. #endif