© unknownartist@newsgroup

The program provides you with most of the information which may be of interest during the course of processing. Just one example: With the aid of the program name REXX is able to determine whether it runs under IKJEFT01 (TSO) or IRXJCL (the Batch Interface of REXX). Often enough this is a crucial bit of information as the number of TSO functionalities available under IRXJCL is very limited.

Essentially these are:


For a better overview of the individual function results, a driver program is encluded as well as the actual program itself which calls the individual functions one by one and produces a summary of all information collected. Space is returned for values without a valid result.

The programm SYSINFO
/* REXX * SYSINFO
*/

if arg() = 0 then return "ERROR (Parameter fehlt)"

main_start:

   _info = translate(arg(1))
   if words(_info) > 1 then parse var _info _info parms
   _progname = left(prog_name(),3)
   select
     when _info = "JOBNAME"  then erg = stor_infos("JOBNAME")
     when _info = "JOBTYP"   then erg = stor_infos("JOBTYP")
     when _info = "JOBNUM"   then erg = stor_infos("JOBNUM")
     when _info = "STEPNAME" then erg = stor_infos("STEPNAME")
     when _info = "PROCSTEP" then erg = stor_infos("PROCSTEP")
     when _info = "SYSLEVEL" then erg = stor_infos("SYSLEVEL")
     when _info = "JES"      then erg = stor_infos("JES")
     when _info = "SYSID"    then erg = stor_infos("SYSID")
     when _info = "IPLVOL"   then erg = stor_infos("IPLVOL")
     when _info = "NJENODE"  then erg = stor_infos("NJENODE")
     when _info = "PROC"     then erg = stor_infos("PROC")
     when _info = "IPLDATE"  then erg = stor_infos("IPLDATE")
     when _info = "IPLDAY"   then erg = stor_infos("IPLDAY")
     when _info = "IPLTAG"   then erg = stor_infos("IPLTAG")
     when _info = "IPLTIME"  then erg = stor_infos("IPLTIME")
     when _info = "PROGNAME" then erg = prog_name()
     when _info = "SMIPS"    then erg = get_mips("S")
     when _info = "TMIPS"    then erg = get_mips("T")
     when _info = "ISPFSCRN" then erg = ispf_screens()
     otherwise                    erg = "ERROR"
   end

main_ende:
return erg


get_mips: procedure
   arg parm
   if parm <> "S" then parm = "T"
   CVT  = STORAGE(10,4)
   RMCT = STORAGE(D2X(C2D(CVT)+604),4)
   SU   = STORAGE(D2X(C2D(RMCT)+64),4)
   SU   = 16000000/C2D(SU)
   CVTPCCAT = STORAGE(D2X(C2D(CVT)+764),4)
   I = 0
   P = 0
   DO WHILE I < 16
   PCCA   = STORAGE(D2X(C2D(CVTPCCAT)+I*4),4)
   IF PCCA  ^= '00000000'X THEN DO
      PCCAPCCA = STORAGE(D2X(C2D(PCCA)),4)
      PCCAVC   = STORAGE(D2X(C2D(PCCA)+4),2)
      PCCACPID = STORAGE(D2X(C2D(PCCA)+6),6)
      PCCAMDL  = STORAGE(D2X(C2D(PCCA)+12),4)
      IF PCCAPCCA = 'PCCA' THEN DO
         P = P + 1
         END
      END
   I = I + 1
   END
   IF P > 1 THEN PROCS = 'PROCESSORS'
            ELSE PROCS = 'PROCESSOR'
   MIPS = SU/48.5
  MSU = SU*P*3600/1000000
  if parm = "S" then erg= mips p
  else erg = mips * p
return erg
/* ENDE MIPS */

get_lpar_name: procedure
/*---REXX--EXEC-GETSMFID---*/
  SMCA = D2X(C2D(STORAGE(10,4))+197)
  SMFID = D2X(C2D(STORAGE(SMCA,3))+16)
  SMFID = STORAGE(SMFID,4)
   SAY 'LPAR  IS' SMFID
  EXIT


prog_name: procedure
   /*
   From:    wooda@IBM.NET
   Subject: How to find program executin environment under MVS
   Andy Wood
   */
   xp      = storage(0000021c,4)
   xp2     = ptr2(xp,'b4'x)
   xp3      = d2x(c2d(xp2) + c2d('168'x))
   progname = storage(xp3,8)
   return progname

   ptr2: procedure
     address = c2d(arg(1))
     offset  = c2d(arg(2))
     return storage(d2x(address+offset),4)
   return
/* ENDE job_step_exec_name */


