Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
}
Example #4
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;
}
Example #5
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;
}