MVS-Control-Blocks auslesen

... habe gerade mal wieder gesucht und gefunden, wie man unter MVS an einige der MVS-Geheimnisse wie die aufgelaufene CPU-Zeit oder den Namen des MVS-Images rankommt.

... im folgenden der Ertrag der letzten 2 1/2 Stunden :-)

Gruß S.F.


%MACRO U157SYSX(DIAG=N);

/*------------------------------------------------------------------*
* PROGRAM ID: U157SYSX
* Author: L. Bertolini
* DATE: 05/15/2000
* REMARKS: THIS MACRO USES PEEK AND PEEKC FUNCTIONS TO OBTAIN
* VARIOUS SYSTEM INFO FROM MVS CONTROL BLOCKS.
* SYSTEM INFO IS STORED IN SAS SYMBOLIC VARIABLES.
* BASED ON GILBERT SAINT-FLOUR'S "COB2JOB" CODE
* (http://home.comcast.net/~gsf/)
* USAGE: %U157SYSX; RUN; DO NOT DUMP SYSTEM INFO TO SAS LOG
* OR %U157SYSX(DIAG=Y); RUN; DUMP SYSTEM INFO TO SAS LOG
* MINOR
* CHANGES: S. Frenzel 02/11/2008
* MACRO INCLUDES INFO ABOUT CPU-TIME
*-------------------------------------------------------------------*/

DATA _NULL_;

LENGTH PROGRAMR $20;
LENGTH JOBNAME $8 PROCSTEP $8 STEPNAME $8 PROGNAME $8
JOBNUMBR $8 JOBNUMB5 $5 USERID $8 SMCASID $4
JOBCLASS MSGCLASS $1 SYSTEMID $4;

/* TCB IS AT OFFSET 540 */
/* TIOTPTR IS AT TCB+12 */
TIOTPTR = PEEK(PEEK(540)+12);
JOBNAME = PEEKC(TIOTPTR,8);
PROCSTEP = PEEKC(TIOTPTR+8,8);
STEPNAME = PEEKC(TIOTPTR+16,8);

/* JSCBPTR IS AT TCB+180 */
JSCBPTR = PEEK(PEEK(540)+180);
PROGNAME = PEEKC(JSCBPTR+360,8);

/* SSIBPTR IS AT JSCB+316 */
SSIBPTR = PEEK(JSCBPTR+316);
JOBNUMBR = PEEKC(SSIBPTR+12,8);
JOBNUMB5 = PEEKC(SSIBPTR+15,5);

/* JCTPTR IS AT JSCB+260 */
JCTPTR = PEEK(JSCBPTR+260);
JOBCLASS = PEEKC(JCTPTR+47,1);
MSGCLASS = PEEKC(JCTPTR+22,1);

/* ACTPTR IS AT JCT+56 */
ACTPTR = INPUT('00'X!!PEEKC(JCTPTR+56,3),PIB4.);
PROGRAMR = PEEKC(ACTPTR+24,20);

CVTADDR = PEEK(16,4);
SMFADDR = PEEK(CVTADDR+196,4);
SMCASID = PEEKC(SMFADDR+16,4);
SYSTEMID = PEEKC(PEEK(PEEK(16,4)+196,4)+16,4);

/* ASCB IS AT OFFSET 548 */
/* ASXBPTR IS AT ASCB+108 */
/* USERID IS AT ASXB+192 */
USERID = PEEKC(PEEK(PEEK(548)+108)+192,8);

/* CPU time in seconds from Address Space Control Block */
CPUTIME =
INPUTN(PUTC(PEEKC(PEEK(548)+64,8),'$BINARY52'),'BINARY52.')
/1000000;

CALL SYMPUT('JOBNAME', JOBNAME);
CALL SYMPUT('JOBNUMBR',JOBNUMBR);
CALL SYMPUT('JOBNUMB5',JOBNUMB5);
CALL SYMPUT('USERID', USERID);
CALL SYMPUT('PROGRAMR',PROGRAMR);
CALL SYMPUT('SYSTEMID',SYSTEMID);
CALL SYMPUT('PROCSTEP',PROCSTEP);
CALL SYMPUT('STEPNAME',STEPNAME);
CALL SYMPUT('PROGNAME',PROGNAME);
CALL SYMPUT('JOBCLASS',JOBCLASS);
CALL SYMPUT('MSGCLASS',MSGCLASS);
CALL SYMPUT('CPUTIME', PUT(CPUTIME,BEST.));

IF "&DIAG" = 'Y' THEN
PUT 'U157SYSX: JOBNAME =' JOBNAME
/ 'U157SYSX: JOBNUMBR=' JOBNUMBR
/ 'U157SYSX: JOBNUMB5=' JOBNUMB5
/ 'U157SYSX: USERID =' USERID
/ 'U157SYSX: PROGRAMR=' PROGRAMR
/ 'U157SYSX: SYSTEMID=' SYSTEMID
/ 'U157SYSX: PROCSTEP=' PROCSTEP
/ 'U157SYSX: STEPNAME=' STEPNAME
/ 'U157SYSX: PROGNAME=' PROGNAME
/ 'U157SYSX: JOBCLASS=' JOBCLASS
/ 'U157SYSX: MSGCLASS=' MSGCLASS
/ 'U157SYSX: CPUTIME=' CPUTIME
;

STOP;
RUN;

%MEND U157SYSX;