|
Many thanks Lo. jeff -----Original Message----- From: Raikov, Lo Sent: Friday, June 23, 2000 12:40 PM To: Bull, Jeff Subject: RE: SAVRSTLIB SAVRSTLIB makes use of the mode QSOCCT and runs on the target machine with the same effective profile as the source job. It is an APPC application, and as such, is controlled by the comms entries in the subsystems. It is extremely easy to block all external SAVRSTLIB requests; writing a "clever" exit point that would only allow some SAVRSTLIBs is a different matter. I don't remember whether there is an appropriate system exit point you can use, but it's worth checking with the manual. Lo -----Original Message----- From: Bull, Jeff To: 'MIDRANGE-L@midrange.com' Sent: 6/23/00 6:04 PM Subject: RE: SAVRSTLIB Hi guys, have you seen the coding necessary to put a VCP on a save/restore command, disentangling the variable format data passed by the CP to the VCP is horrendous (see below) - and you will probably need to re-visit the VCP each time you upgrade. I may have to bite the bullit and implement this, but I was hoping that there may be a communications or routing entry in the QCMN *sbs, or similar, that could be tweaked to reject all savrstlib requests - much less effort to set up and no residual code-maintenance issues. It is my belief that the savrstlib process invokes a job on the target machine, can we get at the jobd or some other necessary object - the user profile the invoked job runs under? Or what about the command/program it uses to restore the data on the target machine ? Regards, Jeff B. N.B. Disclaimer: The code below is included as an example of a more complex VCP only. It has NOT been thoroughly tested as you can see from the inclusion of some code to assist debug/testing; it has not been implemented anywhere, I do not advise that you do. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* M i d a s - K a p i t i I n t e r n a t i o n a l L t d */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Application : MKI Library Management */ /* Program Id . : QCKRSAVRL */ /* Program Name : Save Restore Library Command Validity Checker */ /* Version . . : 01.00 */ /* Author . . . : Jeffrey E Bull */ /* Date . . . . : Apr/2000 */ /* Processing . : */ /* INITIALISATION */ /* Trap Unmonitored Error Messages */ /* Check if user is a KLIBMGT user */ /* PROCESSING */ /* Unpack the variable-format command-string &CMD */ /* LIB number of elements */ /* LIB(n) loop control */ /* LIB(n) field-len */ /* LIB(n) data */ /* RMTLOCNAME data */ /* STRLIB field-len */ /* STRLIB data */ /* OMITLIB number of elements */ /* OMITLIB(n) loop control */ /* OMITLIB(n) field-len */ /* OMITLIB(n) data */ /* OMITOBJ number of objects */ /* Bypass object-start off-sets */ /* Object(n) loop control */ /* Bypass object(n) name-delimiter */ /* Object(n) name data */ /* Object(n) library data */ /* Object(n) type data */ /* Remove leading space */ /* TGTRLS data */ /* PRECHK data */ /* SAVACT data */ /* SAVACTWAIT - 4-byte-binary value */ /* SAVACTMSGQ data */ /* ACCPTH data */ /* SAVFDTA data */ /* STG data */ /* OPTION data */ /* MBROPT data */ /* ALWOBJDIF data */ /* RSTLIB field-len */ /* RSTLIB data */ /* RSTASP 2-byte-binary value */ /* Resolve a logical value of RSTLIB */ /* Is RSTLIB a KREL controlled library ? */ /* Is SAVRSTLIB authorised ? */ /* Disallowed restore message */ /* UNMONITORED ERROR HANDLING */ /* Process Diagnostic Messages */ /* Put Keyword(value)'s into Joblog */ /* Print Diagnostics */ /* Process Exception Message */ /* PROGRAM EXIT */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Modification History. */ /* --------------------- */ /* Version Date Description */ /* xx.xx dd/mm/yy xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* N.B. */ /* These 'dummy' fields in the parameter list are there to provide */ /* a valid call from the Command Handler Program. The command data */ /* is ALL supplied in &CMD and is variable in format ! i.e. the */ /* field lengths, element counters etc need to be processed and the */ /* actual parameter values picked out - a lovely old job. */ PGM PARM(&CMD &DUM1 &DUM2 &DUM3 &DUM4 &DUM5 + &DUM6 &DUM7 &DUM8 &DUM9 &DUM10 &DUM11 + &DUM12 &DUM13 &DUM14 &DUM15 &DUM16 &DUM17 + &DUM18) /* Input Parameters */ DCL VAR(&CMD) TYPE(*CHAR) LEN(9999) DCL VAR(&DUM1) TYPE(*CHAR) LEN(1) DCL VAR(&DUM2) TYPE(*CHAR) LEN(1) DCL VAR(&DUM3) TYPE(*CHAR) LEN(1) DCL VAR(&DUM4) TYPE(*CHAR) LEN(1) DCL VAR(&DUM5) TYPE(*CHAR) LEN(1) DCL VAR(&DUM6) TYPE(*CHAR) LEN(1) DCL VAR(&DUM7) TYPE(*CHAR) LEN(1) DCL VAR(&DUM8) TYPE(*CHAR) LEN(1) DCL VAR(&DUM9) TYPE(*CHAR) LEN(1) DCL VAR(&DUM10) TYPE(*CHAR) LEN(1) DCL VAR(&DUM11) TYPE(*CHAR) LEN(1) DCL VAR(&DUM12) TYPE(*CHAR) LEN(1) DCL VAR(&DUM13) TYPE(*CHAR) LEN(1) DCL VAR(&DUM14) TYPE(*CHAR) LEN(1) DCL VAR(&DUM15) TYPE(*CHAR) LEN(1) DCL VAR(&DUM16) TYPE(*CHAR) LEN(1) DCL VAR(&DUM17) TYPE(*CHAR) LEN(1) DCL VAR(&DUM18) TYPE(*CHAR) LEN(1) /* Call Parameters extracted from variable format &CMD */ DCL VAR(&LIB) TYPE(*CHAR) LEN(3000) DCL VAR(&RMTLOCNAME) TYPE(*CHAR) LEN(17) DCL VAR(&STRLIB) TYPE(*CHAR) LEN(10) DCL VAR(&OMITLIB) TYPE(*CHAR) LEN(3000) DCL VAR(&OMITOBJ) TYPE(*CHAR) LEN(3000) DCL VAR(&TGTRLS) TYPE(*CHAR) LEN(10) DCL VAR(&PRECHK) TYPE(*CHAR) LEN(4) DCL VAR(&SAVACT) TYPE(*CHAR) LEN(8) DCL VAR(&SAVACTWAIT) TYPE(*CHAR) LEN(11) DCL VAR(&SAVACTMSGQ) TYPE(*CHAR) LEN(20) DCL VAR(&ACCPTH) TYPE(*CHAR) LEN(4) DCL VAR(&SAVFDTA) TYPE(*CHAR) LEN(4) DCL VAR(&STG) TYPE(*CHAR) LEN(5) DCL VAR(&OPTION) TYPE(*CHAR) LEN(5) DCL VAR(&MBROPT) TYPE(*CHAR) LEN(6) DCL VAR(&ALWOBJDIF) TYPE(*CHAR) LEN(5) DCL VAR(&RSTLIB) TYPE(*CHAR) LEN(10) DCL VAR(&RSTASP) TYPE(*CHAR) LEN(7) DCL VAR(&FRCOBJCVN) TYPE(*CHAR) LEN(11) /* Work fields */ DCL VAR(&GRPPRF) TYPE(*CHAR) LEN(10) DCL VAR(&IDX) TYPE(*DEC) LEN(4 0) DCL VAR(&ITMCNT) TYPE(*DEC) LEN(4 0) DCL VAR(&KRL) TYPE(*CHAR) LEN(10) DCL VAR(&KRLIND) TYPE(*CHAR) LEN(1) DCL VAR(&MGTUSR) TYPE(*CHAR) LEN(10) + VALUE('KLIBMGT') DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(512) DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) DCL VAR(&SST) TYPE(*DEC) LEN(4 0) DCL VAR(&SUPGRPPRF) TYPE(*CHAR) LEN(150) DCL VAR(&WC1) TYPE(*CHAR) LEN(1) DCL VAR(&WC2) TYPE(*CHAR) LEN(2) DCL VAR(&WC10) TYPE(*CHAR) LEN(10) DCL VAR(&WC0160) TYPE(*CHAR) LEN(160) DCL VAR(&WD2) TYPE(*DEC) LEN(2 0) DCL VAR(&WD3) TYPE(*DEC) LEN(3 0) DCL VAR(&WD5A) TYPE(*DEC) LEN(5 0) DCL VAR(&WD5B) TYPE(*DEC) LEN(5 0) /* INITIALISATION */ /* Trap Unmonitored Error Messages */ MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO + CMDLBL(LBL900)) RTVUSRPRF USRPRF(*CURRENT) GRPPRF(&GRPPRF) + SUPGRPPRF(&SUPGRPPRF) CHGVAR VAR(&WC0160) VALUE(&GRPPRF || &SUPGRPPRF) /* Check if user is a KLIBMGT user */ CHGVAR VAR(&WD2) VALUE(0) LBL010: CHGVAR VAR(&WD2) VALUE(&WD2 + 1) IF COND(&WD2 *GT 16) THEN(GOTO CMDLBL(LBL100)) CHGVAR VAR(&WD3) VALUE((&WD2 * 10) - 9) IF COND(%SST(&WC0160 &WD3 10) = &MGTUSR) + THEN(GOTO CMDLBL(LBL990)) /* Allow */ GOTO CMDLBL(LBL010) /* PROCESSING */ /* Unpack the variable-format command-string &CMD */ /* (Objective is to extract SAVLIB and RSTLIB values) */ /* Hold-on-tight if you're working on this for the first time */ LBL100: CHGVAR VAR(&IDX) VALUE(1) /* LIB number of elements */ LIB: CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) CHGVAR VAR(&ITMCNT) VALUE(0) /* LIB(n) loop control */ LIB2: CHGVAR VAR(&ITMCNT) VALUE(&ITMCNT + 1) IF COND(&ITMCNT *GT &WD5A) THEN(GOTO + CMDLBL(RMTLOCNAME)) /* LIB(n) field-len */ CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5B) /* LIB(n) data */ CHGVAR VAR(&SST) VALUE((&ITMCNT * 10) - 9) CHGVAR VAR(%SST(&LIB &SST 10)) + VALUE(%SST(&CMD &IDX &WD5B)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) GOTO CMDLBL(LIB2) /* RMTLOCNAME data */ RMTLOCNAME: CHGVAR VAR(&RMTLOCNAME) VALUE(%SST(&CMD &IDX 17)) CHGVAR VAR(&IDX) VALUE(&IDX + 17) /* STRLIB field-len */ STRLIB: CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) /* STRLIB data */ CHGVAR VAR(&STRLIB) VALUE(%SST(&CMD &IDX &WD5A)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) /* OMITLIB number of elements */ OMITLIB: CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) CHGVAR VAR(&ITMCNT) VALUE(0) /* OMITLIB(n) loop control */ OMITLIB2: CHGVAR VAR(&ITMCNT) VALUE(&ITMCNT + 1) IF COND(&ITMCNT *GT &WD5A) THEN(GOTO + CMDLBL(OMITOBJ)) /* OMITLIB(n) field-len */ CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5B) /* OMITLIB(n) data */ CHGVAR VAR(&SST) VALUE((&ITMCNT * 10) - 9) CHGVAR VAR(%SST(&OMITLIB &SST 10)) + VALUE(%SST(&CMD &IDX &WD5B)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) GOTO CMDLBL(OMITLIB2) /* OMITOBJ number of objects */ OMITOBJ: CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) /* Bypass object-start off-sets */ CHGVAR VAR(&IDX) VALUE(&IDX + (&WD5A * 2)) /* Object(n) loop control */ CHGVAR VAR(&ITMCNT) VALUE(0) OMITOBJ2: CHGVAR VAR(&ITMCNT) VALUE(&ITMCNT + 1) IF COND(&ITMCNT *GT &WD5A) THEN(GOTO + CMDLBL(OMITOBJ3)) /* Bypass object-name-delimiter */ CHGVAR VAR(&IDX) VALUE(&IDX + 2) /* Object(n) name data */ CHGVAR VAR(&OMITOBJ) VALUE(&OMITOBJ *BCAT '(' *CAT + %SST(&CMD &IDX 10)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) /* Object(n) library data */ CHGVAR VAR(&OMITOBJ) VALUE(&OMITOBJ *BCAT + %SST(&CMD &IDX 10)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) /* Object(n) type data */ CHGVAR VAR(&OMITOBJ) VALUE(&OMITOBJ *BCAT %SST(&CMD + &IDX 7) *TCAT ')') CHGVAR VAR(&IDX) VALUE(&IDX + 7) GOTO CMDLBL(OMITOBJ2) /* Remove leading space */ OMITOBJ3: IF COND(%SST(&OMITOBJ 1 1) *EQ ' ') THEN(CHGVAR + VAR(&OMITOBJ) VALUE(%SST(&OMITOBJ 2 1999))) /* TGTRLS data */ TGTRLS: CHGVAR VAR(&TGTRLS) VALUE(%SST(&CMD &IDX 10)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) /* PRECHK data */ PRECHK: CHGVAR VAR(&PRECHK) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* SAVACT data */ SAVACT: CHGVAR VAR(&SAVACT) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* SAVACTWAIT - 4-byte-binary value */ SAVACTWAIT: CHGVAR VAR(&IDX) VALUE(&IDX + 2) CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) CHGVAR VAR(&SAVACTWAIT) VALUE(&WD5A) /* SAVACTMSGQ data */ SAVACTMSGQ: CHGVAR VAR(&SAVACTMSGQ) VALUE(%SST(&CMD &IDX 20)) CHGVAR VAR(&IDX) VALUE(&IDX + 20) /* ACCPTH data */ ACCPTH: CHGVAR VAR(&ACCPTH) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* SAVFDTA data */ SAVFDTA: CHGVAR VAR(&SAVFDTA) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* STG data */ STG: CHGVAR VAR(&STG) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* OPTION data */ OPTION: CHGVAR VAR(&OPTION) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* MBROPT data */ MBROPT: CHGVAR VAR(&MBROPT) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* ALWOBJDIF data */ ALWOBJDIF: CHGVAR VAR(&ALWOBJDIF) VALUE(%SST(&CMD &IDX 1)) CHGVAR VAR(&IDX) VALUE(&IDX + 1) /* RSTLIB field-len */ RSTLIB: CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) /* RSTLIB data */ CHGVAR VAR(&RSTLIB) VALUE(%SST(&CMD &IDX &WD5A)) CHGVAR VAR(&IDX) VALUE(&IDX + 10) /* RSTASP 2-byte-binary value */ RSTASP: CHGVAR VAR(&WC2) VALUE(%SST(&CMD &IDX 2)) CHGVAR VAR(&IDX) VALUE(&IDX + 2) CVTBINDEC FROMBIN(&WC2) TODEC(&WD5A) CHGVAR VAR(&RSTASP) VALUE(&WD5A) /* Resolve a logical value of RSTLIB */ IF COND(&RSTLIB *EQ '*SAVLIB') THEN(CHGVAR + VAR(&RSTLIB) VALUE(%SST(&LIB 1 10))) /* KREL Library(n) loop Initialisation */ RTVDTAARA DTAARA(*LIBL/QCKRKREL) RTNVAR(&KRL) OVRDBF FILE(KZCOMP01) TOFILE(&KRL/KZCOMP01) + MBR(*FIRST) OVRSCOPE(*ACTGRPDFN) CHGVAR VAR(&KRLIND) VALUE('0') CHGVAR VAR(&ITMCNT) VALUE(0) /* KREL Library(n) loop control */ KREL: CHGVAR VAR(&ITMCNT) VALUE(&ITMCNT + 1) CHGVAR VAR(&SST) VALUE((&ITMCNT * 10) - 9) CHGVAR VAR(&WC10) VALUE(%SST(&LIB &SST 10)) IF COND(&WC10 *EQ ' ') THEN(GOTO + CMDLBL(KREL2)) /* Exit Loop */ /* Library-object check */ CHKOBJ OBJ(QSYS/&WC10) OBJTYPE(*LIB) MONMSG MSGID(CPF9802 CPF9815 CPF9830 CPF9899) + EXEC(GOTO CMDLBL(LBL900)) /* Errors */ MONMSG MSGID(CPF9801 CPF9810) /* Is Lib a KREL controlled library ? */ CALL PGM(*LIBL/KX504R) PARM(&WC10 &WC1) IF COND(&WC1 *EQ '1') THEN(DO) SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA('0000 + SAVRSTLIB(' *TCAT &WC10 *TCAT ') is a + protected Master Product library.') + TOPGMQ(*PRV) MSGTYPE(*DIAG) CHGVAR VAR(&KRLIND) VALUE('1') ENDDO GOTO CMDLBL(KREL) /* KREL Loop Exit Procedure */ KREL2: DLTOVR FILE(KZCOMP01) LVL(*ACTGRPDFN) RCLRSC /* Disallowed restore escape message */ IF COND(&KRLIND *EQ '1') THEN(DO) SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) ENDDO GOTO CMDLBL(LBL990) /* UNMONITORED ERROR HANDLING */ /* Process Diagnostic Messages */ LBL900: RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) MSGFLIB(&MSGFLIB) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(LBL910)) IF COND(&MSGID = ' ') THEN(GOTO + CMDLBL(LBL910)) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) TOPGMQ(*PRV) MSGTYPE(*DIAG) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(LBL910)) GOTO CMDLBL(LBL900) /* Put Keyword(value)'s into Joblog */ LBL910: SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('LIB(' |< &LIB |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('RMTLOCNAME(' |< &RMTLOCNAME |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('STRLIB(' |< &STRLIB |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('OMITLIB(' |< &OMITLIB |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('OMITOBJ(' |< &OMITOBJ |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('TGTRLS(' |< &TGTRLS |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('PRECHK(' |< &PRECHK |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('SAVACT(' |< &SAVACT |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('SAVACTWAIT(' |< &SAVACTWAIT |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('SAVACTMSGQ(' |< &SAVACTMSGQ |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('ACCPTH(' |< &ACCPTH |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('SAVFDTA(' |< &SAVFDTA |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('STG(' |< &STG |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('OPTION(' |< &OPTION |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('MBROPT(' |< &MBROPT |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('ALWOBJDIF(' |< &ALWOBJDIF |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('RSTLIB(' |< &RSTLIB |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('RSTASP(' |< &RSTASP |< ')') SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA('FRCOBJCVN(' |< &FRCOBJCVN |< ')') /* Print Diagnostics */ OVRPRTF FILE(QPJOBLOG) HOLD(*YES) DSPJOB JOB(*) OUTPUT(*PRINT) OPTION(*JOBLOG) MONMSG MSGID(CPF0000) OVRPRTF FILE(QPPGMDMP) HOLD(*YES) DMPCLPGM MONMSG MSGID(CPF0000) DLTOVR FILE(QPJOBLOG) MONMSG MSGID(CPF0000) DLTOVR FILE(QPPGMDMP) MONMSG MSGID(CPF0000) /* Process Exception Message */ RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) MSGFLIB(&MSGFLIB) MONMSG MSGID(CPF0000) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) TOPGMQ(*PRV) MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000) /* Program Exit */ LBL990: RETURN ENDPGM -----Original Message----- From: Douglas Handy [mailto:dhandy1@bellsouth.net] Sent: Thursday, June 22, 2000 6:54 PM To: MIDRANGE-L@midrange.com Subject: Re: SAVRSTLIB Al, >If I'm not mistaken, once you issue the SAVRSTLIB command on the source >system, everything else happens under the covers. Hmm, I guess you are right again. This means you'd have to put the VCP on each target machine which makes implementation and maintenance much harder. Sorry, Doug +--- | This is the Midrange System Mailing List! | To submit a new message, send your mail to MIDRANGE-L@midrange.com. | To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com. | To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com. | Questions should be directed to the list owner/operator: david@midrange.com +--- +--- | This is the Midrange System Mailing List! | To submit a new message, send your mail to MIDRANGE-L@midrange.com. | To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com. | To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com. | Questions should be directed to the list owner/operator: david@midrange.com +--- +--- | This is the Midrange System Mailing List! | To submit a new message, send your mail to MIDRANGE-L@midrange.com. | To subscribe to this list send email to MIDRANGE-L-SUB@midrange.com. | To unsubscribe from this list send email to MIDRANGE-L-UNSUB@midrange.com. | Questions should be directed to the list owner/operator: david@midrange.com +---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.