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