Scenario: Exit program for Watch for Event
This is an example of a Watch for Event exit program, which is written in C.
Use this exit program as a starting point to help you create your own watch for event exit program. You can modify the code to allow the program to perform additional functions.
By using the code examples, you agree to the terms of the Code license and disclaimer information.
/************************************************************************* ** file = mywchpgm.c ** ** Example of an Exit Program for Watch for Event. ** ** This program will be called by the watch for event support when CPF0907 ** message is sent to QSYSOPR. ** ** The program will call a cleanup program to free up system storage and, ** if the available storage is less than 5%, the program will perform some ** more actions (not defined) ** **************************************************************************/ #include <decimal.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <except.h> /* _INTRPT_Hndlr_Parms_T is typedefed */ #include <escwcht.h> /* Include for Watch Exit Program packaged in */ /* QSYSINC/H Source Physical File */ /****************** Prototypes *******************************************/ void UNEXPECTED_HDLER (_INTRPT_Hndlr_Parms_T *errmsg); /* Declare variables to receive parameters */ char watch_option_setting[10], session_ID[10], * error_detected_ptr; typedef struct { Qsc_Watch_For_Msg_t msg_data; char VarData[8776]; /* variable length data */ } MsgFullData_t; MsgFullData_t * MsgFullData; int main (int argc, char *argv[]) { char * cAvailStorage[4]; decimal(7,4) dAvailStorage; /* Variables to call a command */ int rc; char cmdtorun[128]; #define CALL_MYCLNUP "CALL PGM(MYLIB/MYCLNUP)" /*********************************************************************/ /* Turn exception monitor on. */ /*********************************************************************/ #pragma exception_handler (UNEXPECTED_HDLER, 0, 0, _C2_MH_ESCAPE) memcpy(watch_option_setting,argv[1],10); memcpy(session_ID,argv[2],10); error_detected_ptr = argv[3]; MsgFullData = (MsgFullData_t *) argv[4]; /* Verify if the exit program was called because a watched message */ /* occurred. This verification is useful if you have a watch */ /* session waiting for a message event and for a LICLog event */ if (memcmp(watch_option_setting,"*MSGID ",10)==0) { /* Verify if the message id that occurred is CPF0907 */ /* This verification is useful if you are watching for more than */ /* one message in the same watch session */ if (memcmp(MsgFullData->msg_data.Message_ID,"CPF0907",7)==0) { /* Call cleanup program to free up space */ strcpy(cmdtorun,CALL_MYCLNUP); rc = system(cmdtorun); if (rc == 0) { /* Determine if the available storage space is less than 5% */ /* to do some extra processing */ if (MsgFullData->msg_data.Length_Of_Replacement_Data > 0) { /* The remaining storage comes in the 4th field data in the */ /* message replacement variable. See CPF0907 message */ /* description for a better understanding */ memcpy(cAvailStorage, (char *) (argv[4] + MsgFullData->msg_data.Offset_Replacement_Data + 66), 4); dAvailStorage = *(decimal(7,4) *) cAvailStorage; if (dAvailStorage <= 5.00) { /* Do some extra processing */ } } } else { /* Error on clean-up program */ UNEXPECTED_HDLER(NULL); /* Return error and exit */ } } else { /* Add code in case you are expecting any other message id */ } } /* Verify if the exit program was called because a LIC Log occurred */ else if (memcmp(watch_option_setting,"*LICLOG ",10)==0) { /* Not needed for this watch session */ } memcpy(error_detected_ptr," ",10); /* No error detected by watch exit program, return blanks and continue watching */ #pragma disable_handler return (0); } /********************************************************************/ /* FUNCTION NAME: UNEXPECTED_HDLER */ /* */ /* FUNCTION : Handle unexpected exceptions that may occur */ /* during the invocation of this pgm. */ /* */ /********************************************************************/ void UNEXPECTED_HDLER (_INTRPT_Hndlr_Parms_T *errmsg) { memcpy(error_detected_ptr,"*ERROR ",10); /* An error occurred on the watch exit program, return *ERROR and End the watch session */ exit(EXIT_FAILURE); }
Parent topic:
Watch for event functionRelated reference
Scenario: Using the watch for event function with an exit program