| 824 | } |
| 825 | |
| 826 | static int rpmsg_socket_accept(FAR struct socket *psock, |
| 827 | FAR struct sockaddr *addr, |
| 828 | FAR socklen_t *addrlen, |
| 829 | FAR struct socket *newsock, |
| 830 | int flags) |
| 831 | { |
| 832 | FAR struct rpmsg_socket_conn_s *server = psock->s_conn; |
| 833 | int ret = 0; |
| 834 | |
| 835 | if (!_SS_ISLISTENING(server->sconn.s_flags)) |
| 836 | { |
| 837 | return -EINVAL; |
| 838 | } |
| 839 | |
| 840 | while (1) |
| 841 | { |
| 842 | FAR struct rpmsg_socket_conn_s *conn = NULL; |
| 843 | |
| 844 | nxmutex_lock(&server->recvlock); |
| 845 | |
| 846 | if (server->next) |
| 847 | { |
| 848 | conn = server->next; |
| 849 | server->next = conn->next; |
| 850 | conn->next = NULL; |
| 851 | } |
| 852 | |
| 853 | nxmutex_unlock(&server->recvlock); |
| 854 | |
| 855 | if (conn) |
| 856 | { |
| 857 | if (conn->sendsize == 0) |
| 858 | { |
| 859 | net_sem_wait(&conn->sendsem); |
| 860 | } |
| 861 | |
| 862 | newsock->s_domain = psock->s_domain; |
| 863 | newsock->s_sockif = psock->s_sockif; |
| 864 | newsock->s_type = SOCK_STREAM; |
| 865 | newsock->s_conn = conn; |
| 866 | |
| 867 | rpmsg_socket_getaddr(conn, addr, addrlen); |
| 868 | break; |
| 869 | } |
| 870 | else |
| 871 | { |
| 872 | if (_SS_ISNONBLOCK(server->sconn.s_flags)) |
| 873 | { |
| 874 | ret = -EAGAIN; |
| 875 | break; |
| 876 | } |
| 877 | else |
| 878 | { |
| 879 | ret = net_sem_wait(&server->recvsem); |
| 880 | if (ret < 0) |
| 881 | { |
| 882 | break; |
| 883 | } |
nothing calls this directly
no test coverage detected