PGM DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) VALUE(DBGMSGF) MONMSG MSGID(CPF0000) ADDMSGD MSGID(EMS0000) MSGF(DBG400/DBGMSGF) MSG('&1') SEV(00) + FMT((*CHAR 512)) DMPLST(*JOB) ALROPT(*NO) LOGPRB(*NO) + CCSID(65535) ADDMSGD MSGID(EMS0999) MSGF(DBG400/DBGMSGF) MSG('Command &1, sent by + job &2/&3/&4, has been run by user &5.') SECLVL('Cause: &N + Either the SNDUSRCMD or SNDWKSCMD command has been executed + from job &2/&3/&4. Command &1 was sent as a message to &5, + which was interpreted and run by the message handling + program for user/workstation &5. &N Recovery: &N No action + need be taken - this is for auditing purposes only.') + SEV(00) FMT((*CHAR 512) (*CHAR 10) (*CHAR 10) (*CHAR + 6) (*CHAR 10)) DMPLST(*JOB) ALROPT(*NO) LOGPRB(*NO) + CCSID(65535) RETURN ENDPGM ::PARSER::MMSMSGF CLP QCLSRC ADDMSGD commands to recreate this message file PGM PARM(&COMMAND &USER) DCL VAR(&COMMAND) TYPE(*CHAR) LEN(512) DCL VAR(&USER) TYPE(*CHAR) LEN(10) SNDUSRMSG MSGID(EMS0000) MSGF(DBG400/DBGMSGF) + MSGDTA(&COMMAND) MSGTYPE(*INFO) TOUSR(&USER) ENDPGM ::PARSER::SNDUSRCMD CLP QCLSRC Send User Command PGM PARM(&COMMAND &WORKSTN) DCL VAR(&COMMAND) TYPE(*CHAR) LEN(512) DCL VAR(&WORKSTN) TYPE(*CHAR) LEN(10) SNDUSRMSG MSGID(EMS0000) MSGF(DBG400/DBGMSGF) + MSGDTA(&COMMAND) MSGTYPE(*INFO) + TOMSGQ(&WORKSTN) ENDPGM ::PARSER::SNDWKSCMD CLP QCLSRC Send workstation command PGM CHGMSGQ MSGQ(*USRPRF) DLVRY(*BREAK) PGM(FWDMSGHLD) + /* Messages held */ MONMSG MSGID(CPF2451) /* Ignore if already + allocated */ CHGMSGQ MSGQ(*WRKSTN) DLVRY(*BREAK) PGM(FWDMSGHLD) + /* Messages held */ ENDPGM ::PARSER::MMSCL122 CLP QCLSRC Set Initial Message Delivery CMD PROMPT('Send User Command') PARM KWD(COMMAND) TYPE(*CMDSTR) LEN(512) MIN(1) + PROMPT('Command to run') PARM KWD(USER) TYPE(*SNAME) LEN(10) MIN(1) + PROMPT('User name') ::PARSER::SNDUSRCMD CMD QCMDSRC Send user command CMD PROMPT('Send WrkStn Command') PARM KWD(COMMAND) TYPE(*CMDSTR) LEN(512) MIN(1) + PROMPT('Command to run') PARM KWD(WORKSTN) TYPE(*SNAME) LEN(10) MIN(1) + PROMPT('Workstation name') ::PARSER::SNDWKSCMD CMD QCMDSRC Send workstation command PGM PARM(&MSGQ &MSGQLIB &MSGKEY) DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) DCL VAR(&MSGQ) TYPE(*CHAR) LEN(10) DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(10) DCL VAR(&MSGTXT) TYPE(*CHAR) LEN(512) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTALEN) TYPE(*DEC) LEN(5 0) DCL VAR(&SEV) TYPE(*DEC) LEN(2 0) DCL VAR(&DTALEN) TYPE(*DEC) LEN(15 5) DCL VAR(&REVERSE) TYPE(*CHAR) LEN(1) VALUE(X'23') DCL VAR(&NORMAL) TYPE(*CHAR) LEN(1) VALUE(X'20') DCL VAR(&FULLTEXT) TYPE(*CHAR) LEN(512) DCL VAR(&CURUSER) TYPE(*CHAR) LEN(10) DCL VAR(&SENDER) TYPE(*CHAR) LEN(80) DCL VAR(&QHSTMSGDTA) TYPE(*CHAR) LEN(548) RCVMSG MSGQ(&MSGQLIB/&MSGQ) MSGKEY(&MSGKEY) + RMV(*NO) MSG(&MSGTXT) MSGID(&MSGID) SEV(&SEV) /* IF SEVERITY = 99, THEN MESSAGE EXPECTS REPLY. USE DSPMSG PGM */ IF COND(&SEV *EQ 99) THEN(DO) DSPMSG GOTO CMDLBL(ENDPGM) ENDDO /* SPECIAL PROCESSING FOR USER COMMAND REQUEST */ IF COND(&MSGID *EQ 'EMS0000') THEN(DO) RCVMSG MSGQ(&MSGQLIB/&MSGQ) MSGKEY(&MSGKEY) + RMV(*YES) MSG(&MSGTXT) + MSGDTALEN(&MSGDTALEN) MSGID(&MSGID) + SENDER(&SENDER) CHGVAR VAR(&DTALEN) VALUE(&MSGDTALEN) CALL PGM(QCMDEXC) PARM(&MSGTXT &DTALEN) RTVJOBA USER(&CURUSER) CHGVAR VAR(&QHSTMSGDTA) VALUE(&MSGTXT || + %SST(&SENDER 1 26) || &CURUSER) SNDPGMMSG MSGID(EMS0999) MSGF(DBG400/DBGMSGF) + MSGDTA(&QHSTMSGDTA) TOMSGQ(QHST) GOTO CMDLBL(ENDPGM) ENDDO ENDPGM: ENDPGM RETURN ::PARSER::FWDMSGHLD CLP QCLSRC Forward messages (HOLD)