static struct sk_buff *sock_get_skb(struct sock *sk, unsigned long timeout, int *err_p) { struct sk_buff *skb; int err; sched_lock(); { do { skb = skb_queue_front(&sk->rx_queue); if (skb) { err = 0; break; } err = -sock_err(sk); if (!err) { if (timeout == 0) { break; } err = sock_wait(sk, POLLIN | POLLERR, timeout); } } while (!err); } sched_unlock(); if (err_p) { *err_p = err; } return skb; }
sock_err sock_err::get_error(csocket::sock_t sock) noexcept { int rv = 0; int len = sizeof(rv); if(is_sock_err(getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*)&rv, &len))) return WSAGetLastError(); return sock_err(rv); }
int poll_del(int sockfd) { if (sockfd < 0 || sockfd >= nfds) { sock_err(sockfd, "%s: illegal sockfd(%d)", __func__, sockfd); return -1; } clients[sockfd].fd = -1; sock_info(sockfd, "%s: deleted from poll", __func__); return 0; }
int poll_rm(int sockfd, short events) { char events_str[42] = {'\0'}; if (sockfd < 0 || sockfd >= nfds) { sock_err(sockfd, "%s: illegal sockfd(%d)", __func__, sockfd); return -1; } clients[sockfd].events &= ~events; poll_events_string(events, events_str); sock_info(sockfd, "%s: %s", __func__, events_str); return 0; }
int poll_add(int sockfd, short events) { char events_str[42] = {'\0'}; if (sockfd < 0 || sockfd >= nfds) { sock_err(sockfd, "%s: illegal sockfd(%d)", __func__, sockfd); return -1; } if (clients[sockfd].fd != sockfd) { sock_warn(sockfd, "%s: sockfd(%d) not in poll", __func__, sockfd); return -1; } clients[sockfd].events |= events; poll_events_string(events, events_str); sock_info(sockfd, "%s: %s", __func__, events_str); return 0; }