static void CAFindReadyMessage() { fd_set readFds; struct timeval timeout = { .tv_sec = caglobals.tcp.selectTimeout }; FD_ZERO(&readFds); if (-1 != g_acceptServerFD) { FD_SET(g_acceptServerFD, &readFds); } if (-1 != caglobals.tcp.shutdownFds[0]) { FD_SET(caglobals.tcp.shutdownFds[0], &readFds); } if (-1 != caglobals.tcp.connectionFds[0]) { FD_SET(caglobals.tcp.connectionFds[0], &readFds); } uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && 0 <= svritem->fd) { FD_SET(svritem->fd, &readFds); } } int ret = select(caglobals.tcp.maxfd + 1, &readFds, NULL, NULL, &timeout); if (caglobals.tcp.terminate) { OIC_LOG_V(DEBUG, TAG, "Packet receiver Stop request received."); return; } if (0 >= ret) { if (0 > ret) { OIC_LOG_V(FATAL, TAG, "select error %s", strerror(errno)); } return; } CASelectReturned(&readFds, ret); } static void CASelectReturned(fd_set *readFds, int ret) { (void)ret; if (g_acceptServerFD != -1 && FD_ISSET(g_acceptServerFD, readFds)) { CAAcceptConnection(); return; } else if (-1 != caglobals.tcp.connectionFds[0] && FD_ISSET(caglobals.tcp.connectionFds[0], readFds)) { // new connection was created from remote device. // exit the function to update read file descriptor. char buf[MAX_ADDR_STR_SIZE_CA] = {0}; ssize_t len = read(caglobals.tcp.connectionFds[0], buf, sizeof (buf)); if (-1 == len) { return; } OIC_LOG_V(DEBUG, TAG, "Received new connection event with [%s]", buf); FD_CLR(caglobals.tcp.connectionFds[0], readFds); return; } else { uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && svritem->fd >= 0) { if (FD_ISSET(svritem->fd, readFds)) { CAReceiveMessage(svritem->fd); FD_CLR(svritem->fd, readFds); } } } } }
static void CAFindReadyMessage() { fd_set readFds; struct timeval timeout = { .tv_sec = caglobals.tcp.selectTimeout }; FD_ZERO(&readFds); if (-1 != g_acceptServerFD) { FD_SET(g_acceptServerFD, &readFds); } if (-1 != caglobals.tcp.shutdownFds[0]) { FD_SET(caglobals.tcp.shutdownFds[0], &readFds); } uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && 0 <= svritem->fd) { FD_SET(svritem->fd, &readFds); } } int ret = select(caglobals.tcp.maxfd + 1, &readFds, NULL, NULL, &timeout); if (caglobals.tcp.terminate) { OIC_LOG_V(DEBUG, TAG, "Packet receiver Stop request received."); return; } if (0 >= ret) { if (0 > ret) { OIC_LOG_V(FATAL, TAG, "select error %s", strerror(errno)); } return; } CASelectReturned(&readFds, ret); } static void CASelectReturned(fd_set *readFds, int ret) { (void)ret; if (g_acceptServerFD != -1 && FD_ISSET(g_acceptServerFD, readFds)) { CAAcceptConnection(); return; } else { uint32_t length = u_arraylist_length(caglobals.tcp.svrlist); for (size_t i = 0; i < length; i++) { CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(caglobals.tcp.svrlist, i); if (svritem && svritem->fd >= 0) { if (FD_ISSET(svritem->fd, readFds)) { CAReceiveMessage(svritem->fd); FD_CLR(svritem->fd, readFds); } } } } }