int vr_message_response(unsigned int object_type, void *object, int ret) { char *buf = NULL; unsigned int len = 0; struct vr_mproto *proto; struct vr_mtransport *trans; proto = message_h.vm_proto; trans = message_h.vm_trans; if (!proto || !trans) return 0; len = proto->mproto_buf_len(object_type, object); len += proto->mproto_buf_len(VR_RESPONSE_OBJECT_ID, NULL); buf = trans->mtrans_alloc(len); if (!buf) return -ENOMEM; ret = proto->mproto_encode_response(buf, len, object_type, object, ret); if (ret < 0) goto response_fail; return vr_message_queue_response(buf, ret); response_fail: if (buf) trans->mtrans_free(buf); vr_send_response(ret); return ret; }
void vr_message_dump_exit(void *context, int ret) { struct vr_mproto *proto; struct vr_mtransport *trans; struct vr_message_dumper *dumper = (struct vr_message_dumper *)context; proto = message_h.vm_proto; trans = message_h.vm_trans; if (!proto || !trans) return; if (dumper) ret = dumper->dump_num_dumped; vr_send_response(ret); if (dumper) { if (!dumper->dump_offset) { if (dumper->dump_buffer) trans->mtrans_free(dumper->dump_buffer); } else vr_message_queue_response(dumper->dump_buffer, dumper->dump_offset); vr_free(dumper); } return; }
int vr_message_multi_response(struct vr_message_multi *objects) { char *buf = NULL; int ret = 0; unsigned int i, buf_len = 0, len = 0; struct vr_mproto *proto = NULL; struct vr_mtransport *trans = NULL; if ((!objects) || (objects->vr_mm_object_count >= VR_MESSAGE_MULTI_MAX_OBJECTS)) goto response_fail; proto = message_h.vm_proto; trans = message_h.vm_trans; if (!proto || !trans) goto response_fail; for (i = 0; i < objects->vr_mm_object_count; i++) { buf_len += proto->mproto_buf_len(objects->vr_mm_object_type[i], objects->vr_mm_object[i]); } if (!buf_len) goto response_fail; buf = trans->mtrans_alloc(buf_len); if (!buf) { ret = -ENOMEM; goto response_fail; } for (i = 0; i < objects->vr_mm_object_count; i++) { ret = proto->mproto_encode(buf + len, buf_len - len, objects->vr_mm_object_type[i], objects->vr_mm_object[i], VR_MESSAGE_TYPE_RESPONSE); if (ret < 0) goto response_fail; len += ret; } return vr_message_queue_response(buf, len, false); response_fail: if (trans && buf) trans->mtrans_free(buf); vr_send_response(ret); return ret; }