// // plugin - send msg to ms-ic // static void sb_pi_ic_send(MS_Mon_Node_Info_Entry_Type *pp_node, MS_Mon_Process_Info_Type *pp_proc, Sqstate_Pi_Info_Type *pp_info, char *pp_title, bool pv_title, const char *pp_lib, const char *pp_call, char *pp_rsp, int pv_rsplen, int *pp_rsplen) { char la_ctrl[200]; char *lp_data; char *lp_p; char la_rsp[MAX_RSP]; short *lp_ctrl; short *lp_results; char *lp_rsp; int lv_clen; int lv_disable; int lv_dlen; int lv_fserr; int lv_inx; int lv_len; int lv_msgid; int lv_oid; bool lv_open; MS_Result_Type lv_results; int lv_rsplen; pp_node = pp_node; // touch if (pp_rsplen != NULL) *pp_rsplen = 0; lv_open = (strcmp(pp_proc->process_name, gp_pname) != 0); gp_pname = pp_proc->process_name; if (strcmp(pp_call, "ic_unload") == 0) sprintf(la_ctrl, "unload" ":" ":" "all"); else sprintf(la_ctrl, "call" ":" "%s" ":" "%s", pp_lib, pp_call); lv_clen = static_cast<int>(strlen(la_ctrl)) + 1; lv_dlen = 0; for (lv_inx = 0; lv_inx < pp_info->ic_argc; lv_inx++) lv_dlen += static_cast<int>(strlen(pp_info->ic_argv[lv_inx])) + 1; if (lv_dlen > 0) { lp_data = new char[lv_dlen]; lp_p = lp_data; for (lv_inx = 0; lv_inx < pp_info->ic_argc; lv_inx++) { lv_len = sprintf(lp_p, "%s", pp_info->ic_argv[lv_inx]); lp_p += lv_len + 1; } } else lp_data = NULL; if (lv_open) { if (gv_verbosev) sb_pi_verb_printf("opening %s...\n", gp_pname); if (gv_opened) { gv_opened = false; lv_fserr = msg_mon_close_process(&gv_phandle); CHK_FEIGNORE(lv_fserr); } lv_disable = msg_test_assert_disable(); if (pp_info->self) lv_fserr = msg_mon_open_process_self_ic(&gv_phandle, &lv_oid); else lv_fserr = msg_mon_open_process_ic(gp_pname, &gv_phandle, &lv_oid); msg_test_assert_enable(lv_disable); sb_pi_verb_ok(lv_fserr, "open"); } else lv_fserr = XZFIL_ERR_OK; if (lv_fserr != XZFIL_ERR_OK) { sb_pi_verb_printf("ERROR: could not open %s, fserr=%d\n", gp_pname, lv_fserr); } else { lp_ctrl = reinterpret_cast<short *>(la_ctrl); gv_opened = true; if (gv_verbose) sb_pi_verb_printf("linking %s, ctrl=%s...\n", gp_pname, la_ctrl); lv_disable = msg_test_assert_disable(); if (pp_rsp == NULL) { lp_rsp = la_rsp; lv_rsplen = MAX_RSP; } else { lp_rsp = pp_rsp; lv_rsplen = pv_rsplen; } lv_fserr = BMSG_LINK_(&gv_phandle, // phandle &lv_msgid, // msgid lp_ctrl, // reqctrl lv_clen, // reqctrlsize NULL, // replyctrl 0, // replyctrlmax lp_data, // reqdata lv_dlen, // reqdatasize lp_rsp, // replydata lv_rsplen, // replydatamax 0, // linkertag 0, // pri 0, // xmitclass BMSG_LINK_MSINTERCEPTOR); // linkopts msg_test_assert_enable(lv_disable); sb_pi_verb_ok(lv_fserr, "link"); if (lv_fserr != XZFIL_ERR_OK) { sb_pi_printf("ERROR: error in link to %s, fserr=%d\n", gp_pname, lv_fserr); } else { if (gv_verbosev) sb_pi_verb_printf("breaking %s...\n", gp_pname); lp_results = reinterpret_cast<short *>(&lv_results); lv_disable = msg_test_assert_disable(); lv_fserr = BMSG_BREAK_(lv_msgid, lp_results, &gv_phandle); msg_test_assert_enable(lv_disable); sb_pi_verb_ok(lv_fserr, "break"); if (lv_fserr == XZFIL_ERR_OK) { if (pp_rsp == NULL) sb_pi_ic_call_print_rsp(pp_title, pv_title, la_rsp, lv_results.rr_datasize); else if (pp_rsplen != NULL) *pp_rsplen = lv_results.rr_datasize; } else { sb_pi_printf("ERROR: error in break to %s, fserr=%d\n", gp_pname, lv_fserr); } } } }
// // plugin - send message to interceptor // SB_Export bool sqstatepi_send_ic_ok(const char *pp_module, const char *pp_call, MS_Mon_Node_Info_Entry_Type *pp_node, MS_Mon_Process_Info_Type *pp_proc, Sqstate_Pi_Info_Type *pp_info, const char *pp_lib, char *pp_rsp, int pv_rsp_len, int *pp_rsp_len) { char la_ctrl[200]; char *lp_data; char *lp_p; short *lp_results; int lv_clen; int lv_dlen; int lv_fserr; int lv_inx; int lv_len; int lv_msgid; int lv_oid; int lv_ok; bool lv_open; MS_Result_Type lv_results; pp_node = pp_node; // touch lv_ok = false; *pp_rsp_len = 0; lv_open = (strcmp(pp_proc->process_name, gp_sqstatepi_pname) != 0); gp_sqstatepi_pname = pp_proc->process_name; sqstatepi_set_ctrl(la_ctrl, pp_info, pp_lib, pp_module, pp_call); lv_clen = static_cast<int>(strlen(la_ctrl)) + 1; lv_dlen = 0; for (lv_inx = 0; lv_inx < pp_info->ic_argc; lv_inx++) lv_dlen += static_cast<int>(strlen(pp_info->ic_argv[lv_inx])) + 1; if (lv_dlen > 0) { lp_data = new char[lv_dlen]; lp_p = lp_data; for (lv_inx = 0; lv_inx < pp_info->ic_argc; lv_inx++) { lv_len = sprintf(lp_p, "%s", pp_info->ic_argv[lv_inx]); lp_p += lv_len + 1; } } else lp_data = NULL; if (lv_open) { if (pp_info->verbosev) sqstatepi_printf("opening %s...\n", gp_sqstatepi_pname); if (gv_sqstatepi_opened) { gv_sqstatepi_opened = false; lv_fserr = msg_mon_close_process(&gv_sqstatepi_phandle); CHK_FEIGNORE(lv_fserr); } if (pp_info->self) lv_fserr = msg_mon_open_process_self_ic(&gv_sqstatepi_phandle, &lv_oid); else lv_fserr = msg_mon_open_process_ic(gp_sqstatepi_pname, &gv_sqstatepi_phandle, &lv_oid); sqstatepi_verbose_ok(pp_info, lv_fserr, "open"); } else lv_fserr = XZFIL_ERR_OK; if (lv_fserr != XZFIL_ERR_OK) { sqstatepi_printf("ERROR: could not open %s, fserr=%d\n", gp_sqstatepi_pname, lv_fserr); } else { gv_sqstatepi_opened = true; if (pp_info->verbose) sqstatepi_printf("linking %s, ctrl=%s...\n", gp_sqstatepi_pname, la_ctrl); lv_fserr = BMSG_LINK_(&gv_sqstatepi_phandle, // phandle &lv_msgid, // msgid (short *) la_ctrl, // reqctrl lv_clen, // reqctrlsize NULL, // replyctrl 0, // replyctrlmax lp_data, // reqdata lv_dlen, // reqdatasize pp_rsp, // replydata pv_rsp_len, // replydatamax 0, // linkertag 0, // pri 0, // xmitclass BMSG_LINK_MSINTERCEPTOR); // linkopts sqstatepi_verbose_ok(pp_info, lv_fserr, "link"); if (lv_fserr != XZFIL_ERR_OK) { sqstatepi_printf("ERROR: error in link to %s, fserr=%d\n", gp_sqstatepi_pname, lv_fserr); } else { if (pp_info->verbosev) sqstatepi_printf("breaking %s...\n", gp_sqstatepi_pname); lp_results = (short *) &lv_results; lv_fserr = BMSG_BREAK_(lv_msgid, lp_results, &gv_sqstatepi_phandle); sqstatepi_verbose_ok(pp_info, lv_fserr, "break"); if (lv_fserr == XZFIL_ERR_OK) { *pp_rsp_len = lv_results.rr_datasize; lv_ok = true; } else { sqstatepi_printf("ERROR: error in break to %s, fserr=%d\n", gp_sqstatepi_pname, lv_fserr); } } } if (lp_data != NULL) delete [] lp_data; return lv_ok; }