/* RSTLIBL: Restore a job's swapped *libl */ RSTLIBL: PGM PARM(&OPT) DCL VAR(&OPT) TYPE(*CHAR) LEN(9) /********************************************************************/ /* Qualified jobd name breakout... */ DCL VAR(&JOBD) TYPE(*CHAR) LEN(10) DCL VAR(&JOBDLIB) TYPE(*CHAR) LEN(10) /********************************************************************/ /* *Libl working area... */ DCL VAR(&INLLIBL) TYPE(*CHAR) LEN(275) /********************************************************************/ /* To hold a command string -- CHGLIBL... */ DCL VAR(&CMD) TYPE(*CHAR) LEN(300) /********************************************************************/ /* To POP *libls from the *usridx stack... */ DCL VAR(&POP_CTR) TYPE(*DEC) LEN(5) VALUE(0) DCL VAR(&POP_CTR_C) TYPE(*CHAR) LEN(5) + VALUE('00000') DCL VAR(&POP_KEY) TYPE(*CHAR) LEN(5) /********************************************************************/ /* To access the *usridx consistently... */ DCL VAR(&UILIB) TYPE(*CHAR) LEN(10) VALUE(QTEMP) DCL VAR(&UINAM) TYPE(*CHAR) LEN(10) + VALUE(SWPLIBLIDX) DCL VAR(&UIINITKEY) TYPE(*CHAR) LEN(5) + VALUE('00000') DCL VAR(&UIORGKEY) TYPE(*CHAR) LEN(5) + VALUE('00001') DCL VAR(&UIKLEN) TYPE(*DEC) LEN(5 0) VALUE(5) DCL VAR(&UIELEN) TYPE(*DEC) LEN(5 0) VALUE(280) DCL VAR(&UINBRRTV) TYPE(*CHAR) LEN(4) DCL VAR(&UIENT) TYPE(*CHAR) LEN(1008) DCL VAR(&UIELENOFFS) TYPE(*CHAR) LEN(1008) DCL VAR(&HEX0000) TYPE(*CHAR) LEN(4) + VALUE(X'00000000') /********************************************************************/ MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(STDERR)) /* Get the swapped-out *libl from the *usridx we stashed it in... */ /* And if the *usridx ain't there, then reset to initial default */ /* taken from the *usrprf *jobd... */ CHKOBJ OBJ(&UILIB/&UINAM) OBJTYPE(*USRIDX) MONMSG MSGID(CPF0000) EXEC(DO) IF COND(&OPT *EQ '*POP') THEN(SNDPGMMSG MSGID(CPF9898) + MSGF(QCPFMSG) MSGDTA('Cannot *POP. No *libl stack + found') MSGTYPE(*ESCAPE)) RTVUSRPRF JOBD(&JOBD) JOBDLIB(&JOBDLIB) RTNJOBDILL JOBD(&JOBDLIB/&JOBD) INLLIBL(&INLLIBL) GOTO CMDLBL(BLD_CHGLL) ENDDO /* For *POP, we get the *POP counter, retrieve the *POP entry, */ /* delete the *POP entry, and then update the *POP counter... */ IF COND(&OPT *EQ '*POP') THEN(DO) RTVUSRIDXE ENTRTV(&UIENT) ENTLENOFFS(&UIELENOFFS) + NBRENTRTV(&UINBRRTV) + USRIDX(&UILIB/&UINAM) SCHCTA(&UIINITKEY) + SCHCTALEN(&UIKLEN) IF COND(&UINBRRTV *EQ &HEX0000) THEN(SNDPGMMSG + MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('No + *usridx header found. Notify DP') + MSGTYPE(*ESCAPE)) IF COND(%SST(&UIENT 14 5) *EQ '00000') + THEN(SNDPGMMSG MSGID(CPF9898) + MSGF(QCPFMSG) MSGDTA('Cannot *POP past + original *libl. Notify DP') MSGTYPE(*ESCAPE)) /* First 8 is bytes avail/returned; next 5 are KEY... */ /* Get the data portion, decrement the *POP counter, and update it..*/ CHGVAR VAR(&POP_CTR_C) VALUE(%SST(&UIENT 14 5)) CHGVAR VAR(&POP_KEY) VALUE(&POP_CTR_C) CHGVAR VAR(&POP_CTR) VALUE(&POP_CTR_C) CHGVAR VAR(&POP_CTR) VALUE(&POP_CTR - 1) CHGVAR VAR(&POP_CTR_C) VALUE(&POP_CTR) RTVUSRIDXE ENTRTV(&UIENT) ENTLENOFFS(&UIELENOFFS) + NBRENTRTV(&UINBRRTV) + USRIDX(&UILIB/&UINAM) SCHCTA(&POP_KEY) + SCHCTALEN(&UIKLEN) /* Get the *POP + entry... */ IF COND(&UINBRRTV *EQ &HEX0000) THEN(SNDPGMMSG + MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('No + *POP library list entry found. Notify + DP') MSGTYPE(*ESCAPE)) DLTUSRIDXE USRIDX(&UILIB/&UINAM) RMVCRIT(&POP_KEY) + RMVCRITLEN(&UIKLEN) /* Now delete this *POP entry. + We won't need it again now that we've popped it + back... */ ADDUSRIDXE USRIDX(&UILIB/&UINAM) IDXENTRY(&UIINITKEY *CAT + &POP_CTR_C *CAT ' ') ENTLEN(&UIELEN) + INSTYPE(*REPLACE) /* Change the *POP counter to + indicate we've removed one from the stack... */ ENDDO /* For *ORIGINAL, we simply get the first entry and then delete */ /* the entire *usridx... */ ELSE CMD(DO) RTVUSRIDXE ENTRTV(&UIENT) ENTLENOFFS(&UIELENOFFS) + NBRENTRTV(&UINBRRTV) + USRIDX(&UILIB/&UINAM) SCHCTA(&UIORGKEY) + SCHCTALEN(&UIKLEN) /* Get the *ORIGINAL + entry... */ IF COND(&UINBRRTV *EQ &HEX0000) THEN(SNDPGMMSG + MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('No + *ORIGINAL library list entry found. + Notify DP') MSGTYPE(*ESCAPE)) DLTUSRIDX USRIDX(&UILIB/&UINAM) ENDDO /* First 8 is bytes avail/returned; next 5 are KEY... */ /* Whichever index entry we've ended up with, grab its *libl... */ CHGVAR VAR(&INLLIBL) VALUE(%SST(&UIENT 14 275)) /* Build a CHGLIBL command string... */ /* It has to be a command string because &INLLIBL is a string */ /* of words; NOT a list... */ BLD_CHGLL: CHGVAR VAR(&CMD) VALUE('CHGLIBL LIBL(' *CAT + &INLLIBL *CAT ')') /* Execute the CHGLIBL... */ PRCCMD CMD(&CMD) CMDLEN(300) RETURN STDERR: MOVDIAGMSG MONMSG MSGID(CPF0000 MCH0000) RSNESCMSG MONMSG MSGID(CPF0000 MCH0000) ENDPGM