/* LOADMOD: Browse member if it exists in current LNKLSTxx -- REXX */ /*********************************************************************/ /* Purpose: BROWSE a link-list member */ /* according to LNKLST00 concatenation */ /* also included are SYS1.SVCLIB and SYS1.LPALIB */ /* Created by David McRitchie, "The REXX Macros Toolbox", 1985/07/10 */ /* Converted to REXX 1994/05/16 with inclusion of CBT 166 $D material*/ /* The LNKLST portion has been redone with material obtained from */ /* from CBT file 166 member $D by Vinh Vu 1992/05/21 of Frito Lay */ /*********************************************************************/ /* Four examples: */ /* ===> LOADMOD IEFBR14 ===> LOADMOD IEFBR14 NB */ /* ===> LOADMOD IEFBR1* ===> LOADMOD IEFBR1* SUMMARY */ /* Options: */ /* SUMMARY, list each dataset checked */ /* NB, no browse, will also cause SUMMARY to be be used */ /* SHORT, do not show MEMBER NOT FOUND in SUMMARY */ /*********************************************************************/ arg Member parm /* supply membername i.e. IEFBR14, IEFBR1*, JES2 */ parm = translate(" "parm" "); member=translate(member) if member = "" then do Zedlmsg = 'Membername required, i.e. ===> TSO LOADMOD IEFBR14' address "ISPEXEC" "setmsg msg(isrz000)" exit 1 end apftable = "Authorized Program Function Table" q.="";found.="";xcnt=0; apfmsgx.="" q.1 = "sys1.svclib"; apfmsgx.1='==APF Lib-' q.2 = "sys1.lpalib"; apfmsgx.2='==APF Lib-' Do qcnt=1 to 20 until (q.qcnt =""); end; qcnt=qcnt-1; /* CBT 166 $D portion -- start -------------------------------------*/ CVTADD = C2X(Storage(10,4)) PTR = D2X(X2D(CVTADD)+196) SMCAADD = C2X(STORAGE(PTR,4)) /* SMCA pointer */ SMFID = Substr(Storage(SMCAADD,20),17,4) /* Get System SMF ID */ SYSIDL = C2D('154'x) /* SYSID offset */ SYSID = Substr(Storage(CVTADD,SYSIDL+4),SYSIDL+1,4) /*------------------------------------------------------------------*/ /* */ /* DISPLAY LINKLIST */ /* */ /* LLT = CVT+x'4DC'(1244) = Pointer to Linklist Table */ /* COUNT will be how many DSNames are in Linklist */ /* */ LLTDISP: LLTOFF = '4DC'x /* Offset of LLT */ LLTOFFD = C2D(LLTOFF) /* Offset in dec */ LLTADD = C2X(Substr((Storage(CVTADD,LLTOFFD+4)),LLTOFFD+1,4)) COUNT = C2D(Substr((Storage(LLTADD,8)),5,4)) LLTDEC = X2D(LLTADD)+9 /* Ptr to Dsn (dec) */ APFDEC = X2D(LLTADD)+8+(45*COUNT) /* Ptr to Flag (dec) */ DO I=1 to COUNT DSNAME=Substr((Storage(D2X(LLTDEC),44)),1,44) LLTDEC = LLTDEC + 45 APFFLAG=Substr((Storage(D2X(APFDEC),1)),1,1) If Bitand(APFFLAG,'80'x) = '80'x Then APFMSG = '- APF Lib -' Else APFMSG = ' -' APFDEC = APFDEC + 1 /* Say Format(I,3,0) ' ' APFMSG DSNAME*/ qcnt=qcnt+1; q.qcnt=strip(dsname); apfmsgx.qcnt = apfmsg end /* CBT 166 $D portion -- start of extracted code -------------------*/ /* last of code from CBT tape 166 which eliminates the need to keep */ /* this execute up to date based on LNKLST00 parmlib member. */ /* qcnt=qcnt+1; q.qcnt = 'TSOTEST.LIB01.LOAD'*/ q.0 = qcnt; nb=0; short=0 If pos(' SUMMARY ',parm) \=0 then summary=1; else summary=0 If pos(' NB ',parm) \= 0 then do;summary=1;NB=1;end;else nb=0 If pos(' SHORT ',parm) \= 0 then do;summary=1;SHORT=1;end;else short=0 If pos('*',member) \= 0 then multimem=1; else if pos('%',member) \= 0 then multimem=1; else multimem=0 If length(member) > 8 then do inval = "Invalid membername length("member") exceeds 8" zedsmsg = "Membername"; zedlmsg=inval; say inval ispexec setmsg msg(isrz000) exit 12 end address "ISPEXEC" "CONTROL ERRORS RETURN" do i = 1 to q.0 dsname = "'"q.i"("member")'" ZEDSMSG = " " if apfmsgx.i = "" then zedlmsg = "************* Not found in the" APFTABLE else zedlmsg = "************* FOUND in the" APFTABLE ADDRESS "ISPEXEC" "SETMSG MSG(ISRZ000)" if multimem=1 then do address "ISPEXEC" "BROWSE DATASET("dsname")" end else do goodbad = sysdsn(dsname) if goodbad = "OK" then do if NB=0 then address "ISPEXEC" "BROWSE DATASET("dsname")" xcnt=xcnt+1; end; found.i=goodbad end; end; zedsmsg=""; zedlmsg=""; address "ISPEXEC" "SETMSG MSG(ISRZ000)" if multimem = 0 then if xcnt = 0 then do "IVL806" member cc = rc if cc = 0 then do say member "exists in a load library, but is not", "known where by the LOADMOD execute, " exit code 1 end if cc = 4 then say member "exists in a load library, but is", "marked NOT-EXECUTABLE" If cc = 8 THEN DO If xcnt = 0 then do say "MEMBER="member" was NOT found in LINKLST libraries" if "OK" = SYSDSN("'TSOTEST.LIB01.LOAD("member")'") then say member "exists in 'TSOTEST.LIB01.LOAD'" exit 1 end end If xcnt = 1 then exit 0 end if summary=1 then "CLS" If xcnt = 0 then do Say "Member="member" was not found in ", "any selected link libraries" end else say "Member="member" was found in" XCNT "link libraries", "sys1.svclib, or sys1.lpalib" If summary = 1 then do say " " Say "SUMMARY FROM ===> TSO LOADMOD" MEMBER "summary" Say " options available NB SUMMARY SHORT" say do i = 1 to q.0 if found.i \= "" then do if short = 0 | found.i \= "MEMBER NOT FOUND" then say right(i,3)"." left(q.i,54) apfmsgx.i found.i end end end