| 738 | |
| 739 | #ifdef AT_USING_SOCKET_SERVER |
| 740 | static void at_connect_notice_cb(struct at_socket *sock, at_socket_evt_t event, const char *buff, size_t bfsz) |
| 741 | { |
| 742 | RT_ASSERT(buff); |
| 743 | RT_ASSERT(sock == RT_NULL); |
| 744 | RT_ASSERT(event == AT_SOCKET_EVT_CONNECTED); |
| 745 | |
| 746 | int new_socket; |
| 747 | struct at_socket *new_sock = RT_NULL; |
| 748 | rt_base_t level; |
| 749 | rt_slist_t *node = RT_NULL; |
| 750 | struct at_socket *at_sock = RT_NULL; |
| 751 | char *socket_info = RT_NULL; |
| 752 | int base_socket = 0; |
| 753 | |
| 754 | /* avoid use bottom driver to alloc "socket" */ |
| 755 | new_socket = at_socket(AF_AT, SOCK_STREAM, 0); |
| 756 | if (new_socket == -1) |
| 757 | { |
| 758 | return; |
| 759 | } |
| 760 | new_sock = at_get_socket(new_socket); |
| 761 | new_sock->state = AT_SOCKET_CONNECT; |
| 762 | rt_sscanf(buff, "SOCKET:%d", &base_socket); |
| 763 | LOG_D("ACCEPT BASE SOCKET: %d", base_socket); |
| 764 | new_sock->user_data = (void *)base_socket; |
| 765 | |
| 766 | /* find out the listen socket */ |
| 767 | level = rt_hw_interrupt_disable(); |
| 768 | rt_slist_for_each(node, &_socket_list) |
| 769 | { |
| 770 | at_sock = rt_slist_entry(node, struct at_socket, list); |
| 771 | if (at_sock && at_sock->magic == AT_SOCKET_MAGIC && at_sock->listen.is_listen == RT_TRUE) |
| 772 | { |
| 773 | break; |
| 774 | } |
| 775 | at_sock = RT_NULL; |
| 776 | } |
| 777 | rt_hw_interrupt_enable(level); |
| 778 | |
| 779 | if (at_sock == RT_NULL) |
| 780 | { |
| 781 | at_closesocket(new_socket); |
| 782 | return; |
| 783 | } |
| 784 | |
| 785 | /* put incoming "socket" to the listen socket receiver packet list */ |
| 786 | socket_info = rt_malloc(AT_SOCKET_INFO_LEN); |
| 787 | rt_memset(socket_info, 0, AT_SOCKET_INFO_LEN); |
| 788 | rt_sprintf(socket_info, "SOCKET:%d", new_sock->socket); |
| 789 | |
| 790 | /* wakeup the "accept" function */ |
| 791 | rt_mutex_take(at_sock->recv_lock, RT_WAITING_FOREVER); |
| 792 | if (at_recvpkt_put(&(at_sock->recvpkt_list), socket_info, AT_SOCKET_INFO_LEN) != RT_EOK) |
| 793 | { |
| 794 | at_closesocket(new_socket); |
| 795 | rt_free(socket_info); |
| 796 | rt_mutex_release(at_sock->recv_lock); |
| 797 | return; |
nothing calls this directly
no test coverage detected