net_sockets.c 5.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * File      : lwip_sockets.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2015, RT-Thread Development Team
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Change Logs:
 * Date           Author       Notes
 * 2015-02-17     Bernard      First version
 */

#include <dfs.h>
#include <dfs_def.h>
27 28
#include <dfs_posix.h>

29 30
#include <sys/socket.h>

31
#include "dfs_net.h"
32 33 34

int accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
35
    int new_client = -1;
36
    int sock = dfs_net_getsocket(s);
37

38
    new_client = lwip_accept(sock, addr, addrlen);
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
    if (new_client != -1)
    {
        /* this is a new socket, create it in file system fd */
        int fd;
        struct dfs_fd *d;

        /* allocate a fd */
        fd = fd_new();
        if (fd < 0)
        {
            rt_set_errno(-DFS_STATUS_ENOMEM);
            lwip_close(sock);

            rt_kprintf("no fd yet!\n");
            return -1;
        }
        d = fd_get(fd);

        /* this is a socket fd */
        d->type = FT_SOCKET;
        d->path = RT_NULL;

61
        d->fs = dfs_net_get_fs();
62 63 64 65 66 67 68 69 70 71 72

        d->flags = DFS_O_RDWR; /* set flags as read and write */
        d->size = 0;
        d->pos  = 0;

        /* set socket to the data of dfs_fd */
        d->data = (void *) new_client;

        /* release the ref-count of fd */
        fd_put(d);

73
        return fd;
74
    }
75

76
    return new_client;
77
}
78
RTM_EXPORT(accept);
79 80 81

int bind(int s, const struct sockaddr *name, socklen_t namelen)
{
82
    int sock = dfs_net_getsocket(s);
83

84 85
    return lwip_bind(sock, name, namelen);
}
86
RTM_EXPORT(bind);
87 88 89

int shutdown(int s, int how)
{
90
    int sock;
91
    struct dfs_fd *d;
92

93 94 95 96
    d = fd_get(s);
    if (d == RT_NULL)
    {
        rt_set_errno(-DFS_STATUS_EBADF);
97

98 99 100
        return -1;
    }

101
    sock = dfs_net_getsocket(s);
102 103
    if (lwip_shutdown(sock, how) == 0)
    {
104 105 106 107 108
        /* socket has been closed, delete it from file system fd */
        fd_put(d);
        fd_put(d);

        return 0;
109
    }
110

111
    return -1;
112
}
113
RTM_EXPORT(shutdown);
114

115
int getpeername(int s, struct sockaddr *name, socklen_t *namelen)
116
{
117
    int sock = dfs_net_getsocket(s);
118 119 120

    return lwip_getpeername(sock, name, namelen);
}
121
RTM_EXPORT(getpeername);
122

123
int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
124
{
125
    int sock = dfs_net_getsocket(s);
126

127 128
    return lwip_getsockname(sock, name, namelen);
}
129
RTM_EXPORT(getsockname);
130

131
int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)
132
{
133
    int sock = dfs_net_getsocket(s);
134

135 136
    return lwip_getsockopt(sock, level, optname, optval, optlen);
}
137
RTM_EXPORT(getsockopt);
138

139
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)
140
{
141
    int sock = dfs_net_getsocket(s);
142

143 144
    return lwip_setsockopt(sock, level, optname, optval, optlen);
}
145
RTM_EXPORT(setsockopt);
146 147 148

int connect(int s, const struct sockaddr *name, socklen_t namelen)
{
149
    int sock = dfs_net_getsocket(s);
150

151 152
    return lwip_connect(sock, name, namelen);
}
153
RTM_EXPORT(connect);
154 155 156

int listen(int s, int backlog)
{
157
    int sock = dfs_net_getsocket(s);
158

159 160
    return lwip_listen(sock, backlog);
}
161
RTM_EXPORT(listen);
162 163 164

int recv(int s, void *mem, size_t len, int flags)
{
165
    int sock = dfs_net_getsocket(s);
166

167 168
    return lwip_recv(sock, mem, len, flags);
}
169
RTM_EXPORT(recv);
170 171

int recvfrom(int s, void *mem, size_t len, int flags,
172
             struct sockaddr *from, socklen_t *fromlen)
173
{
174
    int sock = dfs_net_getsocket(s);
175

176 177
    return lwip_recvfrom(sock, mem, len, flags, from, fromlen);
}
178
RTM_EXPORT(recvfrom);
179 180 181

int send(int s, const void *dataptr, size_t size, int flags)
{
182
    int sock = dfs_net_getsocket(s);
183

184 185
    return lwip_send(sock, dataptr, size, flags);
}
186
RTM_EXPORT(send);
187 188

int sendto(int s, const void *dataptr, size_t size, int flags,
189
           const struct sockaddr *to, socklen_t tolen)
190
{
191
    int sock = dfs_net_getsocket(s);
192

193 194
    return lwip_sendto(sock, dataptr, size, flags, to, tolen);
}
195
RTM_EXPORT(sendto);
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221

int socket(int domain, int type, int protocol)
{
    /* create a BSD socket */
    int fd;
    int sock;
    struct dfs_fd *d;

    /* allocate a fd */
    fd = fd_new();
    if (fd < 0)
    {
        rt_set_errno(-DFS_STATUS_ENOMEM);

        return -1;
    }
    d = fd_get(fd);

    /* create socket in lwip and then put it to the dfs_fd */
    sock = lwip_socket(domain, type, protocol);
    if (sock > 0)
    {
        /* this is a socket fd */
        d->type = FT_SOCKET;
        d->path = RT_NULL;

222
        d->fs = dfs_net_get_fs();
223

224 225 226
        d->flags = DFS_O_RDWR; /* set flags as read and write */
        d->size = 0;
        d->pos  = 0;
227

228
        /* set socket to the data of dfs_fd */
229
        d->data = (void *) sock;
230 231 232 233 234 235 236
    }

    /* release the ref-count of fd */
    fd_put(d);

    return fd;
}
237
RTM_EXPORT(socket);