xref: /nrf52832-nimble/rt-thread/components/net/sal_socket/socket/net_sockets.c (revision 104654410c56c573564690304ae786df310c91fc)
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