/********************************************************************/ /* */ /* MONMSG : モニター・メッセージ */ /* */ /* Office Quattro Co,.Ltd 2010/07/31 13:36:27 created */ /* */ /* このプログラムは親プログラムの例外エラーが発生したとき */ /* 呼び出されて親プログラムのエラー発生ステートメントを */ /* 検出することができる。 */ /* */ /********************************************************************/ #pragma comment(COPYRIGHT, "as400-net.com EnterpriseServer (C) CopyRight \ Office Quattro.Corp. 2010- All right reserved. Users Restricted \ Rights - Use, duplication or disclosure restricted by Office Quattro \ Corp. Licenced Materials-Property of Office Quattro.") #include #include #include #include #include /* triml */ #include #include #include #define TRUE 0 #define FALSE -1 typedef struct { int BYTESPRO; int BYTESAVL; char MSGID[7]; char RESRVD; char EXCPDATA[100]; } ERRSTRUCTURE; /* Define the error return structure */ ERRSTRUCTURE errcode;/* Error Code Structure for RCVMSG */ /*************************************************************/ /* 内 部 使 用  関  数 */ /*************************************************************/ void GetParam(int argc, char *argv[]); void INZSR(void); /*************************************************************/ /* IMPORT  関  数 */ /*************************************************************/ /*************************************************************/ /* IMPORT  変  数 */ /*************************************************************/ /*************************************************************/ /* 外 部 呼 出 し  関  数 */ /*************************************************************/ void RtvJobA(char[], char[], char[], char[], char[], char[], char[], char[], char[], char[], char[], char[], char[], char[], char[]); #pragma map(RtvJobA, "ASNET.COM/RTVJOBA") /*CLP*/ #pragma linkage(RtvJobA, OS) char job[10], user[10], jobnbr[6], outq[10], outqlib[10], date[6]; char type[1], prtdev[10], langid[3], cntryid[2], ccsid[5]; char dftccsid[5], cymddate[7], sbmmsgq[10], sbmmsgqlib[10]; void ErrorResponse(char* cgi, char* err_at, char* msgid, char* msgf, char* msglib, char* msgtxt, char* msg, int errcode, int ACCLOG, int bESCAPE); #pragma linkage(ErrorResponse, OS) #pragma map(ErrorResponse, "ASNET.COM/ERRRESPONS") /*************************************************************/ /* グ ロ ー バ ル 変 数 */ /*************************************************************/ /*------( 受取りパラメータ値 )----------*/ volatile _INTRPT_Hndlr_Parms_T ca; /*------( 受取りパラメータ値 )----------*/ typedef struct { Qmh_Rcvpm_RCVM0300_t rcvm0300; char Msg[5000]; } RCVM0300; RCVM0300 rcvm0300; typedef struct { Qmh_Rcvpm_Sender_t sender; char procinfo[1024]; } SENDER; SENDER sender; int bBATCH , bACCLOG; /********************************************************************/ /* m a i n --- main module of this pgm */ /* */ /* 1. CA */ /* */ /*------------------------------------------------------------------*/ int main(int argc, char *argv[]){ int len, rcvlen, wait_time = 0, sender_offset, sender_length, msgsev, msg_offset, msg_length, help_offset, help_length, data_offset, data_length; char pgm[13], module[13], proc[257], stmt[31], msgid[8], msgf[11], msglib[11], msgtxt[133], msg[3001], msgdta[257], err_place[257]; GetParam(argc, argv); /*[ パラメータの取得 ]*/ INZSR(); /*[ 初期設定 ]*/ /*( 1 ) メッセージ・キーと同じエラー・メッセージを受信する */ memset(&rcvm0300, 0, sizeof(RCVM0300)); rcvlen = sizeof(RCVM0300); QMHRCVPM(&rcvm0300, rcvlen, "RCVM0300", "* ",0, "*ANY ", (void*)&ca.Msg_Ref_Key, wait_time,"*SAME ", &errcode); /*( 2 ) エラー・メッセージの内容を取得する */ memcpy(msgid, rcvm0300.rcvm0300.Message_Id, 7); msgid[7] = 0x00; msgsev = rcvm0300.rcvm0300.Message_Severity; memcpy(msgf, rcvm0300.rcvm0300.Message_File_Name, 10); msgf[10] = 0x00; memcpy(msglib, rcvm0300.rcvm0300.Message_File_Library, 10); msglib[10] = 0x00; data_offset = 0; data_length = rcvm0300.rcvm0300.Length_Data_Returned; if(data_length > 0){/* メッセージ・データ */ memcpy(msgdta, rcvm0300.Msg, data_length); msgdta[data_length] = 0x00; }/* メッセージ・データ */ else msgdta[0] = 0x00; msg_offset = rcvm0300.rcvm0300.Length_Data_Returned; msg_length = rcvm0300.rcvm0300.Length_Message_Available; if(msg_length > 0){/* メッセージ */ memcpy(msgtxt, &(rcvm0300.Msg[msg_offset]), msg_length); msgtxt[msg_length] = 0x00; }/* メッセージ */ else msgtxt[0] = 0x00; help_offset = rcvm0300.rcvm0300.Length_Data_Returned + rcvm0300.rcvm0300.Length_Message_Returned; help_length = rcvm0300.rcvm0300.Length_Help_Available; if(help_length > 0){/* ヘルプ */ memcpy(msg, &(rcvm0300.Msg[help_offset]), help_length); msg[help_length] = 0x00; }/* ヘルプ */ else msg[0] = 0x00; /*( 3 ) 送信者の情報を取得する */ sender_offset = rcvm0300.rcvm0300.Length_Data_Returned + rcvm0300.rcvm0300.Length_Message_Returned + rcvm0300.rcvm0300.Length_Help_Returned; sender_length = rcvm0300.rcvm0300.Length_Send_Returned; memcpy((char*)&sender, &(rcvm0300.Msg[sender_offset]), sender_length); memcpy(pgm, sender.sender.Send_Program_Name, 12); pgm[12] = 0x00; memcpy(module, sender.sender.Send_Module_Name, 10); module[10] = 0x00; memcpy(proc, sender.sender.Receive_Procedure_Name, 256); proc[256] = 0x00; len = triml(proc, ' '); if(len > 0) proc[len] = 0x00; memcpy(stmt, sender.sender.Receive_Statements, 30); stmt[30] = 0x00; len = triml(stmt, ' '); if(len > 0) stmt[len] = 0x00; /*( 4 ) モニターしたメッセージを送信する */ if(bBATCH == TRUE){/* バッチ環境 -WEB へ返信 */ sprintf(err_place, " モジュール :%s プロシージャー :%s ステートメント %s", module, proc, stmt); ErrorResponse(pgm, err_place, msgid, msgf, msglib, msgtxt, msg, 504, bACCLOG, TRUE); }/* バッチ環境 -WEB へ返信 */ else{/* 対話式環境 */ printf(" プログラム :%s\n", pgm); printf(" モジュール :%s\n", module); printf(" プロシージャー :%s\n", proc); printf(" ステートメント :%s で次のエラーが発生しました。 \n", stmt); printf(" * ---\n"); printf(" メッセージ ID = %s - %s/%s\n", msgid, msglib, msgf); printf(" メッセージ = %s\n", msgtxt); printf(" ヘルプ・テキスト = %s\n", msg); getchar(); }/* 対話式環境 */ } /*************************************/ void GetParam(int argc, char *argv[]) /*************************************/ { memcpy((char*)&ca, argv[1], sizeof(_INTRPT_Hndlr_Parms_T)); } /****************/ void INZSR(void) /****************/ { char* str; errcode.BYTESPRO = sizeof(errcode); errcode.BYTESAVL = 0; memcpy(job, "* ", 10); RtvJobA(job, user, jobnbr, outq, outqlib, date, type, prtdev, langid, cntryid, ccsid, dftccsid, cymddate, sbmmsgq, sbmmsgqlib); if(strncmp(type, "1", 1) == 0) bBATCH = FALSE; /* 対話式 */ else bBATCH = TRUE; str = getenv("ACCLOG"); if(str != NULL && strncmp(str, "*YES", 4) == 0) bACCLOG = TRUE; else bACCLOG = FALSE; }