15632{
15634
15635 bool debug =
false;
15636
15637
15639
15640
15641 if (convert_flags) {
15644 }
15645
15646
15647
15648
15649
15650
15652 sock = 0;
15653
15655
15656 assert(xroutine_id == routine_id);
15657
15658#if 0
15661
15664
15667
15670#endif
15671
15672
15673
15674 char* in_param_ptr = (
char*)nc_in->
param;
15675
15677 printf(
"rpc_execute_cxx: routine_id %d, name \"%s\"\n", routine_id, rl.
name);
15678
15680
15683
15684 std::vector<RPE> params;
15685
15686 int nparams = 0;
15688 nparams++;
15689 }
15690
15691 params.resize(nparams);
15692
15693 size_t in_offset = 0;
15694
15695 for (
int i = 0;
i < nparams;
i++) {
15696 in_param_size[
i] = 0;
15697 in_param_offset[
i] = 0;
15698
15701
15704
15706 arg_size = 1 + strlen((char *) (in_param_ptr));
15707 }
15708
15710
15711 int arg_size_align8 = *((
INT *) in_param_ptr);
15712 if (convert_flags)
15717
15718 arg_size = arg_size_align8;
15719 } else {
15720
15721 arg_size = *((
INT *) (((
char*)in_param_ptr) +
ALIGN8(arg_size_align8)));
15722 if (convert_flags)
15724 }
15725
15726
15728 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d, param %d tid %d flags 0x%x size mismatch: header %d vs next param %d", routine_id,
i, tid, flags, arg_size_align8, arg_size);
15730 }
15731 }
15732
15735 }
15736
15737 int param_size =
ALIGN8(arg_size);
15738
15739 in_param_size[
i] = param_size;
15740 in_param_offset[
i] = in_offset;
15741
15742 params[
i].offset = in_offset;
15743 params[
i].arg_size = arg_size;
15744 params[
i].param_size = param_size;
15745
15746
15747 if (convert_flags) {
15750 } else {
15752 }
15753 }
15754
15755 in_param_ptr += param_size;
15756 in_offset += param_size;
15757 }
15758
15761
15763 params[
i].out_max_size = 0;
15765
15766
15767
15768
15769
15770 params[
i].out_max_size_offset = in_offset;
15771
15772 INT max_size = *((
INT *) in_param_ptr);
15773
15774 if (convert_flags)
15776
15777 if (max_size < 0 || (tid ==
TID_STRING && max_size == 0)) {
15778 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d, param %d tid %d flags 0x%x invalid maximum output size %d", routine_id,
i, tid, flags, max_size);
15780 }
15781
15782 params[
i].out_max_size = max_size;
15783 }
15784
15786 params[
i].out_max_size = rl.
param[
i].
n;
15787 }
15788 }
15789
15792 params[
i].ps =
new std::string;
15794 *(params[
i].ps) = (
char*)nc_in->
param + in_param_offset[
i];
15795
15796 }
15797 prpc_param[
i] = (
void*) params[
i].ps;
15799 params[
i].pv =
new std::vector<char>;
15801 params[
i].pv->insert(params[
i].pv->end(), (
char*)nc_in->
param + in_param_offset[
i], (
char*)nc_in->
param + in_param_offset[
i] + params[
i].arg_size);
15802
15803 }
15804 prpc_param[
i] = (
void*) params[
i].pv;
15805 } else {
15806 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d: param %d tid %d flags 0x%x, TID not compatible with flag RPC_CXX", routine_id,
i, tid, flags);
15808 }
15809 } else {
15811 params[
i].pv =
new std::vector<char>;
15812 params[
i].pv->insert(params[
i].pv->end(), (
char*)nc_in->
param + in_param_offset[
i], (
char*)nc_in->
param + in_param_offset[
i] + params[
i].arg_size);
15813 size_t want_size = params[
i].out_max_size;
15814
15815 if (params[
i].pv->size() < want_size)
15816 params[
i].pv->resize(want_size);
15817 prpc_param[
i] = params[
i].pv->data();
15818 }
else if (flags &
RPC_IN) {
15819 prpc_param[
i] = (
char*)nc_in->
param + in_param_offset[
i];
15820
15821 }
else if (flags &
RPC_OUT) {
15822 params[
i].pv =
new std::vector<char>;
15823 params[
i].pv->resize(params[
i].out_max_size);
15824 prpc_param[
i] = params[
i].pv->data();
15825
15826 }
15827 }
15828
15830 printf(
"rpc_execute_cxx: param %2d, tid %2d, flags 0x%04x, in %3zu+%-3zu+%-3zu, out max size %3zu at %3zu, ptr %p\n",
i, tid, flags, params[
i].
offset, params[
i].arg_size, params[
i].param_size, params[
i].out_max_size, params[
i].out_max_size_offset, prpc_param[
i]);
15831 }
15832
15834 printf(
"rpc_execute_cxx: nc_in size %d, in_offset %zu\n", nc_in->
header.
param_size, in_offset);
15835
15837 bool ok = true;
15838
15839 ok &= in_param_offset[ 0] == 0; ok &= in_param_size[ 0] == 8;
15840 ok &= in_param_offset[ 1] == 0; ok &= in_param_size[ 1] == 0;
15841 ok &= in_param_offset[ 2] == 8; ok &= in_param_size[ 2] == 8;
15842 ok &= in_param_offset[ 3] == 16; ok &= in_param_size[ 3] == 16;
15843 ok &= in_param_offset[ 4] == 0; ok &= in_param_size[ 4] == 0;
15844 ok &= in_param_offset[ 5] == 32; ok &= in_param_size[ 5] == 8;
15845 ok &= in_param_offset[ 6] == 0; ok &= in_param_size[ 6] == 0;
15846 ok &= in_param_offset[ 7] == 40; ok &= in_param_size[ 7] == 8;
15847 ok &= in_param_offset[ 8] == 48; ok &= in_param_size[ 8] == 16;
15848 ok &= in_param_offset[ 9] == 64; ok &= in_param_size[ 9] == 8;
15849 ok &= in_param_offset[10] == 72; ok &= in_param_size[10] == 72;
15850 ok &= in_param_offset[11] == 0; ok &= in_param_size[11] == 0;
15851 ok &= in_param_offset[12] == 144; ok &= in_param_size[12] == 72;
15852 ok &= in_param_offset[13] == 224; ok &= in_param_size[13] == 40;
15853 ok &= in_param_offset[14] == 264; ok &= in_param_size[14] == 8;
15854 ok &= in_param_offset[15] == 280; ok &= in_param_size[15] == 16;
15855 ok &= in_param_offset[16] == 296; ok &= in_param_size[16] == 8;
15856 ok &= in_param_offset[17] == 0; ok &= in_param_size[17] == 0;
15857 ok &= in_param_offset[18] == 304; ok &= in_param_size[18] == 8;
15858 ok &= in_offset == 312;
15859
15860 if (!ok) {
15861 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC_TEST2 parameters encoding error!");
15863 }
15864 }
15865
15867 printf("rpc_execute_cxx: calling dispatch()\n");
15868 }
15869
15870
15871
15872
15875 else
15877
15879 printf(
"rpc_execute_cxx: dispatch() status %d\n",
status);
15880 }
15881
15884
15885
15888 }
15889
15892 }
15893
15894
15897 }
15898
15899
15900 if (!sock) {
15902 }
15903
15904 std::vector<char> v_out;
15905
15907
15908 for (
int i = 0;
i < nparams;
i++) {
15912
15915 size_t arg_size = 1 + params[
i].ps->length();
15916 size_t param_size =
ALIGN8(arg_size);
15917
15919 printf(
"rpc_execute_cxx: param %2d, std::string arg_size %zu, param_size %zu, string [%s]\n",
i, arg_size, param_size, params[
i].ps->c_str());
15920
15921 v_out.insert(v_out.end(), params[
i].ps->c_str(), params[
i].ps->c_str() + arg_size);
15922 v_out.resize(v_out.size() + param_size - arg_size);
15924 size_t arg_size = params[
i].pv->size();
15925 size_t param_size =
ALIGN8(arg_size);
15926
15928 printf(
"rpc_execute_cxx: param %2d, std::vector arg_size %zu, param_size %zu\n",
i, arg_size, param_size);
15929
15931 *((
INT *) buf) = arg_size;
15932 if (convert_flags)
15934 v_out.insert(v_out.end(), buf, buf +
ALIGN8(
sizeof(
INT)));
15935 v_out.insert(v_out.end(), params[
i].pv->data(), params[
i].pv->data() + arg_size);
15936 v_out.resize(v_out.size() + param_size - arg_size);
15937 } else {
15938 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d: param %d tid %d flags 0x%x, TID not compatible with flag RPC_CXX", routine_id,
i, tid, flags);
15940 }
15941 } else {
15942 size_t convert_offset = 0;
15943 size_t convert_size = 0;
15944
15946 size_t max_size = params[
i].out_max_size;
15947 char* param_ptr = (
char *) prpc_param[
i];
15948
15949 char* string_end = (char*)memchr(param_ptr, 0, max_size);
15950 size_t arg_size = string_end ? string_end - param_ptr : max_size;
15951 if (!string_end) {
15952 param_ptr[max_size - 1] = 0;
15953 arg_size = max_size - 1;
15954 }
15955 arg_size++;
15956 size_t param_size =
ALIGN8(arg_size);
15957
15959 printf(
"rpc_execute_cxx: param %2d, string max_size %zu, string_size %zu, param_size %zu\n",
i, max_size, arg_size, param_size);
15960
15961 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15962 v_out.resize(v_out.size() + param_size - arg_size);
15964 size_t max_size = params[
i].out_max_size;
15965 INT arg_size_int = *((
INT *) prpc_param[
i + 1]);
15966 if (arg_size_int < 0 || (size_t) arg_size_int > max_size) {
15967 cm_msg(
MERROR,
"rpc_execute_cxx",
"RPC %d, param %d output array size %d exceeds maximum size %zu", routine_id,
i, arg_size_int, max_size);
15969 }
15970 size_t arg_size = arg_size_int;
15971 char* param_ptr = (
char*)prpc_param[
i];
15972 size_t param_size =
ALIGN8(arg_size);
15973
15975 printf(
"rpc_execute_cxx: param %2d, array max_size %zu, param_size %zu\n",
i, max_size, param_size);
15976
15978 *((
INT *) buf) = arg_size;
15979 if (convert_flags)
15981 v_out.insert(v_out.end(), buf, buf +
ALIGN8(
sizeof(
INT)));
15982 convert_offset = v_out.size();
15983 convert_size = arg_size;
15984 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
15985 v_out.resize(v_out.size() + param_size - arg_size);
15986 } else {
15987 char* param_ptr = (
char*)prpc_param[
i];
15991 size_t param_size =
ALIGN8(arg_size);
15992
15995 printf(
"rpc_execute_cxx: param %2d, tid %2d, arg_size %zu, param_size %zu, value %d\n",
i, tid, arg_size, param_size, *(
int*)param_ptr);
15996 } else {
15997 printf(
"rpc_execute_cxx: param %2d, tid %2d, arg_size %zu, param_size %zu\n",
i, tid, arg_size, param_size);
15998 }
15999 }
16000
16001 convert_offset = v_out.size();
16002 convert_size = arg_size;
16003 v_out.insert(v_out.end(), param_ptr, param_ptr + arg_size);
16004 v_out.resize(v_out.size() + param_size - arg_size);
16005 }
16006
16007
16008 if (convert_flags) {
16011 else
16013 }
16014 }
16015 }
16016 }
16017
16019
16020
16023
16024
16025
16026 if (convert_flags) {
16029 }
16030
16032
16036 }
16037
16039 printf(
"rpc_execute_cxx: send_tcp() sent %d bytes\n",
status);
16040
16041
16044
16045
16048
16050}
#define RPC_EXCEED_BUFFER
void rpc_convert_data(void *data, INT tid, INT flags, INT total_size, INT convert_flags)