/* 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); }
/* 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); }