Exemple #1
0
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;
  }
}