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