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)); }
/** * 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; }
void tc_send(ec_tframe_tc_send_t * frame) { NEW_CONTEXT; os_send(&send_cb, ctx, frame->handle, frame->buffer, frame->len); }