stor_infos: procedure expose _progname
   /* diverse infos aus der Task-Control-Table */
   arg infotyp
   CVT      = C2d(Storage(10,4))/* point to CVT */
   tcb      = storage(21c,4)
   tiot     = storage(d2x(c2d(tcb)+12),4)
   jscb     = storage(d2x(c2d(tcb)+180),4)
   ssib     = storage(d2x(c2d(jscb)+316),4)
   jobname  = strip(storage(d2x(c2d(tiot)),8))
   jobtype  = storage(d2x(c2d(ssib)+12),3)
   jobnum   = strip(storage(d2x(c2d(ssib)+15),5),l,0)
   stepname = strip(storage(d2x(c2d(tiot)+8),8),l,0)
   procstep = strip(storage(d2x(c2d(tiot)+16),8),l,0)

   /* */
   SMCA = Storage(D2x(CVT + 196),4) /* point to SMCA*/
   SMCA = Bitand(SMCA,'7FFFFFFF'x)/* zero high order bit*/
   SMCA = C2d(SMCA) /* convert to decimal */

   /*
   The IPL date is stored in packed decimal format - so to make
   the date printable, it needs to be converted back to hex and
   the packed sign needs to be removed.
   */
   IPLTIME= C2d(Storage(D2x(SMCA + 336),4)) /* IPL Time - binary*/
   IPLDATE= C2d(Storage(D2x(SMCA + 340),4)) /* IPL Date - 0CYYDDDF*/
   IPLDATE= D2x(IPLDATE) /* convert back to hex*/
   parse var IPLDATE . 2 IPLDATE 7 .
   iplday = date('w',ipldate,'j')
   x = wordpos(left(iplday,2),"Mo Tu We Th Fr Sa Su")
   y = "Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag"
   ipltag = word(y,x)
   parse value date('s',ipldate,'j') with 1 jjjj 5 mm 7 dd
   ipldate= dd"."mm"."jjjj
   IPLTIME= IPLTIME / 100 /* remove hundreths */
   HH = IPLTIME % 3600/* IPL hour */
   MM = (IPLTIME - (3600 * HH)) % 60/* IPL minute */
   SS = (IPLTIME - (3600 * HH)- (60 * MM)) % 1/* IPL seconds*/
   HH = Right(HH,2,'0') /* ensure 2 digit HH*/
   MM = Right(MM,2,'0') /* ensure 2 digit MM*/
   SS = Right(SS,2,'0') /* ensure 2 digit SS*/
   IPLTIME= HH':'MM':'SS/* time in HH:MM format */
   select
      when infotyp = "JOBNAME"  then erg = jobname
      when infotyp = "JOBTYP"   then erg = jobtype
      when infotyp = "JOBNUM"   then erg = jobnum
      when infotyp = "STEPNAME" then erg = stepname
      when infotyp = "PROCSTEP" then erg = procstep
      when infotyp = "SYSLEVEL" then erg = left(mvsvar('sysmvs'),10)
      when infotyp = "JES"      then do
         if _progname = "IRX" then erg = ""
         else                      erg = sysvar("SYSJES")
      end
      when infotyp = "SYSID"    then erg = mvsvar("SYSNAME")
      when infotyp = "IPLVOL"   then erg = "" !! ,
                                     left(mvsvar('symdef','sysr1'),10)
      when infotyp = "NJENODE"  then do
         if _progname = "IRX" then erg = ""
         else                      erg = left(sysvar('sysnode'),10)
      end
      when infotyp = "PROC"     then do
         if _progname = "IRX" then erg = ""
         else                      erg = sysvar("SYSPROC")
      end
      when infotyp = "IPLDATE"  then erg = ipldate
      when infotyp = "IPLDAY"   then erg = iplday
      when infotyp = "IPLTAG"   then erg = ipltag
      when infotyp = "IPLTIME"  then erg = ipltime
      otherwise                      erg = "ERROR"
   end
return erg


ispf_screens: procedure expose _progname
   if _progname = "IRX" then return ""
   if sysvar("SYSISPF") <> "ACTIVE" then return ""
   /* active ISPF-Screens                           */
   /* RESULT = scr1 name1 \ ... \                   */

   TCBP=PTR(132+PTR(540)) /* CURRENT ISPTASK TCB       */
   TCBP=PTR(TCBP+132)     /* ISPMAIN TCB VIA TCBOTC    */
   TCBP=PTR(TCBP+136)     /* ISPTASK TCB VIA TCBLTC    */

   erg =
   DO WHILE TCBP <> 0
      X=TLDID(TCBP)
      erg = erg !! scrnr scrname "\"
      TCBP=PTR(128+TCBP) /* FOLLOW NTC */
   END
RETURN erg

PTR:  RETURN C2D(STORAGE(D2X(ARG(1)),4))
STG:  RETURN STORAGE(D2X(ARG(1)),ARG(2))

TLDID:
   R9=PTR(112+ARG(1))
   IF STG(R9+40,4)='ISPF' & STG(R9+24,1)='00'X THEN DO

       R9= PTR(R9+24)
       IF R9 <>0 & STG(R9+24,1)='00'X THEN DO
        SCRNR  =STG(PTR(R9)+003,1)
        SCRNAME=STG(PTR(R9)+852,8)
        RETURN 0
        END
     END
RETURN 'NONE'
/* Ende ISPF-SCREENS */

get_symbols: procedure

