Esempio n. 1
0
static void write_result(int msg_sock, const char *result)
{
  int skip = 0;

  if (result == NULL || msg_sock < 0)
    return;

  do
    {
      int rv;
      do
	rv = os_send(msg_sock, result + skip, strlen(result) - skip);
      while (rv == -EINTR);

      if (rv < 0 && rv != -EAGAIN)
	{
	  exalog_error("Error '%s' while sending result '%s'",
                       exa_error_msg(rv), result);
	  break;
	}

      if (rv > 0)
	skip += rv;

    } while (skip < strlen(result));
}
Esempio n. 2
0
/**
 * Send header and buffer if any
 *
 * @param[in] fd       socket in which to perform the send
 * @param[in] request  the request describing the send operation
 *
 * @return DATA_TRANSFER_ERROR     socket invalid or closed.
 *         DATA_TRANSFER_COMPLETE  if successfully transferred all pending
 *                                 data (header and buffer if any)
 *         DATA_TRANSFER_PENDING   if some remaining data to transfer
 */
static int request_send(int fd, struct pending_request *request)
{
    int ret;

    if (request->nb_readwrite < sizeof(payload_t))
    {
        const void *buffer = request->payload + request->nb_readwrite;
        int size = sizeof(payload_t) - request->nb_readwrite;
        do
            ret = os_send(fd, buffer, size);
        while (ret == -EINTR);
    }
    else
    {
        const void *buffer = request->payload->buffer
                             + request->nb_readwrite - sizeof(payload_t);
        int size = request->payload->size2
                             - (request->nb_readwrite - sizeof(payload_t));

        do
            ret = os_send(fd, buffer, size);
        while (ret == -EINTR);
    }

    /* XXX For some unknown reason, the send can return 0 here, and I cannot
     * figure out why.... For now I just ignore it an treat it as 'normal' but
     * we should probably pay attention to this... */
    if (ret < 0)
        return DATA_TRANSFER_ERROR;

    request->nb_readwrite += ret;

    if (request->nb_readwrite < sizeof(payload_t) + request->payload->size2)
        return DATA_TRANSFER_PENDING;

    return DATA_TRANSFER_COMPLETE;
}
Esempio n. 3
0
void tc_send(ec_tframe_tc_send_t * frame)
{
    NEW_CONTEXT;
    os_send(&send_cb, ctx, frame->handle, frame->buffer, frame->len);
}