예제 #1
0
/*% performs I/O for the context ctx. */
lwres_result_t
lwres_context_sendrecv(lwres_context_t *ctx,
		       void *sendbase, int sendlen,
		       void *recvbase, int recvlen,
		       int *recvd_len)
{
	lwres_result_t result;
	int ret2;
	fd_set readfds;
	struct timeval timeout;

	/*
	 * Type of tv_sec is 32 bits long.
	 */
	if (ctx->timeout <= 0x7FFFFFFFU)
		timeout.tv_sec = (int)ctx->timeout;
	else
		timeout.tv_sec = 0x7FFFFFFF;

	timeout.tv_usec = 0;

	result = lwres_context_send(ctx, sendbase, sendlen);
	if (result != LWRES_R_SUCCESS)
		return (result);

	/*
	 * If this is not checked, select() can overflow,
	 * causing corruption elsewhere.
	 */
	if (ctx->sock >= (int)FD_SETSIZE) {
		close(ctx->sock);
		ctx->sock = -1;
		return (LWRES_R_IOERROR);
	}

 again:
	FD_ZERO(&readfds);
	FD_SET(ctx->sock, &readfds);
	ret2 = select(ctx->sock + 1, &readfds, NULL, NULL, &timeout);

	/*
	 * What happened with select?
	 */
	if (ret2 < 0)
		return (LWRES_R_IOERROR);
	if (ret2 == 0)
		return (LWRES_R_TIMEOUT);

	result = lwres_context_recv(ctx, recvbase, recvlen, recvd_len);
	if (result == LWRES_R_RETRY)
		goto again;

	return (result);
}
예제 #2
0
int
lwres_getrrsetbyname_xmit(lwres_context_t *ctx,
			  struct lwres_async_state *las)
{
	lwres_result_t lwresult;

	if(!las->inqueue) {
	  las->next = ctx->pending;
	  ctx->pending = las;
	  las->inqueue = 1;
	}

	lwresult = lwres_context_send(ctx, las->b_out.base, las->b_out.length);

	return(lwresult_to_result(lwresult));
}
예제 #3
0
파일: context.c 프로젝트: SylvestreG/bitrig
/*% performs I/O for the context ctx. */
lwres_result_t
lwres_context_sendrecv(lwres_context_t *ctx,
		       void *sendbase, int sendlen,
		       void *recvbase, int recvlen,
		       int *recvd_len)
{
	lwres_result_t result;
	int ret2;
	fd_set readfds;
	struct timeval timeout;

	/*
	 * Type of tv_sec is at least 32 bits long. 
	 */
	if (ctx->timeout <= 0x7FFFFFFFU)
		timeout.tv_sec = ctx->timeout;
	else
		timeout.tv_sec = 0x7FFFFFFF;

	timeout.tv_usec = 0;

	result = lwres_context_send(ctx, sendbase, sendlen);
	if (result != LWRES_R_SUCCESS)
		return (result);
 again:
	FD_ZERO(&readfds);
	FD_SET(ctx->sock, &readfds);
	ret2 = select(ctx->sock + 1, &readfds, NULL, NULL, &timeout);
	
	/*
	 * What happened with select?
	 */
	if (ret2 < 0)
		return (LWRES_R_IOERROR);
	if (ret2 == 0)
		return (LWRES_R_TIMEOUT);

	result = lwres_context_recv(ctx, recvbase, recvlen, recvd_len);
	if (result == LWRES_R_RETRY)
		goto again;
	
	return (result);
}