/*% 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); }
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)); }
/*% 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); }