call set_sym_names
say
say "Standars MVS Symbols:"
do I = 1 while SYS.I <> "SYS."I
   say left(SYS.I,10) ">>" mvsvar("SYMDEF",SYS.I)
end
say
say "Installationsabhängige:"
do I = 1 while SYM.I <> "SYM."I
   say left(SYM.I,10) ">>" mvsvar("SYMDEF",SYM.I)
end
exit

set_sym_names:
   I = 0 /* Standard MVS */
   I=I+1;SYS.I= "JOBNAME"
   I=I+1;SYS.I= "LYYMMDD"
   I=I+1;SYS.I= "LHHMMSS"
   I=I+1;SYS.I= "HHMMSS"
   I=I+1;SYS.I= "LYR4"
   I=I+1;SYS.I= "SYSR1"
   I = 0 /* Definiert in der SYS1.PARMLIB(IEASYMxx) */
   I=I+1;SYM.I= "CPUNAME"
   I=I+1;SYM.I= "CSABELOW"
   I=I+1;SYM.I= "CSAHIGH"
   I=I+1;SYM.I= "SUFFIX"
   I=I+1;SYM.I= "PAGELOC1"
   I=I+1;SYM.I= "PAGECOM1"
   I=I+1;SYM.I= "MAXUSER"
   I=I+1;SYM.I= "GRSMODE"
   I=I+1;SYM.I= "RSUPARM"
   I=I+1;SYM.I= "RWGSYSID"
return
/*
   Quelle TSO-REXX NewsGroup at GOOGLE

   Die SYMBOLS aus der SYS1.PARMLIB werden zur Zeit nicht benutzt

   Aufruf-Syntax: INFO = §SYSINFO(parm)

   Inhalt parm   mögliches Funktionsergebnis
   -----------   ------------------------------------------------------
   JOBNAME       DAAKW
   JOBTYP        TSU
   JOBNUM        13716
   STEPNAME      RWGTSO
   PROCSTEP      RWGTSO
   SYSLEVEL      SP6.1.0
   JES           JES2 OS 2.10
   SYSID         S6UP
   IPLVOL        OS#11F
   NJENODE       GNO45NJ1
   PROC          RWGTSO
   IPLDATE       13.02.2002
   IPLDAY        Wednesday
   IPLTAG        Mittwoch
   IPLTIME       21:38:42
   PROGNAME      IKJEFT01
   SMIPS         173.447375 5
   TMIPS         867.236875
   ISPFSCRN      4 DSLIST   \3 SD       \2 EDIT     \1 DSLIST   \

   ist einer der Werte nicht ermittelbar wird SPACE zurückgegeben
*/


The driver for SYSINFO

/* REXX * SYSINFO-Treiberprogramm

trace ?r
*/
call test1_vars
do i = 1 to words(tstvars)
   say left(word(tstvars,i),10) ">>" sysinfo(word(tstvars,i))
end
call get_symbols
exit



get_symbols: procedure

call set_sym_names
say
say "Standars MVS Symbols:"
do I = 1 while SYS.I <> "SYS."I
   say left(SYS.I,10) ">>" mvsvar("SYMDEF",SYS.I)
end
say
say "Installationsabhängige:"
do I = 1 while SYM.I <> "SYM."I
   say left(SYM.I,10) ">>" mvsvar("SYMDEF",SYM.I)
end
return

set_sym_names:
   I = 0 /* Standard MVS */
   I=I+1;SYS.I= "JOBNAME"
   I=I+1;SYS.I= "LYYMMDD"
   I=I+1;SYS.I= "LHHMMSS"
   I=I+1;SYS.I= "HHMMSS"
   I=I+1;SYS.I= "LYR4"
   I=I+1;SYS.I= "SYSR1"
   I = 0 /* Definiert in der SYS1.PARMLIB(IEASYMxx) */
   I=I+1;SYM.I= "CPUNAME"
   I=I+1;SYM.I= "CSABELOW"
   I=I+1;SYM.I= "CSAHIGH"
   I=I+1;SYM.I= "SUFFIX"
   I=I+1;SYM.I= "PAGELOC1"
   I=I+1;SYM.I= "PAGECOM1"
   I=I+1;SYM.I= "MAXUSER"
   I=I+1;SYM.I= "GRSMODE"
   I=I+1;SYM.I= "RSUPARM"
   I=I+1;SYM.I= "RWGSYSID"
return

test1_vars:
   tstvars =  "JOBNAME"  ,
              "JOBTYP"   ,
              "JOBNUM"   ,
              "STEPNAME" ,
              "PROCSTEP" ,
              "SYSLEVEL" ,
              "JES2"     ,
              "SYSID"    ,
              "IPLVOL"   ,
              "NJENODE"  ,
              "PROC"     ,
              "IPLDATE"  ,
              "IPLDAY"   ,
              "IPLDAYG"  ,
              "IPLTIME"  ,
              "PROGNAME" ,
              "SMIPS"    ,
              "TMIPS"    ,
              "ISPFSCRN" ,
              ""
return
back to The Power of REXX