1
0

net_sockets.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2015-02-17 Bernard First version
  9. * 2018-05-17 ChenYong Add socket abstraction layer
  10. */
  11. #include <dfs.h>
  12. #include <dfs_file.h>
  13. #include <poll.h>
  14. #include <dfs_net.h>
  15. #include <sys/errno.h>
  16. #include <sys/socket.h>
  17. int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
  18. {
  19. int new_socket = -1;
  20. int socket = dfs_net_getsocket(s);
  21. new_socket = sal_accept(socket, addr, addrlen);
  22. if (new_socket != -1)
  23. {
  24. /* this is a new socket, create it in file system fd */
  25. int fd;
  26. struct dfs_fd *d;
  27. /* allocate a fd */
  28. fd = fd_new();
  29. if (fd < 0)
  30. {
  31. rt_set_errno(-ENOMEM);
  32. sal_closesocket(new_socket);
  33. return -1;
  34. }
  35. d = fd_get(fd);
  36. if(d)
  37. {
  38. /* this is a socket fd */
  39. d->type = FT_SOCKET;
  40. d->path = NULL;
  41. d->fops = dfs_net_get_fops();
  42. d->flags = O_RDWR; /* set flags as read and write */
  43. d->size = 0;
  44. d->pos = 0;
  45. /* set socket to the data of dfs_fd */
  46. d->data = (void *) new_socket;
  47. /* release the ref-count of fd */
  48. fd_put(d);
  49. return fd;
  50. }
  51. rt_set_errno(-ENOMEM);
  52. sal_closesocket(new_socket);
  53. return -1;
  54. }
  55. return -1;
  56. }
  57. RTM_EXPORT(accept);
  58. int bind(int s, const struct sockaddr *name, socklen_t namelen)
  59. {
  60. int socket = dfs_net_getsocket(s);
  61. return sal_bind(socket, name, namelen);
  62. }
  63. RTM_EXPORT(bind);
  64. int shutdown(int s, int how)
  65. {
  66. int error = 0;
  67. int socket = -1;
  68. struct dfs_fd *d;
  69. socket = dfs_net_getsocket(s);
  70. if (socket < 0)
  71. {
  72. rt_set_errno(-ENOTSOCK);
  73. return -1;
  74. }
  75. d = fd_get(s);
  76. if (d == NULL)
  77. {
  78. rt_set_errno(-EBADF);
  79. return -1;
  80. }
  81. if (sal_shutdown(socket, how) == 0)
  82. {
  83. error = 0;
  84. }
  85. else
  86. {
  87. rt_set_errno(-ENOTSOCK);
  88. error = -1;
  89. }
  90. fd_put(d);
  91. return error;
  92. }
  93. RTM_EXPORT(shutdown);
  94. int getpeername(int s, struct sockaddr *name, socklen_t *namelen)
  95. {
  96. int socket = dfs_net_getsocket(s);
  97. return sal_getpeername(socket, name, namelen);
  98. }
  99. RTM_EXPORT(getpeername);
  100. int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
  101. {
  102. int socket = dfs_net_getsocket(s);
  103. return sal_getsockname(socket, name, namelen);
  104. }
  105. RTM_EXPORT(getsockname);
  106. int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
  107. {
  108. int socket = dfs_net_getsocket(s);
  109. return sal_getsockopt(socket, level, optname, optval, optlen);
  110. }
  111. RTM_EXPORT(getsockopt);
  112. int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
  113. {
  114. int socket = dfs_net_getsocket(s);
  115. return sal_setsockopt(socket, level, optname, optval, optlen);
  116. }
  117. RTM_EXPORT(setsockopt);
  118. int connect(int s, const struct sockaddr *name, socklen_t namelen)
  119. {
  120. int socket = dfs_net_getsocket(s);
  121. return sal_connect(socket, name, namelen);
  122. }
  123. RTM_EXPORT(connect);
  124. int listen(int s, int backlog)
  125. {
  126. int socket = dfs_net_getsocket(s);
  127. return sal_listen(socket, backlog);
  128. }
  129. RTM_EXPORT(listen);
  130. int recv(int s, void *mem, size_t len, int flags)
  131. {
  132. int socket = dfs_net_getsocket(s);
  133. return sal_recvfrom(socket, mem, len, flags, NULL, NULL);
  134. }
  135. RTM_EXPORT(recv);
  136. int recvfrom(int s, void *mem, size_t len, int flags,
  137. struct sockaddr *from, socklen_t *fromlen)
  138. {
  139. int socket = dfs_net_getsocket(s);
  140. return sal_recvfrom(socket, mem, len, flags, from, fromlen);
  141. }
  142. RTM_EXPORT(recvfrom);
  143. int send(int s, const void *dataptr, size_t size, int flags)
  144. {
  145. int socket = dfs_net_getsocket(s);
  146. return sal_sendto(socket, dataptr, size, flags, NULL, 0);
  147. }
  148. RTM_EXPORT(send);
  149. int sendto(int s, const void *dataptr, size_t size, int flags,
  150. const struct sockaddr *to, socklen_t tolen)
  151. {
  152. int socket = dfs_net_getsocket(s);
  153. return sal_sendto(socket, dataptr, size, flags, to, tolen);
  154. }
  155. RTM_EXPORT(sendto);
  156. int socket(int domain, int type, int protocol)
  157. {
  158. /* create a BSD socket */
  159. int fd;
  160. int socket;
  161. struct dfs_fd *d;
  162. /* allocate a fd */
  163. fd = fd_new();
  164. if (fd < 0)
  165. {
  166. rt_set_errno(-ENOMEM);
  167. return -1;
  168. }
  169. d = fd_get(fd);
  170. /* create socket and then put it to the dfs_fd */
  171. socket = sal_socket(domain, type, protocol);
  172. if (socket >= 0)
  173. {
  174. /* this is a socket fd */
  175. d->type = FT_SOCKET;
  176. d->path = NULL;
  177. d->fops = dfs_net_get_fops();
  178. d->flags = O_RDWR; /* set flags as read and write */
  179. d->size = 0;
  180. d->pos = 0;
  181. /* set socket to the data of dfs_fd */
  182. d->data = (void *) socket;
  183. }
  184. else
  185. {
  186. /* release fd */
  187. fd_put(d);
  188. fd_put(d);
  189. rt_set_errno(-ENOMEM);
  190. return -1;
  191. }
  192. /* release the ref-count of fd */
  193. fd_put(d);
  194. return fd;
  195. }
  196. RTM_EXPORT(socket);
  197. int closesocket(int s)
  198. {
  199. int error = 0;
  200. int socket = -1;
  201. struct dfs_fd *d;
  202. socket = dfs_net_getsocket(s);
  203. if (socket < 0)
  204. {
  205. rt_set_errno(-ENOTSOCK);
  206. return -1;
  207. }
  208. d = fd_get(s);
  209. if (d == RT_NULL)
  210. {
  211. rt_set_errno(-EBADF);
  212. return -1;
  213. }
  214. if (sal_closesocket(socket) == 0)
  215. {
  216. error = 0;
  217. }
  218. else
  219. {
  220. rt_set_errno(-ENOTSOCK);
  221. error = -1;
  222. }
  223. /* socket has been closed, delete it from file system fd */
  224. fd_put(d);
  225. fd_put(d);
  226. return error;
  227. }
  228. RTM_EXPORT(closesocket);
  229. int ioctlsocket(int s, long cmd, void *arg)
  230. {
  231. int socket = dfs_net_getsocket(s);
  232. return sal_ioctlsocket(socket, cmd, arg);
  233. }
  234. RTM_EXPORT(ioctlsocket);