예제 #1
0
/*
  send a reply for a ctdb control
 */
void ctdb_request_control_reply(struct ctdb_context *ctdb, struct ctdb_req_control *c,
                                TDB_DATA *outdata, int32_t status, const char *errormsg)
{
    struct ctdb_reply_control *r;
    size_t len;

    /* some controls send no reply */
    if (c->flags & CTDB_CTRL_FLAG_NOREPLY) {
        return;
    }

    len = offsetof(struct ctdb_reply_control, data) + (outdata?outdata->dsize:0);
    if (errormsg) {
        len += strlen(errormsg);
    }
    r = ctdb_transport_allocate(ctdb, ctdb, CTDB_REPLY_CONTROL, len, struct ctdb_reply_control);
    CTDB_NO_MEMORY_VOID(ctdb, r);

    r->hdr.destnode     = c->hdr.srcnode;
    r->hdr.reqid        = c->hdr.reqid;
    r->status           = status;
    r->datalen          = outdata?outdata->dsize:0;
    if (outdata && outdata->dsize) {
        memcpy(&r->data[0], outdata->dptr, outdata->dsize);
    }
    if (errormsg) {
        r->errorlen = strlen(errormsg);
        memcpy(&r->data[r->datalen], errormsg, r->errorlen);
    }

    ctdb_queue_packet_opcode(ctdb, &r->hdr, c->opcode);

    talloc_free(r);
}
예제 #2
0
/*
  send a reply for a ctdb control
 */
void ctdb_request_control_reply(struct ctdb_context *ctdb, struct ctdb_req_control_old *c,
				TDB_DATA *outdata, int32_t status, const char *errormsg)
{
	struct ctdb_reply_control_old *r;
	size_t len;
	
	/* some controls send no reply */
	if (c->flags & CTDB_CTRL_FLAG_NOREPLY) {
		return;
	}

	len = offsetof(struct ctdb_reply_control_old, data) + (outdata?outdata->dsize:0);
	if (errormsg) {
		len += strlen(errormsg);
	}
	r = ctdb_transport_allocate(ctdb, ctdb, CTDB_REPLY_CONTROL, len, struct ctdb_reply_control_old);
	if (r == NULL) {
		DEBUG(DEBUG_ERR,(__location__ "Unable to allocate transport - OOM or transport is down\n"));
		return;
	}

	r->hdr.destnode     = c->hdr.srcnode;
	r->hdr.reqid        = c->hdr.reqid;
	r->status           = status;
	r->datalen          = outdata?outdata->dsize:0;
	if (outdata && outdata->dsize) {
		memcpy(&r->data[0], outdata->dptr, outdata->dsize);
	}
	if (errormsg) {
		r->errorlen = strlen(errormsg);
		memcpy(&r->data[r->datalen], errormsg, r->errorlen);
	}

	ctdb_queue_packet_opcode(ctdb, &r->hdr, c->opcode);	

	talloc_free(r);
}