static void cm_msg_pack_to_buff(Sr__Msg *msg, uint8_t **msg_buf, size_t *msg_size) { assert_non_null(msg); assert_non_null(msg_buf); assert_non_null(msg_size); *msg_size = sr__msg__get_packed_size(msg); *msg_buf = calloc(*msg_size, sizeof(**msg_buf)); assert_non_null(*msg_buf); sr__msg__pack(msg, *msg_buf); sr__msg__free_unpacked(msg, NULL); }
/** * @brief Sends a message via provided connection. */ static int cl_message_send(sr_conn_ctx_t *conn_ctx, Sr__Msg *msg) { size_t msg_size = 0; int pos = 0, sent = 0; int rc = SR_ERR_OK; CHECK_NULL_ARG2(conn_ctx, msg); /* find out required message size */ msg_size = sr__msg__get_packed_size(msg); if ((msg_size <= 0) || (msg_size > SR_MAX_MSG_SIZE)) { SR_LOG_ERR("Unable to send the message of size %zuB.", msg_size); return SR_ERR_INTERNAL; } /* expand the buffer if needed */ rc = cl_conn_msg_buf_expand(conn_ctx, msg_size + SR_MSG_PREAM_SIZE); if (SR_ERR_OK != rc) { SR_LOG_ERR_MSG("Cannot expand buffer for the message."); return rc; } /* write 4-byte length */ sr_uint32_to_buff(msg_size, conn_ctx->msg_buf); /* pack the message */ sr__msg__pack(msg, (conn_ctx->msg_buf + SR_MSG_PREAM_SIZE)); /* send the message */ do { sent = send(conn_ctx->fd, (conn_ctx->msg_buf + pos), (msg_size + SR_MSG_PREAM_SIZE - pos), 0); if (sent > 0) { pos += sent; } else { if (errno == EINTR) { continue; } SR_LOG_ERR("Error by sending of the message: %s.", sr_strerror_safe(errno)); return SR_ERR_DISCONNECT; } } while ((pos < (msg_size + SR_MSG_PREAM_SIZE)) && (sent > 0)); return SR_ERR_OK; }