Beispiel #1
0
/*! Writes header data into actual header of the message.
 *  Remainig fragment buf and length is in frag->frag and frag->frag_len
 *
 * @return 0 on success */
long
gcs_act_proto_write (gcs_act_frag_t* frag, void* buf, size_t buf_len)
{
#ifdef GCS_DEBUG_PROTO
    if ((frag->act_id   > PROTO_ACT_ID_MAX)  ||
        (frag->act_size > GCS_MAX_ACT_SIZE)  ||
        (frag->frag_no  > PROTO_FRAG_NO_MAX) ||
        (frag->act_type > PROTO_AT_MAX)) {
        gu_error ("Exceeded protocol limits: %d(%d), %d(%d), %d(%d), %d(%d)",
                  frag->act_id,   PROTO_ACT_ID_MAX,
                  frag->act_size, GCS_MAX_ACT_SIZE,
                  frag->frag_no,  PROTO_FRAG_NO_MAX,
                  frag->act_type, PROTO_AT_MAX);
        return -EOVERFLOW;
    }
    if (frag->proto_ver != PROTO_VERSION) return -EPROTO;
    if (buf_len      < PROTO_DATA_OFFSET) return -EMSGSIZE;
#endif

    // assert (frag->act_size <= PROTO_ACT_SIZE_MAX);

    ((uint64_t*)buf)[0] = gu_be64(frag->act_id);
    ((uint32_t*)buf)[2] = htogl  ((uint32_t)frag->act_size);
    ((uint32_t*)buf)[3] = htogl  (frag->frag_no);

    ((uint8_t *)buf)[PROTO_PV_OFFSET] = frag->proto_ver;
    ((uint8_t *)buf)[PROTO_AT_OFFSET] = frag->act_type;

    frag->frag     = (uint8_t*)buf + PROTO_DATA_OFFSET;
    frag->frag_len = buf_len - PROTO_DATA_OFFSET;

    return 0;
}
Beispiel #2
0
StateRequest_v1::StateRequest_v1 (
    const void* const sst_req, ssize_t const sst_req_len,
    const void* const ist_req, ssize_t const ist_req_len)
    :
    len_(MAGIC.length() + 1 +
         sizeof(uint32_t) + sst_req_len +
         sizeof(uint32_t) + ist_req_len),
    req_(reinterpret_cast<char*>(malloc(len_))),
    own_(true)
{
    if (!req_)
        gu_throw_error (ENOMEM) << "Could not allocate state request v1";

    if (sst_req_len > INT32_MAX || sst_req_len < 0)
        gu_throw_error (EMSGSIZE) << "SST request length (" << sst_req_len
                               << ") unrepresentable";

    if (ist_req_len > INT32_MAX || ist_req_len < 0)
        gu_throw_error (EMSGSIZE) << "IST request length (" << sst_req_len
                               << ") unrepresentable";

    char* ptr(req_);

    strcpy (ptr, MAGIC.c_str());
    ptr += MAGIC.length() + 1;

    uint32_t* tmp(reinterpret_cast<uint32_t*>(ptr));
    *tmp = htogl(sst_req_len);
    ptr += sizeof(uint32_t);

    memcpy (ptr, sst_req, sst_req_len);
    ptr += sst_req_len;

    tmp = reinterpret_cast<uint32_t*>(ptr);
    *tmp = htogl(ist_req_len);
    ptr += sizeof(uint32_t);

    memcpy (ptr, ist_req, ist_req_len);

    assert ((ptr - req_) == (len_ - ist_req_len));
}