From 188b87f4d8b7be96761b429ea9f093289ba80378 Mon Sep 17 00:00:00 2001 From: RyanCW <75795462+Ryan-CW-Code@users.noreply.github.com> Date: Fri, 6 Sep 2024 05:54:50 +0800 Subject: [PATCH] =?UTF-8?q?[components][at=5Fsocket]=20=E6=B7=BB=E5=8A=A0e?= =?UTF-8?q?rrno=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/at/at_socket/at_socket.c | 75 +++++++++++++++++++++---- 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index 2beed442bb..de8de18c5c 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -463,9 +463,13 @@ int at_socket(int domain, int type, int protocol) enum at_socket_type socket_type; /* check socket family protocol */ - RT_ASSERT(domain == AF_AT || domain == AF_INET); + if(domain != AF_INET && domain != AF_AT) + { + rt_set_errno(EAFNOSUPPORT); + return -1; + } - //TODO check protocol + /*TODO check protocol*/ switch(type) { @@ -479,6 +483,7 @@ int at_socket(int domain, int type, int protocol) default : LOG_E("Don't support socket type (%d)!", type); + rt_set_errno(EPROTOTYPE); return -1; } @@ -486,6 +491,8 @@ int at_socket(int domain, int type, int protocol) sock = alloc_socket(socket_type); if (sock == RT_NULL) { + LOG_E("Failed to allocate socket"); + rt_set_errno(EIO); return -1; } sock->type = socket_type; @@ -558,6 +565,7 @@ int at_closesocket(int socket) sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -571,6 +579,7 @@ int at_closesocket(int socket) if (sock->ops->at_closesocket(sock) != 0) { free_socket(sock); + rt_set_errno(EIO); return -1; } } @@ -587,6 +596,7 @@ int at_shutdown(int socket, int how) sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -600,6 +610,7 @@ int at_shutdown(int socket, int how) if (sock->ops->at_closesocket(sock) != 0) { free_socket(sock); + rt_set_errno(EIO); return -1; } } @@ -654,9 +665,16 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen) ip_addr_t input_ipaddr, local_ipaddr; uint16_t port = 0; + if (name == NULL || namelen == 0) + { + rt_set_errno(EINVAL); + return -1; + } + sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -677,6 +695,7 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen) /* close old socket */ if (at_closesocket(socket) < 0) { + rt_set_errno(EIO); return -1; } @@ -684,6 +703,7 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen) new_device = at_device_get_by_ipaddr(&input_ipaddr); if (new_device == RT_NULL) { + rt_set_errno(EHOSTUNREACH); return -1; } @@ -691,6 +711,7 @@ int at_bind(int socket, const struct sockaddr *name, socklen_t namelen) new_sock = alloc_socket_by_device(new_device, type); if (new_sock == RT_NULL) { + rt_set_errno(EIO); return -1; } new_sock->type = type; @@ -836,18 +857,21 @@ int at_listen(int socket, int backlog) sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } if (sock->state != AT_SOCKET_OPEN) { LOG_E("Socket(%d) connect state is %d.", sock->socket, sock->state); + rt_set_errno(ENETUNREACH); result = -1; goto __exit; } if (sock->ops->at_listen(sock, backlog) < 0) { + rt_set_errno(EIO); result = -1; goto __exit; } @@ -856,7 +880,6 @@ int at_listen(int socket, int backlog) sock->state = AT_SOCKET_LISTEN; __exit: - if (result < 0) { at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); @@ -874,15 +897,23 @@ int at_connect(int socket, const struct sockaddr *name, socklen_t namelen) char ipstr[16] = { 0 }; int result = 0; + if (name == RT_NULL || namelen == 0) + { + rt_set_errno(EINVAL); + return -1; + } + sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } if (sock->state != AT_SOCKET_OPEN) { LOG_E("Socket(%d) connect state is %d.", sock->socket, sock->state); + rt_set_errno(EPERM); result = -1; goto __exit; } @@ -893,6 +924,7 @@ int at_connect(int socket, const struct sockaddr *name, socklen_t namelen) if (sock->ops->at_connect(sock, ipstr, remote_port, sock->type, RT_TRUE) < 0) { + rt_set_errno(EIO); result = -1; goto __exit; } @@ -900,7 +932,6 @@ int at_connect(int socket, const struct sockaddr *name, socklen_t namelen) sock->state = AT_SOCKET_CONNECT; __exit: - if (result < 0) { at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); @@ -927,20 +958,22 @@ int at_accept(int socket, struct sockaddr *name, socklen_t *namelen) sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } if (sock->state != AT_SOCKET_LISTEN) { LOG_E("Socket(%d) connect state is %d.", sock->socket, sock->state); + rt_set_errno(EIO); result = -1; goto __exit; } /* wait the receive semaphore, waiting for info */ - if (rt_sem_take(sock->recv_notice, RT_WAITING_FOREVER) < 0) + if (rt_sem_take(sock->recv_notice, RT_WAITING_FOREVER) != RT_EOK) { - errno = EAGAIN; + rt_set_errno(EAGAIN); result = -1; goto __exit; } @@ -978,12 +1011,14 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f if (mem == RT_NULL || len == 0) { /* if the requested number of bytes to receive from a stream socket was 0. */ - return 0; + rt_set_errno(EFAULT); + return -1; } sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -1000,8 +1035,9 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f if (sock->ops->at_connect(sock, ipstr, remote_port, sock->type, RT_TRUE) < 0) { at_do_event_changes(sock, AT_EVENT_ERROR, RT_TRUE); + rt_set_errno(EIO); /* socket shutdown */ - return 0; + return -1; } sock->state = AT_SOCKET_CONNECT; } @@ -1026,14 +1062,13 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f { at_do_event_clean(sock, AT_EVENT_RECV); } - errno = 0; result = recv_len; break; } if (flags & MSG_DONTWAIT) { - errno = EAGAIN; + rt_set_errno(EAGAIN); result = -1; break; } @@ -1050,7 +1085,7 @@ int at_recvfrom(int socket, void *mem, size_t len, int flags, struct sockaddr *f if (rt_sem_take(sock->recv_notice, timeout) != RT_EOK) { LOG_D("AT socket (%d) receive timeout (%d)!", socket, timeout); - errno = EAGAIN; + rt_set_errno(EAGAIN); result = -1; break; } @@ -1077,12 +1112,14 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct if (data == RT_NULL || size == 0) { LOG_E("AT sendto input data or size error!"); + rt_set_errno(EFAULT); return -1; } sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -1091,18 +1128,21 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct case AT_SOCKET_TCP: if (sock->state == AT_SOCKET_CLOSED) { + /* socket passively closed, transmit function return 0 */ result = 0; goto __exit; } else if (sock->state != AT_SOCKET_CONNECT && sock->state != AT_SOCKET_OPEN) { LOG_E("send data error, current socket (%d) state (%d) is error.", socket, sock->state); + rt_set_errno(ENETUNREACH); result = -1; goto __exit; } if ((len = sock->ops->at_send(sock, (const char *) data, size, sock->type)) < 0) { + rt_set_errno(EIO); result = -1; goto __exit; } @@ -1120,6 +1160,7 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct if (sock->ops->at_connect(sock, ipstr, remote_port, sock->type, RT_TRUE) < 0) { + rt_set_errno(EIO); result = -1; goto __exit; } @@ -1128,6 +1169,7 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct if ((len = sock->ops->at_send(sock, (char *) data, size, sock->type)) < 0) { + rt_set_errno(EIO); result = -1; goto __exit; } @@ -1135,6 +1177,7 @@ int at_sendto(int socket, const void *data, size_t size, int flags, const struct default: LOG_E("Socket (%d) type %d is not support.", socket, sock->type); + rt_set_errno(EPERM); result = -1; goto __exit; } @@ -1166,12 +1209,14 @@ int at_getsockopt(int socket, int level, int optname, void *optval, socklen_t *o if (optval == RT_NULL || optlen == RT_NULL) { LOG_E("AT getsocketopt input option value or option length error!"); + rt_set_errno(EFAULT); return -1; } sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -1194,12 +1239,14 @@ int at_getsockopt(int socket, int level, int optname, void *optval, socklen_t *o default: LOG_E("AT socket (%d) not support option name : %d.", socket, optname); + rt_set_errno(EPERM); return -1; } break; default: LOG_E("AT socket (%d) not support option level : %d.", socket, level); + rt_set_errno(EPERM); return -1; } @@ -1213,12 +1260,14 @@ int at_setsockopt(int socket, int level, int optname, const void *optval, sockle if (optval == RT_NULL) { LOG_E("AT setsockopt input option value error!"); + rt_set_errno(EFAULT); return -1; } sock = at_get_socket(socket); if (sock == RT_NULL) { + rt_set_errno(ENXIO); return -1; } @@ -1239,6 +1288,7 @@ int at_setsockopt(int socket, int level, int optname, const void *optval, sockle default: LOG_E("AT socket (%d) not support option name : %d.", socket, optname); + rt_set_errno(EPERM); return -1; } break; @@ -1251,6 +1301,7 @@ int at_setsockopt(int socket, int level, int optname, const void *optval, sockle break; default: LOG_E("AT socket (%d) not support option level : %d.", socket, level); + rt_set_errno(EPERM); return -1; }