static int wait_frame_inner(amqp_connection_state_t state, amqp_frame_t *decoded_frame) { while (1) { int result; while (amqp_data_in_buffer(state)) { amqp_bytes_t buffer; buffer.len = state->sock_inbound_limit - state->sock_inbound_offset; buffer.bytes = ((char *) state->sock_inbound_buffer.bytes) + state->sock_inbound_offset; (void)AMQP_CHECK_RESULT((result = amqp_handle_input(state, buffer, decoded_frame))); state->sock_inbound_offset += result; if (decoded_frame->frame_type != 0) { /* Complete frame was read. Return it. */ return 1; } /* Incomplete or ignored frame. Keep processing input. */ assert(result != 0); } result = eintr_safe_read(state->sockfd, state->sock_inbound_buffer.bytes, state->sock_inbound_buffer.len); if (result < 0) { mtevL(mtev_error, "Failed to read message in wait_frame_inner, size %zu\n", state->sock_inbound_buffer.len); return -errno; } if (result == 0) { /* EOF. */ return 0; } state->sock_inbound_limit = result; state->sock_inbound_offset = 0; } }
static int wait_frame_inner(amqp_connection_state_t state, amqp_frame_t *decoded_frame) { while (1) { int res; while (amqp_data_in_buffer(state)) { amqp_bytes_t buffer; buffer.len = state->sock_inbound_limit - state->sock_inbound_offset; buffer.bytes = ((char *) state->sock_inbound_buffer.bytes) + state->sock_inbound_offset; res = amqp_handle_input(state, buffer, decoded_frame); if (res < 0) return res; state->sock_inbound_offset += res; if (decoded_frame->frame_type != 0) /* Complete frame was read. Return it. */ return 0; /* Incomplete or ignored frame. Keep processing input. */ assert(res != 0); } res = recv(state->sockfd, state->sock_inbound_buffer.bytes, state->sock_inbound_buffer.len, 0); if (res <= 0) { if (res == 0) return -ERROR_CONNECTION_CLOSED; else return -amqp_socket_error(); } state->sock_inbound_limit = res; state->sock_inbound_offset = 0; } }