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