diff --git a/components/net/sal_socket/socket/net_sockets.c b/components/net/sal_socket/socket/net_sockets.c index 232b87ba1e881240e854f29d32fe9b233e5ea447..12024c8173c3bd4e2caecfe1923c5afba9c14df4 100644 --- a/components/net/sal_socket/socket/net_sockets.c +++ b/components/net/sal_socket/socket/net_sockets.c @@ -78,29 +78,39 @@ RTM_EXPORT(bind); int shutdown(int s, int how) { - int socket; + int error = 0; + int socket = -1; struct dfs_fd *d; + socket = dfs_net_getsocket(s); + if (socket < 0) + { + rt_set_errno(-ENOTSOCK); + return -1; + } + d = fd_get(s); if (d == NULL) { rt_set_errno(-EBADF); - return -1; } - - socket = dfs_net_getsocket(s); + if (sal_shutdown(socket, how) == 0) { - /* socket has been closed, delete it from file system fd */ - fd_put(d); - fd_put(d); - - return 0; + error = 0; + } + else + { + rt_set_errno(-ENOTSOCK); + error = -1; } - return -1; + /* socket has been closed, delete it from file system fd */ + fd_put(d); + fd_put(d); + return error; } RTM_EXPORT(shutdown); @@ -228,7 +238,7 @@ int socket(int domain, int type, int protocol) rt_set_errno(-ENOMEM); - return -1; + return -1; } /* release the ref-count of fd */ @@ -240,25 +250,39 @@ RTM_EXPORT(socket); int closesocket(int s) { - int socket = dfs_net_getsocket(s); + int error = 0; + int socket = -1; struct dfs_fd *d; + socket = dfs_net_getsocket(s); + if (socket < 0) + { + rt_set_errno(-ENOTSOCK); + return -1; + } + d = fd_get(s); - if(!d) + if (d == RT_NULL) { + rt_set_errno(-EBADF); return -1; } if (sal_closesocket(socket) == 0) { - /* socket has been closed, delete it from file system fd */ - fd_put(d); - fd_put(d); - - return 0; + error = 0; + } + else + { + rt_set_errno(-ENOTSOCK); + error = -1; } - return -1; + /* socket has been closed, delete it from file system fd */ + fd_put(d); + fd_put(d); + + return error; } RTM_EXPORT(closesocket);