Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.17 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
  3.  *
  4.  * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  5.  */
  6.  
  7. #define __FORCE_GLIBC
  8. #include <features.h>
  9. #include <errno.h>
  10. #include <syscall.h>
  11. #include <sys/socket.h>
  12.  
  13. #ifdef __NR_socketcall
  14. extern int __socketcall(int call, unsigned long *args) attribute_hidden;
  15.  
  16. /* Various socketcall numbers */
  17. #define SYS_SOCKET      1
  18. #define SYS_BIND        2
  19. #define SYS_CONNECT     3
  20. #define SYS_LISTEN      4
  21. #define SYS_ACCEPT      5
  22. #define SYS_GETSOCKNAME 6
  23. #define SYS_GETPEERNAME 7
  24. #define SYS_SOCKETPAIR  8
  25. #define SYS_SEND        9
  26. #define SYS_RECV        10
  27. #define SYS_SENDTO      11
  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
  34. #endif
  35.  
  36.  
  37. #ifdef L_accept
  38. extern __typeof(accept) __libc_accept;
  39. #ifdef __NR_accept
  40. #define __NR___libc_accept  __NR_accept
  41. _syscall3(int, __libc_accept, int, call, struct sockaddr *, addr, socklen_t *,addrlen);
  42. #elif defined(__NR_socketcall)
  43. int __libc_accept(int s, struct sockaddr *addr, socklen_t * addrlen)
  44. {
  45.     unsigned long args[3];
  46.  
  47.     args[0] = s;
  48.     args[1] = (unsigned long) addr;
  49.     args[2] = (unsigned long) addrlen;
  50.     return __socketcall(SYS_ACCEPT, args);
  51. }
  52. #endif
  53. libc_hidden_proto(accept)
  54. weak_alias(__libc_accept,accept)
  55. libc_hidden_weak(accept)
  56. #endif
  57.  
  58. #ifdef L_bind
  59. libc_hidden_proto(bind)
  60. #ifdef __NR_bind
  61. _syscall3(int, bind, int, sockfd, const struct sockaddr *, myaddr, socklen_t, addrlen);
  62. #elif defined(__NR_socketcall)
  63. int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
  64. {
  65.     unsigned long args[3];
  66.  
  67.     args[0] = sockfd;
  68.     args[1] = (unsigned long) myaddr;
  69.     args[2] = addrlen;
  70.     return __socketcall(SYS_BIND, args);
  71. }
  72. #endif
  73. libc_hidden_def(bind)
  74. #endif
  75.  
  76. #ifdef L_connect
  77. extern __typeof(connect) __libc_connect;
  78. #ifdef __NR_connect
  79. #define __NR___libc_connect __NR_connect
  80. _syscall3(int, __libc_connect, int, sockfd, const struct sockaddr *, saddr, socklen_t, addrlen);
  81. #elif defined(__NR_socketcall)
  82. int __libc_connect(int sockfd, const struct sockaddr *saddr, socklen_t addrlen)
  83. {
  84.     unsigned long args[3];
  85.  
  86.     args[0] = sockfd;
  87.     args[1] = (unsigned long) saddr;
  88.     args[2] = addrlen;
  89.     return __socketcall(SYS_CONNECT, args);
  90. }
  91. #endif
  92. libc_hidden_proto(connect)
  93. weak_alias(__libc_connect,connect)
  94. libc_hidden_weak(connect)
  95. #endif
  96.  
  97. #ifdef L_getpeername
  98. #ifdef __NR_getpeername
  99. _syscall3(int, getpeername, int, sockfd, struct sockaddr *, addr, socklen_t *,paddrlen);
  100. #elif defined(__NR_socketcall)
  101. int getpeername(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
  102. {
  103.     unsigned long args[3];
  104.  
  105.     args[0] = sockfd;
  106.     args[1] = (unsigned long) addr;
  107.     args[2] = (unsigned long) paddrlen;
  108.     return __socketcall(SYS_GETPEERNAME, args);
  109. }
  110. #endif
  111. #endif
  112.  
  113. #ifdef L_getsockname
  114. libc_hidden_proto(getsockname)
  115. #ifdef __NR_getsockname
  116. _syscall3(int, getsockname, int, sockfd, struct sockaddr *, addr, socklen_t *,paddrlen);
  117. #elif defined(__NR_socketcall)
  118. int getsockname(int sockfd, struct sockaddr *addr, socklen_t * paddrlen)
  119. {
  120.     unsigned long args[3];
  121.  
  122.     args[0] = sockfd;
  123.     args[1] = (unsigned long) addr;
  124.     args[2] = (unsigned long) paddrlen;
  125.     return __socketcall(SYS_GETSOCKNAME, args);
  126. }
  127. #endif
  128. libc_hidden_def(getsockname)
  129. #endif
  130.  
  131. #ifdef L_getsockopt
  132. #ifdef __NR_getsockopt
  133. _syscall5(int, getsockopt, int, fd, int, level, int, optname, __ptr_t, optval, socklen_t *, optlen);
  134. #elif defined(__NR_socketcall)
  135. int getsockopt(int fd, int level, int optname, __ptr_t optval,
  136.            socklen_t * optlen)
  137. {
  138.     unsigned long args[5];
  139.  
  140.     args[0] = fd;
  141.     args[1] = level;
  142.     args[2] = optname;
  143.     args[3] = (unsigned long) optval;
  144.     args[4] = (unsigned long) optlen;
  145.     return (__socketcall(SYS_GETSOCKOPT, args));
  146. }
  147. #endif
  148. #endif
  149.  
  150. #ifdef L_listen
  151. libc_hidden_proto(listen)
  152. #ifdef __NR_listen
  153. _syscall2(int, listen, int, sockfd, int, backlog);
  154. #elif defined(__NR_socketcall)
  155. int listen(int sockfd, int backlog)
  156. {
  157.     unsigned long args[2];
  158.  
  159.     args[0] = sockfd;
  160.     args[1] = backlog;
  161.     return __socketcall(SYS_LISTEN, args);
  162. }
  163. #endif
  164. libc_hidden_def(listen)
  165. #endif
  166.  
  167. #ifdef L_recv
  168. extern __typeof(recv) __libc_recv;
  169. #ifdef __NR_recv
  170. #define __NR___libc_recv __NR_recv
  171. _syscall4(ssize_t, __libc_recv, int, sockfd, __ptr_t, buffer, size_t, len, int, flags);
  172. #elif defined(__NR_socketcall)
  173. /* recv, recvfrom added by bir7@leland.stanford.edu */
  174. ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)
  175. {
  176.     unsigned long args[4];
  177.  
  178.     args[0] = sockfd;
  179.     args[1] = (unsigned long) buffer;
  180.     args[2] = len;
  181.     args[3] = flags;
  182.     return (__socketcall(SYS_RECV, args));
  183. }
  184. #elif defined(__NR_recvfrom)
  185. libc_hidden_proto(recvfrom)
  186. ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)
  187. {
  188.     return (recvfrom(sockfd, buffer, len, flags, NULL, NULL));
  189. }
  190. #endif
  191. libc_hidden_proto(recv)
  192. weak_alias(__libc_recv,recv)
  193. libc_hidden_weak(recv)
  194. #endif
  195.  
  196. #ifdef L_recvfrom
  197. extern __typeof(recvfrom) __libc_recvfrom;
  198. #ifdef __NR_recvfrom
  199. #define __NR___libc_recvfrom __NR_recvfrom
  200. _syscall6(ssize_t, __libc_recvfrom, int, sockfd, __ptr_t, buffer, size_t, len, int, flags,
  201.     struct sockaddr *, to, socklen_t *, tolen);
  202. #elif defined(__NR_socketcall)
  203. /* recv, recvfrom added by bir7@leland.stanford.edu */
  204. ssize_t __libc_recvfrom(int sockfd, __ptr_t buffer, size_t len, int flags,
  205.          struct sockaddr *to, socklen_t * tolen)
  206. {
  207.     unsigned long args[6];
  208.  
  209.     args[0] = sockfd;
  210.     args[1] = (unsigned long) buffer;
  211.     args[2] = len;
  212.     args[3] = flags;
  213.     args[4] = (unsigned long) to;
  214.     args[5] = (unsigned long) tolen;
  215.     return (__socketcall(SYS_RECVFROM, args));
  216. }
  217. #endif
  218. libc_hidden_proto(recvfrom)
  219. weak_alias(__libc_recvfrom,recvfrom)
  220. libc_hidden_weak(recvfrom)
  221. #endif
  222.  
  223. #ifdef L_recvmsg
  224. extern __typeof(recvmsg) __libc_recvmsg;
  225. #ifdef __NR_recvmsg
  226. #define __NR___libc_recvmsg __NR_recvmsg
  227. _syscall3(ssize_t, __libc_recvmsg, int, sockfd, struct msghdr *, msg, int, flags);
  228. #elif defined(__NR_socketcall)
  229. ssize_t __libc_recvmsg(int sockfd, struct msghdr *msg, int flags)
  230. {
  231.     unsigned long args[3];
  232.  
  233.     args[0] = sockfd;
  234.     args[1] = (unsigned long) msg;
  235.     args[2] = flags;
  236.     return (__socketcall(SYS_RECVMSG, args));
  237. }
  238. #endif
  239. libc_hidden_proto(recvmsg)
  240. weak_alias(__libc_recvmsg,recvmsg)
  241. libc_hidden_weak(recvmsg)
  242. #endif
  243.  
  244. #ifdef L_send
  245. extern __typeof(send) __libc_send;
  246. #ifdef __NR_send
  247. #define __NR___libc_send    __NR_send
  248. _syscall4(ssize_t, __libc_send, int, sockfd, const void *, buffer, size_t, len, int, flags);
  249. #elif defined(__NR_socketcall)
  250. /* send, sendto added by bir7@leland.stanford.edu */
  251. ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)
  252. {
  253.     unsigned long args[4];
  254.  
  255.     args[0] = sockfd;
  256.     args[1] = (unsigned long) buffer;
  257.     args[2] = len;
  258.     args[3] = flags;
  259.     return (__socketcall(SYS_SEND, args));
  260. }
  261. #elif defined(__NR_sendto)
  262. libc_hidden_proto(sendto)
  263. ssize_t __libc_send(int sockfd, const void *buffer, size_t len, int flags)
  264. {
  265.     return (sendto(sockfd, buffer, len, flags, NULL, 0));
  266. }
  267. #endif
  268. libc_hidden_proto(send)
  269. weak_alias(__libc_send,send)
  270. libc_hidden_weak(send)
  271. #endif
  272.  
  273. #ifdef L_sendmsg
  274. extern __typeof(sendmsg) __libc_sendmsg;
  275. #ifdef __NR_sendmsg
  276. #define __NR___libc_sendmsg __NR_sendmsg
  277. _syscall3(ssize_t, __libc_sendmsg, int, sockfd, const struct msghdr *, msg, int, flags);
  278. #elif defined(__NR_socketcall)
  279. ssize_t __libc_sendmsg(int sockfd, const struct msghdr *msg, int flags)
  280. {
  281.     unsigned long args[3];
  282.  
  283.     args[0] = sockfd;
  284.     args[1] = (unsigned long) msg;
  285.     args[2] = flags;
  286.     return (__socketcall(SYS_SENDMSG, args));
  287. }
  288. #endif
  289. libc_hidden_proto(sendmsg)
  290. weak_alias(__libc_sendmsg,sendmsg)
  291. libc_hidden_weak(sendmsg)
  292. #endif
  293.  
  294. #ifdef L_sendto
  295. extern __typeof(sendto) __libc_sendto;
  296. #ifdef __NR_sendto
  297. #define __NR___libc_sendto  __NR_sendto
  298. _syscall6(ssize_t, __libc_sendto, int, sockfd, const void *, buffer, size_t, len,
  299.     int, flags, const struct sockaddr *, to, socklen_t, tolen);
  300. #elif defined(__NR_socketcall)
  301. /* send, sendto added by bir7@leland.stanford.edu */
  302. ssize_t __libc_sendto(int sockfd, const void *buffer, size_t len, int flags,
  303.        const struct sockaddr *to, socklen_t tolen)
  304. {
  305.     unsigned long args[6];
  306.  
  307.     args[0] = sockfd;
  308.     args[1] = (unsigned long) buffer;
  309.     args[2] = len;
  310.     args[3] = flags;
  311.     args[4] = (unsigned long) to;
  312.     args[5] = tolen;
  313.     return (__socketcall(SYS_SENDTO, args));
  314. }
  315. #endif
  316. libc_hidden_proto(sendto)
  317. weak_alias(__libc_sendto,sendto)
  318. libc_hidden_weak(sendto)
  319. #endif
  320.  
  321. #ifdef L_setsockopt
  322. libc_hidden_proto(setsockopt)
  323. #ifdef __NR_setsockopt
  324. _syscall5(int, setsockopt, int, fd, int, level, int, optname, const void *, optval, socklen_t, optlen);
  325. #elif defined(__NR_socketcall)
  326. /* [sg]etsockoptions by bir7@leland.stanford.edu */
  327. int setsockopt(int fd, int level, int optname, const void *optval,
  328.            socklen_t optlen)
  329. {
  330.     unsigned long args[5];
  331.  
  332.     args[0] = fd;
  333.     args[1] = level;
  334.     args[2] = optname;
  335.     args[3] = (unsigned long) optval;
  336.     args[4] = optlen;
  337.     return (__socketcall(SYS_SETSOCKOPT, args));
  338. }
  339. #endif
  340. libc_hidden_def(setsockopt)
  341. #endif
  342.  
  343. #ifdef L_shutdown
  344. #ifdef __NR_shutdown
  345. _syscall2(int, shutdown, int, sockfd, int, how);
  346. #elif defined(__NR_socketcall)
  347. /* shutdown by bir7@leland.stanford.edu */
  348. int shutdown(int sockfd, int how)
  349. {
  350.     unsigned long args[2];
  351.  
  352.     args[0] = sockfd;
  353.     args[1] = how;
  354.     return (__socketcall(SYS_SHUTDOWN, args));
  355. }
  356. #endif
  357. #endif
  358.  
  359. #ifdef L_socket
  360. libc_hidden_proto(socket)
  361. #ifdef __NR_socket
  362. _syscall3(int, socket, int, family, int, type, int, protocol);
  363. #elif defined(__NR_socketcall)
  364. int socket(int family, int type, int protocol)
  365. {
  366.     unsigned long args[3];
  367.  
  368.     args[0] = family;
  369.     args[1] = type;
  370.     args[2] = (unsigned long) protocol;
  371.     return __socketcall(SYS_SOCKET, args);
  372. }
  373. #endif
  374. libc_hidden_def(socket)
  375. #endif
  376.  
  377. #ifdef L_socketpair
  378. #ifdef __NR_socketpair
  379. _syscall4(int, socketpair, int, family, int, type, int, protocol, int *, sockvec);
  380. #elif defined(__NR_socketcall)
  381. int socketpair(int family, int type, int protocol, int sockvec[2])
  382. {
  383.     unsigned long args[4];
  384.  
  385.     args[0] = family;
  386.     args[1] = type;
  387.     args[2] = protocol;
  388.     args[3] = (unsigned long) sockvec;
  389.     return __socketcall(SYS_SOCKETPAIR, args);
  390. }
  391. #endif
  392. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement