|
From: <Bobby.Hicks@ccc-michigan.com> > That would be great Leif. Thanks!! to get you started, below is a snippet. Basically you find a job in the work control block tables, then walk its ODP: DCL SPCPTR .PARM1 PARM; DCL DD PARM1 CHAR(8) BAS(.PARM1); DCL DD LAST-ENTRY-NBR BIN(4) DEF(PARM1) POS(1); DCL DD MAX-ENTRY-NBR BIN(4) DEF(PARM1) POS(5); /* LIMIT 200,000 */ DCL SPCPTR .PARM2 PARM; DCL DD PARM2 CHAR(16000000) BAS(.PARM2); DCL DD ENTRIES(200000) CHAR(80) DEF(PARM2) POS(1); DCL OL PARMS (.PARM1, .PARM2) PARM EXT MIN(2); DCL DD THE-ENTRY CHAR(80) BDRY(16); DCL DD ENTRY-DEVICE CHAR(10) DEF(THE-ENTRY) POS( 1); DCL DD ENTRY-USER CHAR(10) DEF(THE-ENTRY) POS(11); DCL DD ENTRY-JOB-NUMBER CHAR(6) DEF(THE-ENTRY) POS(21); DCL DD ENTRY-JOB-TYPE CHAR(1) DEF(THE-ENTRY) POS(27); DCL DD ENTRY-LIBRARY CHAR(10) DEF(THE-ENTRY) POS(28); DCL DD ENTRY-FILE CHAR(10) DEF(THE-ENTRY) POS(38); DCL DD ENTRY-MEMBER CHAR(10) DEF(THE-ENTRY) POS(48); DCL DD ENTRY-OPERATION CHAR(10) DEF(THE-ENTRY) POS(58); DCL DD ENTRY-COUNT BIN(4) DEF(THE-ENTRY) POS(68); DCL DD ENTRY-REC-LENGTH BIN(2) DEF(THE-ENTRY) POS(72); DCL DD ENTRY-RECORDS BIN(4) DEF(THE-ENTRY) POS(74); DCL DD ENTRY-KIND CHAR(2) DEF(THE-ENTRY) POS(78); DCL DD ENTRY-YET-TO-BE-USED CHAR(1) DEF(THE-ENTRY) POS(80); DCL DD BYTES PKD(18,0); DCL DD COUNT BIN(4); DCL DD SIZE BIN(2); DCL DD TEXT CHAR(11); DCL DD COMP CHAR(11); /******************** WALK WORK CONTROL BLOCKS **********************/ DCL DD SPCPTRS CHAR(48) BDRY(16); DCL SPCPTR .WCBSPC DEF(SPCPTRS) POS( 1); DCL SPCPTR .WCB-ROOT DEF(SPCPTRS) POS(17); DCL SPCPTR .WCB-ENTRY DEF(SPCPTRS) POS(33); DCL DD OWN-PCO CHAR(512) BASPCO; DCL SYSPTR @WCBT00 DEF(OWN-PCO) POS(433); DCL DD WCB-ROOT CHAR(2048) BAS(.WCB-ROOT); DCL SYSPTR .WCB-TABLES(30) DEF(WCB-ROOT) POS(577); DCL DD THE-TABLE BIN(4); DCL DD THE-OFFSET BIN(4); DCL DD WCBTBL-SPACE CHAR(256) BAS(.WCBSPC); DCL DD WCBTBL-SIZE BIN(4) DEF(WCBTBL-SPACE) POS(21); DCL DD WCB-ENTRY CHAR(1024) BAS(.WCB-ENTRY); DCL DD WCB-DEVICE CHAR(10) DEF(WCB-ENTRY) POS( 1); DCL DD WCB-USER CHAR(10) DEF(WCB-ENTRY) POS( 11); DCL DD WCB-JOB-NUMBER CHAR(6) DEF(WCB-ENTRY) POS( 21); DCL SYSPTR .WCB-PCS DEF(WCB-ENTRY) POS( 33); DCL DD WCB-JOB-TYPE CHAR(1) DEF(WCB-ENTRY) POS( 97); DCL DD WCB-STATUS CHAR(1) DEF(WCB-ENTRY) POS( 98); DCL DD WCB-GROUP CHAR(1) DEF(WCB-ENTRY) POS(100); DCL DD WCB-START-TIME CHAR(8) DEF(WCB-ENTRY) POS(345); DCL SPCPTR .WCB-PCO; DCL DD WCB-PCO CHAR(1024) BAS(.WCB-PCO); DCL SYSPTR @DMCQ DEF(WCB-PCO) POS(33); DCL DD RESOLVE CHAR(34); DCL DD RESOLVE-TYPE CHAR( 2) DEF(RESOLVE) POS( 1); DCL DD RESOLVE-NAME CHAR(30) DEF(RESOLVE) POS( 3); DCL DD RESOLVE-AUTH CHAR( 2) DEF(RESOLVE) POS(33) INIT(X'0000'); ENTRY * (PARMS) EXT; GET-WCB-ROOT: SETSPPFP .WCB-ROOT, @WCBT00; SEARCH-WORK-CONTROL-TABLES: CPYNV LAST-ENTRY-NBR, 0; CPYNV THE-TABLE, 0; SEARCH-NEXT-TABLE: ADDN(S) THE-TABLE, 1; CMPNV(B) THE-TABLE, 30 /HI(DONE-WITH-TABLES); CMPPTRT(B) .WCB-TABLES(THE-TABLE), * /EQ(DONE-WITH-TABLES); SETSPPFP .WCBSPC, .WCB-TABLES(THE-TABLE); PREPARE-TO-SEARCH-WCB-TABLE: SETSPPFP .WCB-ENTRY, .WCBSPC; CPYNV(B) THE-OFFSET, H'0300'/POS(=+2); NEXT-WCBTBL-ENTRY: ADDN(S) THE-OFFSET, H'0400';: CMPNV(B) THE-OFFSET, WCBTBL-SIZE/NLO(SEARCH-NEXT-TABLE); SETSPPO .WCB-ENTRY, THE-OFFSET; CHECK-WCBTBL-ENTRY: CMPBLA(B) WCB-STATUS, X'20'/NEQ(NEXT-WCBTBL-ENTRY); /*ACTIVE? */ DCL EXCM * EXCID(H'2401') BP(NEXT-WCBTBL-ENTRY) CV(X'00000000'); HAVE-ACTIVE-JOB-ENTRY: SETSPPFP .WCB-PCO, .WCB-PCS; CALLI PROCESS-JOB-ENTRY, *, .PROCESS-JOB-ENTRY; B NEXT-WCBTBL-ENTRY; DONE-WITH-TABLES: RTX *; /************************ PROCESS JOB ENTRY *************************/ DCL SPCPTR .DMCQ; DCL DD DMCQ CHAR(4096) BAS(.DMCQ); DCL DD DMCQ-FIRST-SHARED-ODP BIN(4) DEF(DMCQ) POS(153); DCL DD DMCQ-LAST-SHARED-ODP BIN(4) DEF(DMCQ) POS(157); DCL DD DMCQ-FIRST-NON-SHARED-ODP BIN(4) DEF(DMCQ) POS(161); DCL DD DMCQ-LAST-NON-SHARED-ODP BIN(4) DEF(DMCQ) POS(165); DCL DD DMCQ-ENTRY CHAR(96) BAS(.WALK); DCL DD DMCQ-NEXT-ENTRY-OFFSET BIN(4) DEF(DMCQ-ENTRY) POS( 1); DCL DD DMCQ-PREV-ENTRY-OFFSET BIN(4) DEF(DMCQ-ENTRY) POS( 5); DCL SYSPTR .DMCQ-ODP DEF(DMCQ-ENTRY) POS(49); DCL DD CHAIN BIN(4); DCL MSPPTR .WALK; DCL INSPTR .PROCESS-JOB-ENTRY; ENTRY PROCESS-JOB-ENTRY INT; CPYBLA ENTRY-DEVICE, WCB-DEVICE; CPYBLA ENTRY-USER, WCB-USER; CPYBLA ENTRY-JOB-NUMBER, WCB-JOB-NUMBER; CPYBLA ENTRY-JOB-TYPE, WCB-JOB-TYPE; GET-ODP: SETSPPFP .WALK, @DMCQ; /* TO DMCQ ROOT */ CPYNV CHAIN, 144; /* ODP BASE */ GET-ODP-CHAIN: ADDN(S) CHAIN, 8; /* NEXT CHAIN */ CMPNV(B) CHAIN, 160/HI(DONE-WITH-ODPS); SETSPPO .WALK, CHAIN; DCL EXCM * EXCID(H'2202') BP(WALK-ODP-CHAIN) CV(X'00000000'); WALK-ODP-CHAIN: CMPNV(B) DMCQ-NEXT-ENTRY-OFFSET, -1/EQ(GET-ODP-CHAIN); SETSPPO .WALK, DMCQ-NEXT-ENTRY-OFFSET; SETSPPFP .ODP, .DMCQ-ODP; /* GET SPACE POINTER TO ODP */ CALLI PROCESS-THIS-ODP, *, .PROCESS-THIS-ODP; B WALK-ODP-CHAIN; DONE-WITH-ODPS: B .PROCESS-JOB-ENTRY; /************************** PROCESS THE ODP *************************/ DCL SPCPTR .ODP; DCL DD ODP CHAR(1024) BAS(.ODP); DCL DD ODP.OPEN-FEEDBACK BIN(4) DEF(ODP) POS(13); DCL DD ODP.IO-FEEDBACK BIN(4) DEF(ODP) POS(21); DCL SPCPTR .OPEN-FEEDBACK; DCL DD OPEN-FEEDBACK CHAR(256) BAS(.OPEN-FEEDBACK); DCL DD OPN-TYPE CHAR(2) DEF(OPEN-FEEDBACK) POS( 1); DCL DD OPN-FILE CHAR(10) DEF(OPEN-FEEDBACK) POS( 3); DCL DD OPN-LIBRARY CHAR(10) DEF(OPEN-FEEDBACK) POS( 13); DCL DD OPN-SPOOL-FILE CHAR(10) DEF(OPEN-FEEDBACK) POS( 23); DCL DD OPN-SPOOL-LIB CHAR(10) DEF(OPEN-FEEDBACK) POS( 33); DCL DD OPN-SPOOL-NBR BIN(2) DEF(OPEN-FEEDBACK) POS( 43); DCL DD OPN-REC-LENGTH BIN(2) DEF(OPEN-FEEDBACK) POS( 45); DCL DD OPN-MEMBER CHAR(10) DEF(OPEN-FEEDBACK) POS( 49); DCL DD OPN-NBR-RECORDS BIN(4) DEF(OPEN-FEEDBACK) POS( 76); DCL DD OPN-MISC-FLAGS1 CHAR(1) DEF(OPEN-FEEDBACK) POS(116); DCL DD OPN-MISC-FLAGS2 CHAR(1) DEF(OPEN-FEEDBACK) POS(133); DCL DD OPN-MISC-FLAGS3 CHAR(1) DEF(OPEN-FEEDBACK) POS(140); DCL SPCPTR .IO-FEEDBACK; DCL DD IO-FEEDBACK CHAR(512) BAS(.IO-FEEDBACK); DCL DD IO-FILE-DEPNT-AREA BIN(2) DEF(IO-FEEDBACK) POS( 1); DCL DD IO-WRITE-COUNT BIN(4) DEF(IO-FEEDBACK) POS( 3); DCL DD IO-READ-COUNT BIN(4) DEF(IO-FEEDBACK) POS( 7); DCL DD IO-UPDATE-COUNT BIN(4) DEF(IO-FEEDBACK) POS(11); DCL DD IO-OTHER-COUNT BIN(4) DEF(IO-FEEDBACK) POS(15); DCL DD IO-CUR-OPERATION CHAR(1) DEF(IO-FEEDBACK) POS(20); DCL DD IO-BLOCK-COUNT BIN(4) DEF(IO-FEEDBACK) POS(133); DCL DD OP-CODE BIN(2); DCL DD OP-TEXT(10) CHAR(9) INIT("READ", "RD/DIRECT", "RD/KEYED", "04?", "WRITE", "WRT/READ", "UPDATE", "DELETE", "OTHER", "OPEN"); DCL INSPTR .PROCESS-THIS-ODP; ENTRY PROCESS-THIS-ODP INT; ADDSPP .OPEN-FEEDBACK, .ODP, ODP.OPEN-FEEDBACK; SKIP-IF-LOGICAL-FILE: TSTBUM(B) OPN-MISC-FLAGS1, X'08'/ONES(.PROCESS-THIS-ODP); USE-THE-FILE: ADDSPP .IO-FEEDBACK, .ODP, ODP.IO-FEEDBACK; CMPBLA(B) IO-CUR-OPERATION, X'00'/ EQ(.PROCESS-THIS-ODP); CPYBLA ENTRY-KIND, OPN-TYPE; CPYNV ENTRY-RECORDS, OPN-NBR-RECORDS; CPYNV ENTRY-REC-LENGTH, OPN-REC-LENGTH; CPYNV ENTRY-COUNT, IO-WRITE-COUNT; ADDN(S) ENTRY-COUNT, IO-READ-COUNT; ADDN(S) ENTRY-COUNT, IO-UPDATE-COUNT; ADDN(S) ENTRY-COUNT, IO-OTHER-COUNT; TRANSLATE-OPERATION: CPYBRAP OP-CODE, IO-CUR-OPERATION, X'00'; CMPNV(B) OP-CODE, 9/NHI(=+2); CPYNV OP-CODE, 9;: CMPNV(B) ENTRY-COUNT, 0/HI(=+2); CPYNV OP-CODE, 10;: /* NO COUNT => 'OPEN' */ CPYBLAP ENTRY-OPERATION, OP-TEXT(OP-CODE), " "; CPYBLA ENTRY-LIBRARY, OPN-LIBRARY; CPYBLA ENTRY-FILE, OPN-FILE; CPYBLA ENTRY-MEMBER, OPN-MEMBER; CMPNV(B) LAST-ENTRY-NBR, 0/EQ(=+2); CMPBLA(B) ENTRIES(LAST-ENTRY-NBR), THE-ENTRY/ EQ(.PROCESS-THIS-ODP);: ADDN(S) LAST-ENTRY-NBR, 1; CMPNV(B) LAST-ENTRY-NBR, MAX-ENTRY-NBR/HI(=+2); CPYBLA ENTRIES(LAST-ENTRY-NBR), THE-ENTRY;: B .PROCESS-THIS-ODP;
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.