|
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 +---
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.