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
accept(int s,struct sockaddr * addr,socklen_t * addrlen)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
bind(int s,const struct sockaddr * name,socklen_t namelen)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
shutdown(int s,int how)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
getpeername(int s,struct sockaddr * name,socklen_t * namelen)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
getsockname(int s,struct sockaddr * name,socklen_t * namelen)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
getsockopt(int s,int level,int optname,void * optval,socklen_t * optlen)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
setsockopt(int s,int level,int optname,const void * optval,socklen_t optlen)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
connect(int s,const struct sockaddr * name,socklen_t namelen)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
listen(int s,int backlog)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
recv(int s,void * mem,size_t len,int flags)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
recvfrom(int s,void * mem,size_t len,int flags,struct sockaddr * from,socklen_t * fromlen)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
send(int s,const void * dataptr,size_t size,int flags)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
sendto(int s,const void * dataptr,size_t size,int flags,const struct sockaddr * to,socklen_t tolen)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
socket(int domain,int type,int protocol)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
closesocket(int s)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
ioctlsocket(int s,long cmd,void * arg)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