//CLARKAPI JOB ACCT,'LOAD API SAMPLES',NOTIFY=&SYSUID,CLASS=A, 00150001 // MSGCLASS=K 00160001 //* 00170001 //* ****************************************************************** 00180001 //* * This JCL uploads the sample programs used in the creation of * 00190001 //* * Clark's SHARE session "Finding Gold with the z/OS UNIX APIs." * 00200001 //* * * 00210001 //* * Only two changes should be required: * 00220001 //* * 1) Change the JOB statement above to meet your standards. * 00230001 //* * 2) Change the SYSUT2 statement below to reflect the PDS * 00240001 //* * library where the samples will be created. * 00250001 //* * Make sure to make your JCL changes in UPPER CASE. * 00260003 //* * * 00270003 //* * Run the job, and then you can browse, run or edit the samples * 00280003 //* * as you desire. Have fun! * 00290003 //* * * 00300004 //* * Clark Kidd clark@watsonwalker.com * 00310004 //* * Watson & Walker, Inc. www.watsonwalker.com * 00320004 //* * * 00330005 //* * Disclaimer: This material is distributed without any express * 00340005 //* * or implied warranties. Watson & Walker, Inc. assumes no * 00350005 //* * liability for incorrect results or other damage that may * 00360005 //* * occur from the use of this material. * 00370005 //* * * 00380005 //* ****************************************************************** 00390005 //* 00400005 //LOAD EXEC PGM=IEBUPDTE,PARM=NEW 00410005 //SYSPRINT DD SYSOUT=* 00420005 //SYSUT2 DD DSN=@YOURID@.UNIXAPIS.CNTL,DISP=(,CATLG), 00430005 // UNIT=SYSALLDA,SPACE=(TRK,(2,2,10)), 00440005 // BLKSIZE=3120,LRECL=80,RECFM=FB 00450005 //SYSIN DD DATA,DLM=ZZ 00460005 ./ ADD NAME=ASMEKDA1 //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020000 //* ****************************************************************** 00030000 //* * THIS ASSEMBLER LANGUAGE EXAMPLE USES THE BPXEKDA MACRO TO * 00040004 //* * COLLECT KERNEL STATISTICS, AND CAN DUPLICATE MUCH OF THE * 00050005 //* * OUTPUT CREATED BY THE "D OMVS" COMMAND. BECAUSE THIS IS AN * 00060005 //* * AUTHORIZED INTERFACE, THIS JOB ONLY ASSEMBLES THE EXAMPLE * 00070004 //* * AND LINKS IT INTO AN AUTHORIZED LIBRARY. MEMBER 'ASMEKDA2' * 00080004 //* * MAY THEN BE USED TO EXECUTE THE SAMPLE PROGRAM. * 00090004 //* * CHANGE THE LAST STATEMENT TO INCLUDE THE NAME OF THE * 00100004 //* * AUTHORIZED LOAD LIBRARY TO CONTAIN THE EXAMPLE PROGRAM. * 00110004 //* ****************************************************************** 00120000 //* 00130000 //ASMCLG EXEC HLASMCL, 00140000 // PARM.L='MAP,LIST,LET,AC(1)' <---- MUST LINK AUTHORIZED 00150004 //C.SYSIN DD * 00160000 TITLE '*** USE BPXEKDA MACRO TO COLLECT KERNEL DATA ***' 00170001 * 00180000 TESTAPI5 CSECT 00190001 TESTAPI5 AMODE 31 MUST BE AMODE=31 00200001 * 00210000 STM R14,R12,12(R13) SAVE REGISTERS 00220000 LR R12,R15 SET BASE REGISTER 00230000 USING TESTAPI5,R12 00240001 LA R14,TESTSAVE SET NEW SAVE AREA 00250000 ST R13,4(,R14) 00260000 ST R14,8(,R13) 00270000 LR R13,R14 00280000 * 00290000 OPEN (LOG,OUTPUT) OPEN PRINT FILE 00300000 LTR R15,R15 Q. OPEN OKAY? 00310000 BNZ ALLDONE A. NO, JUST EXIT 00320000 * 00330000 MODESET MODE=SUP,KEY=ZERO WE NEED KEY 0 00340001 * 00350001 L R3,TESTBUFL GET BUFFER SIZE WE WANT 00360001 STORAGE OBTAIN,LENGTH=(R3),LOC=(ANY,ANY) 00370001 ST R1,TESTBUFA SAVE ADDRESS OF STORAGE 00380001 * 00390001 USING ODMV,R1 MAP OBTAINED STORAGE 00400001 XC ODMV(ODMV_LEN),ODMV ZERO THE INPUT AREA 00410001 MVC ODMVID,=C'ODMV' IDENTIFY CONTROL BLOCK 00420001 OI ODMVINBYTE1,ODMVSUMMARY SHOW WE WANT SUMMARY DATA 00430001 OI ODMVINBYTEM2,ODMVLIMITS SHOW WE WANT SYSTEM LIMITS 00440002 LA R15,ODMV_LEN(,R1) A(OUTPUT AREA) 00450001 ST R15,ODMVOUTPTR SAVE IN INPUT AREA 00460001 ST R15,TESTBUFO SAVE FOR LATER REFERENCE 00470001 DROP R1 KILL ODMV ADDRESSING 00480001 * 00490001 BPXEKDA KBUFLEN=TESTBUFL, TOTAL BUFFER LENGTH X00500001 KBUFALET=TESTALET, ALET = 0 X00510001 KBUFPTR=TESTBUFA ADDRESS OF BUFFER 00520001 LR R3,R15 SAVE RETURN CODE 00530001 MODESET MODE=PROB,KEY=NZERO BACK TO PROBLEM MODE 00540001 * 00550001 LTR R3,R3 Q. RETURN CODE OKAY? 00560001 BNZ CLEANUP A. NO, JUST CLEAN UP 00570001 * 00580001 L R3,TESTBUFO A(RETURNED OUTPUT AREA) 00590001 USING ODMVOUT,R3 MAP IT 00600001 * 00610001 MVC DESC,SPACES 00620001 MVC DESC1,=CL25'OMVS PROC NAME --------->' 00630001 MVC DESC2(L'ODMVOMVSPROC),ODMVOMVSPROC 00640001 BAL R10,PRINTIT 00650001 * 00660001 MVC DESC,SPACES 00670001 MVC DESC1,=CL25'BPXPRMXX IN EFFECT ----->' 00680003 MVC DESC2(L'ODMVPARMMEMLIST),ODMVPARMMEMLIST 00690001 BAL R10,PRINTIT 00700001 * 00710001 MVC DESC,SPACES 00720001 MVC DESC1,=CL25'MAXIMUM PROCESSES ------>' 00730001 ICM R1,15,ODMVMAXPROCSYS 00740001 BAL R10,FORMATIT 00750001 MVC DESC2(L'FMTOUT),FMTOUT 00760001 BAL R10,PRINTIT 00770001 * 00780001 MVC DESC,SPACES 00790001 MVC DESC1,=CL25'MAXIMUM USERS ---------->' 00800001 ICM R1,15,ODMVMAXUSERS 00810001 BAL R10,FORMATIT 00820001 MVC DESC2(L'FMTOUT),FMTOUT 00830001 BAL R10,PRINTIT 00840001 *** 00850001 * CLEAN UP RESOURCES 00860001 *** 00870000 * 00880000 CLEANUP DS 0H 00890001 * 00900000 L R3,TESTBUFA BUFFER ADDRESS 00910001 L R4,TESTBUFL BUFFER LENGTH 00920001 MODESET MODE=SUP,KEY=ZERO WE NEED KEY 0 00930001 STORAGE RELEASE,LENGTH=(R4),ADDR=(R3) 00940001 MODESET MODE=PROB,KEY=NZERO BACK TO PROBLEM MODE 00950001 CLOSE LOG CLOSE THE LOG FILE 00960000 * 00970001 ALLDONE DS 0H 00980001 * 00990001 L R13,4(,R13) A(PREVIOUS SAVE AREA) 01000000 RETURN (14,12),RC=0 ALL DONE 01010000 ***** 01020000 ***** SUBROUTINES 01030000 ***** 01040000 * 01050001 PRINTIT DS 0H SUBROUTINE TO PRINT 01060001 * 01070000 PUT LOG,DESC PRINT THE LINE 01080001 BR R10 RETURN 01090001 * 01100001 FORMATIT DS 0H SUBROUTINE TO PRINT 01110001 * 01120001 CVD R1,DOUB TO DECIMAL 01130001 MVC FMTONE,=XL10'40202020202020202120' 01140002 LA R1,FMTONE+9 01150002 EDMK FMTONE,DOUB+3 EDIT OUTPUT 01160002 MVC FMTOUT,0(R1) MOVE OUTPUT 01170003 BR R10 RETURN 01180001 ***** 01190000 ***** CONSTANTS 01200000 ***** 01210000 * 01220000 TESTSAVE DC 18F'0' SAVE AREA 01230000 DOUB DS D WORK AREA 01240000 FMTONE DS CL10 FORMAT AREA 01250002 DC CL9' ' TRAILING BLANKS 01260002 FMTOUT DS CL10 OUTPUT VALUE 01270002 * 01280000 LOG DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,BLKSIZE=800, X01290000 LRECL=80,RECFM=FB 01300000 * 01310000 SPACES DC CL80' ' SOME BLANKS 01320001 * 01330001 DESC DS 0CL80 PRINT LINE 01340001 DS CL1 01350001 DESC1 DS CL25 DESCRIPTION 01360001 DS CL1 01370001 DESC2 DS CL53 DATA 01380001 * 01390001 TESTBUFL DC A(4096*3) BUFFER SIZE TO OBTAIN 01400001 TESTBUFA DS A A(RETURNED BUFFER) 01410001 TESTBUFO DS A A(ODMV OUTPUT BUFFER) 01420001 TESTALET DC A(0) ALET = 0 01430001 * 01440000 LTORG 01450000 * 01460000 BPXZODMV , MAP BPXEKDA INPUT/OUTPUT AREA 01470001 * 01480000 ***** 01490000 ***** REGISTER EQUATES 01500000 ***** 01510000 R0 EQU 0 01520000 R1 EQU 1 01530000 R2 EQU 2 01540000 R3 EQU 3 01550000 R4 EQU 4 01560000 R5 EQU 5 01570000 R6 EQU 6 01580000 R7 EQU 7 01590000 R8 EQU 8 01600000 R9 EQU 9 01610000 R10 EQU 10 01620000 R11 EQU 11 01630000 R12 EQU 12 01640000 R13 EQU 13 01650000 R14 EQU 14 01660000 R15 EQU 15 01670000 * 01680000 END TESTAPI5 01690001 //L.SYSLMOD DD DISP=SHR, 01700004 // DSN=@YOUR@.AUTHLIB.LOAD(BPXEKDA) <-- AUTHORIZED LIB 01710004 ./ ADD NAME=ASMEKDA2 //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020001 //* ****************************************************************** 00030001 //* * THIS ASSEMBLER LANGUAGE EXAMPLE USES THE BPXEKDA MACRO TO * 00040001 //* * COLLECT KERNEL STATISTICS, AND CAN DUPLICATE MUCH OF THE * 00050002 //* * OUTPUT CREATED BY THE "D OMVS" COMMAND. THIS JCL EXECUTES * 00060002 //* * THE EXAMPLE PROGRAM THAT WAS CREATED BY MEMBER 'ASMEKDA1.' * 00070001 //* * CHANGE THE NAME OF THE STEPLIB TO CONTAIN THE AUTHORIZED * 00080001 //* * LIBRARY INTO WHICH THE EXAMPLE PROGRAM HAS BEEN PLACED. * 00090001 //* ****************************************************************** 00100001 //* 00110001 //OSMF EXEC PGM=BPXEKDA 00120000 //STEPLIB DD DISP=SHR,DSN=@YOUR@.AUTHLIB.LOAD <--- AUTHORIZED LIB 00130001 //SYSPRINT DD SYSOUT=* 00140001 // 00150000 ./ ADD NAME=ASMERNO //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020000 //* ****************************************************************** 00030000 //* * THIS ASSEMBLER LANGUAGE EXAMPLE SHOWS HOW TO USE THE * 00040000 //* * BPXYERNO MACRO TO DETECT VARIOUS RETURN CODES WHEN A FAILURE * 00050000 //* * OCCURS. OUTPUT IS WRITTEN TO THE JOBLOG VIA ROUTCDE=11. * 00060001 //* ****************************************************************** 00070000 //* 00080000 //ASMCLG EXEC HLASMCLG 00090000 //C.SYSIN DD * 00100000 TITLE '*** USE BPXYERNO SETTINGS TO DETECT ERRORS ***' 00110000 * 00120000 TESTAPI2 CSECT 00130000 TESTAPI2 AMODE 31 MUST BE AMODE=31 00140000 * 00150000 STM R14,R12,12(R13) SAVE REGISTERS 00160000 LR R12,R15 SET BASE REGISTER 00170000 USING TESTAPI2,R12 00180000 LA R14,TESTSAVE SET NEW SAVE AREA 00190000 ST R13,4(,R14) 00200000 ST R14,8(,R13) 00210000 LR R13,R14 00220000 * 00230000 LA R1,PRIO_PROCESS INDICATE VALUE IS A PROCESS 00240000 ST R1,CHAPWHIC SAVE IN PARM LIST 00250000 LA R1,CPRIO_ABSOLUTE ABSOLUTE PRIORITY 00260000 ST R1,CHAPTYPE SAVE IN PARM LIST 00270000 LA R1,15 SET NEW PRIORITY 00280000 ST R1,CHAPPRIO SAVE IN PARM LIST 00290000 ***** 00300000 ***** USE A BOGUS PID (PROCESS ID) OF '2000000' TO FORCE AN ERROR 00310001 ***** 00320000 L R1,=F'2000000' USE A BOGUS PROCESS ID 00330000 ST R1,CHAPPIDI SAVE IT 00340000 * 00350000 L R15,=V(BPX1CHP) LOAD SERVICE 00360000 CALL (15), CALL THIS ADDRESS X00370000 (CHAPWHIC, TYPE OF VALUE (PROCESS ID) X00380000 CHAPPIDI, PROCESS ID TO CHANGE X00390000 CHAPTYPE, TYPE OF PRIORITY (ABSOLUTE) X00400000 CHAPPRIO, PRIORITY VALUE X00410000 RETNVALU, RETURN VALUE X00420000 RETNCODE, RETURN CODE X00430000 REASCODE), REASON CODE X00440000 VL INDICATE LAST PARAMETER 00450000 * 00460000 ICM R1,15,RETNVALU Q. SERVICE WORK? 00470000 BNM EXIT A. YES, THAT WAS GOOD 00480000 * 00490000 LA R1,ESRCH LOAD RETURN CODE 00500000 C R1,RETNCODE Q. PID NOT FOUND? 00510000 BNE UNHANDLE A. NO, CAN'T HANDLE THAT 00520002 WTO '* BAD PID PASSED TO BPX1CHP *',ROUTCDE=11 00530000 B EXIT 00540000 * 00550000 UNHANDLE DS 0H 00560000 * 00570000 WTO '* UNHANDLED ERROR FROM BPX1CHP *',ROUTCDE=11 00580000 ***** 00590000 ***** ALL DONE 00600000 ***** 00610000 EXIT DS 0H 00620000 L R13,4(,R13) A(PREVIOUS SAVE AREA) 00630000 RETURN (14,12),RC=0 ALL DONE 00640000 ***** 00650000 ***** CONSTANTS 00660000 ***** 00670000 * 00680000 TESTSAVE DC 18F'0' SAVE AREA 00690000 * 00700000 CHAPWHIC DS F TYPE OF ID PASSED TO SERVICE 00710000 CHAPTYPE DS F TYPE OF PRIORITY TO CHANGE 00720000 CHAPPIDI DS F PROCESS ID HOLD AREA 00730000 CHAPPRIO DS F NEW PRIORITY 00740000 RETNVALU DS F RETURN VALUE 00750000 RETNCODE DS F RETURN CODE 00760000 REASCODE DS F REASON CODE 00770000 * 00780000 LTORG 00790000 * 00800000 BPXYCONS , MAP Z/OS UNIX CONSTANTS 00810000 BPXYERNO , MAP Z/OS UNIX RETURN CODES 00820000 * 00830000 ***** 00840000 ***** REGISTER EQUATES 00850000 ***** 00860000 R0 EQU 0 00870000 R1 EQU 1 00880000 R2 EQU 2 00890000 R3 EQU 3 00900000 R4 EQU 4 00910000 R5 EQU 5 00920000 R6 EQU 6 00930000 R7 EQU 7 00940000 R8 EQU 8 00950000 R9 EQU 9 00960000 R10 EQU 10 00970000 R11 EQU 11 00980000 R12 EQU 12 00990000 R13 EQU 13 01000000 R14 EQU 14 01010000 R15 EQU 15 01020000 * 01030000 END TESTAPI2 01040000 //L.SYSLIB DD DSN=SYS1.CSSLIB,DISP=SHR <-- FOR LINKAGE STUBS 01050000 ./ ADD NAME=ASMESMF1 //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020003 //* ****************************************************************** 00030003 //* * THIS ASSEMBLER LANGUAGE EXAMPLE USES THE BPXEKDA MACRO TO * 00040003 //* * COLLECT SMF-LIKE STATISTICS FOR THOSE ADDRESS SPACES THAT * 00050003 //* * HAVE BEEN 'DUBBED' (HAD UNIX ACTIVITY). BECAUSE THIS IS AN * 00060003 //* * AUTHORIZED INTERFACE, THIS JOB ONLY ASSEMBLES THE EXAMPLE * 00070003 //* * AND LINKS IT INTO AN AUTHORIZED LIBRARY. MEMBER 'ASMESMF2' * 00080003 //* * MAY THEN BE USED TO EXECUTE THE SAMPLE PROGRAM. * 00090003 //* * CHANGE THE LAST STATEMENT TO INCLUDE THE NAME OF THE * 00100003 //* * AUTHORIZED LOAD LIBRARY TO CONTAIN THE EXAMPLE PROGRAM. * 00110003 //* ****************************************************************** 00120003 //* 00130003 //ASMCLG EXEC HLASMCL, 00140002 // PARM.L='MAP,LIST,LET,AC(1)' <---- LINK AUTHORIZED 00150002 //C.SYSLIB DD 00160002 // DD DSN=SYS1.AMODGEN,DISP=SHR 00170002 //C.SYSIN DD * 00180000 TITLE '*** USE BPXESMF MACRO TO COLLECT UNIX SMF DATA ***' 00190000 * 00200000 TESTAPI3 CSECT 00210000 TESTAPI3 AMODE 31 MUST BE AMODE=31 00220000 * 00230000 STM R14,R12,12(R13) SAVE REGISTERS 00240000 LR R12,R15 SET BASE REGISTER 00250000 USING TESTAPI3,R12 00260000 LA R14,TESTSAVE SET NEW SAVE AREA 00270000 ST R13,4(,R14) 00280000 ST R14,8(,R13) 00290000 LR R13,R14 00300000 * 00310000 OPEN (LOG,OUTPUT) OPEN PRINT FILE 00320000 LTR R15,R15 Q. OPEN OKAY? 00330000 BNZ ALLDONE A. NO, JUST EXIT 00340000 PUT LOG,HEAD1 WRITE HEADING ONE 00350001 PUT LOG,HEAD2 WRITE HEADING TWO 00360000 * 00370000 L R3,CVTPTR A(CVT) 00380000 USING CVT,R3 MAP CVT 00390000 L R3,CVTASVT A(ASVT) 00400000 DROP R3 00410000 USING ASVT,R3 MAP ASVT 00420000 L R4,ASVTMAXU COUNT OF MAX ADDRESS SPACES 00430000 LA R3,ASVTFRST A(1ST ADDRESS SPACE POINTER) 00440000 DROP R3 00450000 *** 00460000 * RUN THROUGH THE ADDRESS SPACES FINDING THOSE WITH UNIX ACTIVITY 00470000 *** 00480000 * 00490000 ASCBGET1 DS 0H 00500000 * 00510000 TM 0(R3),ASVTAVAI Q. ADDRESS SPACE INACTIVE? 00520000 BO ASCBGET2 A. YES, SKIP IT 00530000 ICM R5,15,0(R3) Q. ANY ASCB POINTER 00540000 BZ ASCBGET2 A. NO, SKIP IT 00550000 USING ASCB,R5 MAP ASCB 00560000 L R14,ASCBASSB GET A(ASSB) 00570000 USING ASSB,R14 MAP ASSB 00580003 ICM R15,15,ASSBOASB Q. OASB PRESENT? 00590000 BZ ASCBGET2 A. NO, SKIP IT THEN 00600000 DROP R14 00610000 *** 00620000 * ISSUE THE MACRO TO GET UNIX ACCOUNTING INFO 00630000 *** 00640000 MODESET MODE=SUP,KEY=ZERO GET AUTHORIZED 00650000 BPXESMF ACCTDAT=TESTOSMF, ADDRESS OF OUTPUT AREA X00660000 ASCBPTR=(R5) HERE'S THE ASCB ADDRESS 00670002 LR R6,R15 SAVE RETURN CODE 00680000 MODESET MODE=PROB,KEY=NZERO GET SAFE AGAIN 00690000 LTR R6,R6 Q. WORK OKAY? 00700000 BNZ ASCBGET2 A. NO, SKIP THIS ONE 00710001 * 00720000 LA R6,TESTOSMF ADDRESS OF RETURNED AREA 00730000 USING OSMF,R6 MAP IT 00740000 * 00750000 ICM R1,15,ASCBJBNI Q. ASCB HAVE INIT NAME? 00760000 BNZ *+12 A. YES, WE GOT IT 00770000 ICM R1,15,ASCBJBNS Q. MUST HAVE STC/TSU NAME? 00780000 BZ ASCBGET2 A. NO, SKIP THIS ONE 00790000 MVC LOGJOB,0(R1) MOVE IN THE JOBNAME 00800000 * 00810000 ICM R1,15,OSMFSYSCALLCOUNT GET SYSCALL COUNT 00820000 BAL R14,SUBFMT FORMAT IT 00830000 MVC LOGCALL,FMTOUT TO OUTPUT 00840000 ICM R1,15,OSMFDIRR GET DIRECTORY READS 00850000 BAL R14,SUBFMT FORMAT IT 00860000 MVC LOGDIRR,FMTOUT TO OUTPUT 00870000 ICM R1,15,OSMFSTDR GET STANDARD FILE READS 00880000 BAL R14,SUBFMT FORMAT IT 00890000 MVC LOGSTDR,FMTOUT TO OUTPUT 00900000 ICM R1,15,OSMFSTDW GET STANDARD FILE WRITES 00910000 BAL R14,SUBFMT FORMAT IT 00920000 MVC LOGSTDW,FMTOUT TO OUTPUT 00930000 PUT LOG,LOGLINE WRITE OUTPUT LINE 00940000 * 00950000 ASCBGET2 DS 0H 00960000 * 00970000 LA R3,L'ASVTENTY(,R3) A(NEXT ASVT TABLE ENTRY) 00980000 BCT R4,ASCBGET1 TEST AND RETURN 00990000 *** 01000000 * ALL DONE 01010000 *** 01020000 * 01030002 ALLDONE DS 0H 01040002 * 01050002 CLOSE LOG CLOSE THE LOG FILE 01060000 L R13,4(,R13) A(PREVIOUS SAVE AREA) 01070000 RETURN (14,12),RC=0 ALL DONE 01080000 ***** 01090000 ***** SUBROUTINES 01100000 ***** 01110000 SUBFMT DS 0H SUBROUTINE TO FORMAT OUTPUT 01120001 * 01130001 CVD R1,DOUB TO DECIMAL 01140000 MVC FMTOUT,=XL10'40202020202020202120' 01150001 ED FMTOUT,DOUB+3 EDIT OUTPUT 01160001 BR R14 RETURN 01170001 ***** 01180000 ***** CONSTANTS 01190000 ***** 01200000 * 01210000 TESTSAVE DC 18F'0' SAVE AREA 01220000 DOUB DS D WORK AREA 01230000 FMTOUT DS CL10 OUTPUT VALUE 01240001 * 01250000 LOG DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,BLKSIZE=800, X01260001 LRECL=80,RECFM=FB 01270001 * 01280001 LOGLINE DS 0CL80 PRINT LINE 01290001 DC CL2' ' 01300001 LOGJOB DS CL8 JOBNAME 01310001 DC CL2' ' 01320001 LOGCALL DS CL10 SYSCALL COUNT 01330001 DC CL2' ' 01340001 LOGDIRR DS CL10 READ DIRECTORY I/O COUNT 01350001 DC CL2' ' 01360001 LOGSTDR DS CL10 STANDARD FILE READ I/O COUNT 01370001 DC CL2' ' 01380001 LOGSTDW DS CL10 STANDARD FILE WRITE I/O COUNT 01390001 DC CL22' ' 01400001 * 01410001 HEAD1 DC CL80' JOBNAME SYSCALLS DIR--READS STD--READS STDX01420001 -WRITES' 01430001 HEAD2 DC CL80' -------- ---------- ---------- ---------- ---X01440001 -------' 01450001 DS 0D 01460001 TESTOSMF DS CL(OSMF#LENGTH) OUTPUT AREA FOR BPXESMF 01470001 * 01480001 LTORG 01490000 * 01500000 BPXYOSMF , MAP BPXESMF RESULT AREA 01510001 IHAPSA , MAP PSA 01520001 CVT DSECT=YES MAP CVT 01530001 IHAASVT , MAP ASVT 01540001 IHAASCB , MAP ASCB 01550001 IHAASSB , MAP ASSB 01560001 * 01570001 ***** 01580000 ***** REGISTER EQUATES 01590000 ***** 01600000 R0 EQU 0 01610000 R1 EQU 1 01620000 R2 EQU 2 01630000 R3 EQU 3 01640000 R4 EQU 4 01650000 R5 EQU 5 01660000 R6 EQU 6 01670000 R7 EQU 7 01680000 R8 EQU 8 01690000 R9 EQU 9 01700000 R10 EQU 10 01710000 R11 EQU 11 01720000 R12 EQU 12 01730000 R13 EQU 13 01740000 R14 EQU 14 01750000 R15 EQU 15 01760000 * 01770000 END TESTAPI3 01780000 //L.SYSLMOD DD DISP=SHR, 01790003 // DSN=@YOUR@.AUTHLIB.LOAD(BPXESMF) <--- AUTHORIZED LIB 01800003 ./ ADD NAME=ASMESMF2 //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020001 //* ****************************************************************** 00030001 //* * THIS ASSEMBLER LANGUAGE EXAMPLE USES THE BPXEKDA MACRO TO * 00040001 //* * COLLECT SMF-LIKE STATISTICS FOR THOSE ADDRESS SPACES THAT * 00050001 //* * HAVE BEEN 'DUBBED' (HAD UNIX ACTIVITY). THIS JOB EXECUTES * 00060001 //* * THE EXAMPLE PROGRAM THAT WAS CREATED BY MEMBER 'ASMESMF1.' * 00070001 //* * CHANGE THE NAME OF THE STEPLIB TO CONTAIN THE AUTHORIZED * 00080001 //* * LIBRARY INTO WHICH THE EXAMPLE PROGRAM HAS BEEN PLACED. * 00090001 //* ****************************************************************** 00100001 //* 00110001 //OSMF EXEC PGM=BPXESMF 00120000 //STEPLIB DD DISP=SHR,DSN=@YOUR@.AUTHLIB.LOAD <--- AUTHORIZED LIB 00130001 //SYSPRINT DD SYSOUT=* 00140000 // 00150000 ./ ADD NAME=ASMLINK //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020000 //* ****************************************************************** 00030000 //* * THIS ASSEMBLER LANGUAGE EXAMPLE SHOWS HOW TO CALL THREE * 00040000 //* * DIFFERENT Z/OS UNIX APIS USING THE THREE DIFFERENT LINKAGE * 00050000 //* * METHODS: * 00060001 //* * 1) LOAD AND DELETE MACROS * 00070001 //* * 2) LINKAGE STUBS * 00080001 //* * 3) CONTROL BLOCK OFFSETS * 00090001 //* * THE RESULTS OF EACH CALL ARE DISPLAYED VIA WTO ROUTCDE=11 * 00100001 //* ****************************************************************** 00110000 //* 00120000 //ASMCLG EXEC HLASMCLG 00130001 //C.SYSIN DD * 00140000 TITLE '*** CALL THREE APIS USING VARIOUS LINKAGE TYPES ***' 00150000 * 00160000 TESTAPI1 CSECT 00170000 TESTAPI1 AMODE 31 MUST BE AMODE=31 00180000 * 00190000 STM R14,R12,12(R13) SAVE REGISTERS 00200000 LR R12,R15 SET BASE REGISTER 00210000 USING TESTAPI1,R12 00220000 LA R14,TESTSAVE SET NEW SAVE AREA 00230000 ST R13,4(,R14) 00240001 ST R14,8(,R13) 00250000 LR R13,R14 00260000 ***** 00270000 ***** METHOD 1 / LOCATE "BPX1GPI" SERVICE VIA LOAD/DELETE MACROS 00280000 ***** (THE BPX1GPI SERVICE RETURNS OUR PROCESS ID IN A FULLWORD) 00290002 ***** 00300000 LOAD EP=BPX1GPI LOAD SERVICE 00310000 LR R15,R0 COPY ADDRESS 00320000 CALL (15), CALL THIS ADDRESS X00330001 (RESULT), PUT RESULT HERE X00340000 VL INDICATE LAST PARAMETER 00350000 DELETE EP=BPX1GPI DELETE THE SERVICE 00360000 MVC DESC,=CL25'OUR PROCESS ID --------->' 00370000 BAL R9,SUBOUT WRITE THE OUTPUT 00380000 ***** 00390001 ***** METHOD 2 / LOCATE "BPX1GPP" SERVICE VIA A LINKAGE STUB 00400001 ***** (THE BPX1GPP SERVICE RETURNS OUR PARENT PROCESS ID IN A FULLWORD) 00410002 ***** 00420001 L R15,=V(BPX1GPP) ADDRESS OF LINKAGE STUB 00430001 CALL (15), CALL THIS ADDRESS X00440001 (RESULT), PUT RESULT HERE X00450001 VL INDICATE LAST PARAMETER 00460001 MVC DESC,=CL25'OUR PARENT PROCESS ID -->' 00470001 BAL R9,SUBOUT WRITE THE OUTPUT 00480001 ***** 00490001 ***** METHOD 3 / LOCATE "BPX1GPG" SERVICE VIA CONTROL BLOCKS 00500001 ***** (THE BPX1GPG SERVICE RETURNS OUR PROCESS GROUP ID IN A FULLWORD) 00510002 ***** 00520001 L R15,X'10' A(CVT) 00530001 L R15,544(R15) A(CSRTABLE) 00540001 L R15,24(R15) CSR SLOTS FOR UNIX 00550002 L R15,272(R15) OFFSET OF THE BPX1GPG SERVICE 00560002 * 00570001 CALL (15), CALL THIS ADDRESS X00580001 (RESULT), PUT RESULT HERE X00590001 VL INDICATE LAST PARAMETER 00600001 MVC DESC,=CL25'OUR PROCESS GROUP ID --->' 00610001 BAL R9,SUBOUT WRITE THE OUTPUT 00620001 ***** 00630001 ***** ALL DONE 00640001 ***** 00650001 L R13,4(,R13) A(PREVIOUS SAVE AREA) 00660001 RETURN (14,12),RC=0 ALL DONE 00670000 ***** 00680001 ***** SUBROUTINES 00690001 ***** 00700001 SUBOUT DS 0H SUBROUTINE TO FORMAT OUTPUT 00710000 L R1,RESULT PICK UP VALUE 00720000 CVD R1,DOUB TO DECIMAL 00730000 MVC DESC2,=XL10'40202020202020202120' 00740000 ED DESC2,DOUB+3 EDIT OUTPUT 00750000 MVC SUBMSG+8(DSIZE),DESC MESSAGE TO WTO 00760000 SUBMSG WTO 'AAAAAAAAAABBBBBBBBBBCCCCCCCCCCEEEEE',ROUTCDE=11 00770000 BR R9 RETURN 00780000 ***** 00790000 ***** CONSTANTS 00800000 ***** 00810000 * 00820000 TESTSAVE DC 18F'0' SAVE AREA 00830000 DOUB DS D WORK AREA 00840000 RESULT DC F'0' API RESULT AREA 00850001 * 00860000 DESC DS CL25 OUTPUT DESCRIPTION 00870000 DESC2 DS CL10 OUTPUT VALUE 00880000 DSIZE EQU *-DESC SIZE TO OUTPUT 00890000 * 00900000 LTORG 00910001 ***** 00920001 ***** REGISTER EQUATES 00930001 ***** 00940001 R0 EQU 0 00950001 R1 EQU 1 00960001 R2 EQU 2 00970001 R3 EQU 3 00980001 R4 EQU 4 00990001 R5 EQU 5 01000001 R6 EQU 6 01010001 R7 EQU 7 01020001 R8 EQU 8 01030001 R9 EQU 9 01040001 R10 EQU 10 01050001 R11 EQU 11 01060001 R12 EQU 12 01070001 R13 EQU 13 01080001 R14 EQU 14 01090001 R15 EQU 15 01100001 * 01110001 END TESTAPI1 01120000 //L.SYSLIB DD DSN=SYS1.CSSLIB,DISP=SHR <-- FOR LINKAGE STUBS 01130001 ./ ADD NAME=ASMRMON //CLARKAPI JOB ACCT,'TEST UNIX APIS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020000 //* ****************************************************************** 00030000 //* * THIS ASSEMBLER LANGUAGE EXAMPLE SHOWS HOW TO CALL THE BPX1RMON * 00040000 //* * API TO RETURN GENERAL PERFORMANCE STATISTICS. SELECTED DATA * 00050003 //* * VALUES ARE DISPLAYED IN THE JOBLOG VIA WTO ROUTCDE=11. * 00060003 //* ****************************************************************** 00070000 //* 00080000 //ASMCLG EXEC HLASMCLG 00090000 //C.SYSIN DD * 00100000 TITLE '*** CALL RMON API TO COLLECT MEASUREMENT DATA ***' 00110000 * 00120000 TESTAPI4 CSECT 00130002 TESTAPI4 AMODE 31 MUST BE AMODE=31 00140002 * 00150000 STM R14,R12,12(R13) SAVE REGISTERS 00160000 LR R12,R15 SET BASE REGISTER 00170000 USING TESTAPI4,R12 00180002 LA R14,TESTSAVE SET NEW SAVE AREA 00190000 ST R13,4(,R14) 00200000 ST R14,8(,R13) 00210000 LR R13,R14 00220000 ***** 00230000 ***** CALL THE API 00240001 ***** 00250001 L R15,=V(BPX1RMG) ADDRESS OF LINKAGE STUB 00260000 CALL (15), CALL THIS ADDRESS X00270000 (RMONLEN, LENGTH OF RESULT AREA X00280000 RMONADR, RESULT AREA X00290000 RETVAL, RETURN VALUE X00300000 RETCODE, RETURN CODE X00310000 REACODE), REASON CODE X00320000 VL INDICATE LAST PARAMETER 00330000 * 00340001 ICM R1,15,RETVAL Q. DID THAT WORK? 00350000 BM CRASH A. NO, THIS IS BAD 00360000 LA R3,RMONADR A(RETURN AREA) 00370000 USING RMON,R3 MAP IT 00380000 ***** 00390001 ***** SHOW SOME OF THE RETURNED STATISTICS 00400001 ***** 00410001 L R1,RMONSYSCALLS GET TOTAL SYSCALLS 00420000 MVC DESC,=CL25'TOTAL SYSCALLS --------->' 00430000 BAL R9,SUBOUT WRITE THE OUTPUT 00440000 * 00450001 LH R1,RMONNUMPROC GET CURRENT PROCESS COUNT 00460001 MVC DESC,=CL25'CURRENT PROCESS COUNT -->' 00470001 BAL R9,SUBOUT WRITE THE OUTPUT 00480001 * 00490001 LH R1,RMONMAXPROC GET MAXIMUM PROCESS COUNT 00500001 MVC DESC,=CL25'MAXIMUM PROCESS COUNT -->' 00510001 BAL R9,SUBOUT WRITE THE OUTPUT 00520001 * 00530001 L R1,RMONOVRPROC GET TIMES EXCCEDED 00540001 MVC DESC,=CL25'ATTEMPTS TO EXCEED ----->' 00550001 BAL R9,SUBOUT WRITE THE OUTPUT 00560001 ***** 00570000 ***** ALL DONE 00580000 ***** 00590000 L R13,4(,R13) A(PREVIOUS SAVE AREA) 00600000 RETURN (14,12),RC=0 ALL DONE 00610000 * 00620000 CRASH DS 0H 00630000 * 00640000 WTO '*** CALL TO RMON FAILED ***',ROUTCDE=11 00650000 ABEND 1 00660000 ***** 00670000 ***** SUBROUTINES 00680000 ***** 00690000 SUBOUT DS 0H SUBROUTINE TO FORMAT OUTPUT 00700000 CVD R1,DOUB TO DECIMAL 00710000 MVC DESC2,=XL10'40202020202020202120' 00720000 ED DESC2,DOUB+3 EDIT OUTPUT 00730000 MVC SUBMSG+8(DSIZE),DESC MESSAGE TO WTO 00740000 SUBMSG WTO 'AAAAAAAAAABBBBBBBBBBCCCCCCCCCCEEEEE',ROUTCDE=11 00750000 BR R9 RETURN 00760000 ***** 00770000 ***** CONSTANTS 00780000 ***** 00790000 * 00800000 TESTSAVE DC 18F'0' SAVE AREA 00810000 DOUB DS D WORK AREA 00820000 * 00830000 DESC DS CL25 OUTPUT DESCRIPTION 00840000 DESC2 DS CL10 OUTPUT VALUE 00850000 DSIZE EQU *-DESC SIZE TO OUTPUT 00860000 * 00870000 LTORG 00880000 * 00890001 RETVAL DC A(0) RETURN VALUE 00900001 RETCODE DC A(0) RETURN CODE 00910001 REACODE DC A(0) REASON CODE 00920001 * 00930001 RMONLEN DC A(RMON#LENGTH) LENGTH OF RETURN AREA 00940000 RMONADR DC XL(RMON#LENGTH)'00' RETURN AREA 00950000 * 00960000 BPXYRMON , MAP THE RETURN AREA 00970000 ***** 00980000 ***** REGISTER EQUATES 00990000 ***** 01000000 R0 EQU 0 01010000 R1 EQU 1 01020000 R2 EQU 2 01030000 R3 EQU 3 01040000 R4 EQU 4 01050000 R5 EQU 5 01060000 R6 EQU 6 01070000 R7 EQU 7 01080000 R8 EQU 8 01090000 R9 EQU 9 01100000 R10 EQU 10 01110000 R11 EQU 11 01120000 R12 EQU 12 01130000 R13 EQU 13 01140000 R14 EQU 14 01150000 R15 EQU 15 01160000 * 01170000 END TESTAPI4 01180002 //L.SYSLIB DD DSN=SYS1.CSSLIB,DISP=SHR <-- FOR LINKAGE STUBS 01190000 ./ ADD NAME=CACCESS //CLARKCPP JOB ACCT,'C++ CLG',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K //* //* ************************************************************** * //* * //* THIS C/C++ EXAMPLE USES THE "ACCESS" FUNCTION TO SEE WHAT TYPE * //* OF ACCESS IS ALLOWED FOR A UNIX FILE (READ/WRITE/SEARCH). * //* USE THE "PARM.GO" STATEMENT BELOW TO SPECIFY THE FILE NAME * //* THAT SHOULD BE TESTED. MAKE SURE TO SPECIFY A DOUBLE LEADING * //* SLASH (//) BECAUSE THE FIRST ONE IS IGNORED. * //* * //* ************************************************************** * //* //CPP EXEC CBCCLG,INFILE=DUMMY, // PARM.GO='//usr/include/ctype.h' <--- UNIX File to Test //COMPILE.SYSIN DD * #define _POSIX_SOURCE #include #include main(int argc, char * argvÕþ) { if (argc < 2) { printf("You forgot to code the file name!\n"); return 8; } printf("Access status for file: %s.\n",argvÕ1þ); if (access(argvÕ1þ, F_OK) != 0) printf(" No Such File!\n"); else { if (access(argvÕ1þ, R_OK) == 0) printf(" Read Access.\n"); if (access(argvÕ1þ, W_OK) == 0) printf(" Write Access.\n"); if (access(argvÕ1þ, X_OK) == 0) printf(" Search Access.\n"); } } // ./ ADD NAME=CSTAT //CLARKCPP JOB ACCT,'C++ CLG',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K //* //* ************************************************************** * //* * //* THIS C/C++ EXAMPLE USES THE "STAT" FUNCTION TO RETURN DATA * //* ABOUT A UNIX FILE WHOSE NAME IS PASSED TO THE PROGRAM. * //* USE THE "PARM.GO" STATEMENT BELOW TO SPECIFY THE FILE NAME * //* THAT SHOULD BE USED. MAKE SURE TO SPECIFY A DOUBLE LEADING * //* SLASH (//) BECAUSE THE FIRST ONE IS IGNORED. * //* * //* ************************************************************** * //* //CPP EXEC CBCCLG,INFILE=DUMMY, // PARM.GO='//usr/include/ctype.h' <-- UNIX File Name //COMPILE.SYSIN DD * #define _POSIX_SOURCE #include #include #include #include main(int argc, char * argvÕþ) { struct stat info; if (argc < 2) { printf("You forgot to code the file name!\n"); return 8; } if (stat(argvÕ1þ, &info) != 0) perror("stat() error"); else { printf("Statistics for: %s.\n", argvÕ1þ); printf(" Inode: %d\n", (int) info.st_ino); printf(" Device ID: %d\n", (int) info.st_dev); printf(" Mode: %08x\n", info.st_mode); printf(" Created: %s", ctime(&info.st_createtime)); } } // ./ ADD NAME=CSTATVFS //CLARKCPP JOB ACCT,'C++ CLG',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K //* * //* ************************************************************** * //* THIS C/C++ EXAMPLE USES THE "STATVFS" FUNCTION TO RETURN DATA * //* ABOUT A FILE SYSTEM (HFS/TFS/ZFS). THE FILE SYSTEM IS * //* SELECTED BY SPECIFYING THE NAME OF A UNIX FILE THAT RESIDES IN * //* THAT FILE SYSTEM. THE API THEN RESOLVES THAT FILE NAME TO A * //* PARTICULAR FILE SYSTEM, AND RETURNS INFORMATION ABOUT IT. * //* NOTE THAT A FILE PATH MAY ALSO BE SPECIFIED, SO THAT YOU CAN * //* OBTAIN INFORMATION ABOUT A SPECIFIC FILE SYSTEM BY SPECIFYING * //* THE MOUNT POINT USED TO MOUNT IT (I.E. "/WebSphere"). * //* USE THE "PARM.GO" STATEMENT BELOW TO SPECIFY THE FILE NAME * //* THAT SHOULD BE USED. MAKE SURE TO SPECIFY A DOUBLE LEADING * //* SLASH (//) BECAUSE THE FIRST ONE IS IGNORED. * //* ************************************************************** * //* * //CPP EXEC CBCCLG,INFILE=DUMMY, // PARM.GO='//usr/include/errno.h' <--- UNIX File Name //COMPILE.SYSIN DD * #define _XOPEN_SOURCE_EXTENDED 1 #include #include #include #include #include main(int argc, char * argvÕþ) { setenv("_EDC_ADD_ERRNO2","1",1); struct statvfs buf; if (argc < 2) { printf("You forgot to code the file name!\n"); return 8; } printf("Information for the file system containing: %s.\n",argvÕ1þ); if (statvfs(argvÕ1þ, &buf) == -1) { if (errno == ENOENT) printf("The File Name was Not Found.\n"); else printf("statvfs error: %s\n", strerror(errno)); } else { printf(" File System ID = %d\n",buf.f_fsid); printf(" Maximum File Name Size = %d\n",buf.f_namemax); printf(" Block Size = %d\n",buf.f_frsize); printf(" Allocated Blocks = %d\n",buf.f_OEusedspace); printf(" Free Blocks = %d\n",buf.f_bfree); } } // ./ ADD NAME=JCLCOPY //CLARKCPY JOB ACCT,'CONFIGHFS',NOTIFY=&SYSUID,CLASS=A,MSGCLASS=K 00010000 //* 00020001 //* ****************************************************************** 00030001 //* * THIS JCL COPIES THE UNIX "CONFIGHFS" COMMAND FROM THE UNIX * 00040001 //* * FILE SYSTEM INTO A TSO DATA SET. THE FILE MAY THEN BE BROWSED * 00050001 //* * OR PRINTED. BECAUSE THIS COMMAND IS WRITTEN IN REXX, IT IS * 00060001 //* * A GOOD TOOL FOR LEARNING ABOUT SOME OF THE UNIX APIS AVAILABLE * 00070001 //* * TO REXX. CHANGE THE NAME OF THE DATA SET BELOW TO REPRESENT * 00080001 //* * A VALID TSO DATA SET. * 00090001 //* ****************************************************************** 00100001 //* 00110001 //COPY EXEC PGM=IKJEFT01 00120000 //SYSTSPRT DD SYSOUT=* 00130000 //SYSTSIN DD * 00140000 OGET '/usr/lpp/dfsms/bin/confighfs' '@TSO@.CONFHFS.REXX' TEXT 00150002 // 00160000 ./ ADD NAME=RXGETGRE //CLARKRX1 JOB ACCT,'BATCH REXX',NOTIFY=&SYSUID,MSGCLASS=K 00010000 //* 00020002 //* ************************************************************** * 00030002 //* * 00040002 //* THIS REXX EXAMPLE USES THE "GETGRENT" FUNCTION TO GET GROUP * 00050002 //* ENTRIES FROM THE SECURITY DATA BASE. THE FUNCTION IS CALLED * 00060002 //* MULTIPLE TIMES UNTIL ALL ENTRIES ARE RETURNED. FOR EACH * 00070002 //* ENTRY THE GROUP NAME, GROUP ID AND NUMBER OF USERS ARE SHOWN. * 00080004 //* YOU MUST HAVE THE PROPER SECURITY PERMISSIONS TO RUN THIS. * 00090004 //* * 00100002 //* ************************************************************** * 00110002 //* 00120002 //COPY EXEC PGM=IEBGENER 00130000 //SYSIN DD DUMMY 00140000 //SYSPRINT DD DUMMY 00150000 //SYSUT2 DD DSN=&&REXX(GETGRENT),DISP=(,PASS),UNIT=SYSALLDA, 00160000 // SPACE=(TRK,(1,1,1)),BLKSIZE=800,LRECL=80,RECFM=FB 00170000 //SYSUT1 DD * 00180000 /* REXX */ 00190002 parse source . . . . . . . envt . 00200002 if envt <> "OMVS" then 00210002 call syscalls 'ON' 00220002 address syscall 00230002 do forever 00240002 'getgrent gr.' 00250002 if retval=0 ³ retval=-1 then 00260002 leave 00270002 say 'Name=' gr.gr_name 'GID=' gr.gr_gid , 00280002 'Number=' gr.gr_members 00290002 end 00300002 //REXX EXEC PGM=IRXJCL,REGION=1M, 00310000 // PARM='GETGRENT' 00320000 //SYSEXEC DD DSN=&&REXX,DISP=(SHR,PASS) 00330000 //SYSTSPRT DD SYSOUT=* 00340000 // 00350002 ./ ADD NAME=RXGETMNT //CLARKRX2 JOB ACCT,'BATCH REXX',NOTIFY=&SYSUID,MSGCLASS=K 00010001 //* 00020001 //* ************************************************************** * 00030001 //* * 00040001 //* THIS REXX EXAMPLE USES THE "GETMNTENT" FUNCTION TO RETURN * 00050001 //* INFORMATION ABOUT MOUNTED FILE SYSTEMS (HFS/TFS/zFS). * 00060001 //* STATISTICS FOR EACH FILE SYSTEM RETURNED ARE DISPLAYED. * 00070001 //* * 00080001 //* ************************************************************** * 00090001 //* 00100001 //COPY EXEC PGM=IEBGENER 00110000 //SYSIN DD DUMMY 00120000 //SYSPRINT DD DUMMY 00130000 //SYSUT2 DD DSN=&&REXX(GETMNTE),DISP=(,PASS),UNIT=SYSALLDA, 00140000 // SPACE=(TRK,(1,1,1)),BLKSIZE=800,LRECL=80,RECFM=FB 00150000 //SYSUT1 DD * 00160000 /* REXX */ 00170000 parse source . . . . . . . envt . 00180000 if envt <> "OMVS" then 00190000 call syscalls 'ON' 00200000 address syscall 00210000 mt.0=0 00220000 'getmntent mt.' 00230000 do i=1 to mt.0 00240000 say mt.mnte_fsname.i 00250000 say ' Type =' mt.mnte_fstype.i, 00260000 'Reads =' mt.mnte_readct.i, 00270000 'Writes =' mt.mnte_writect.i, 00280000 'Path =' mt.mnte_path.i 00290000 end 00300000 //REXX EXEC PGM=IRXJCL,REGION=1M, 00310000 // PARM='GETMNTE' 00320000 //SYSEXEC DD DSN=&&REXX,DISP=(SHR,PASS) 00330000 //SYSTSPRT DD SYSOUT=* 00340000 // 00350001 ./ ADD NAME=RXGETPSE //CLARKRX3 JOB ACCT,'BATCH REXX',NOTIFY=&SYSUID,MSGCLASS=K 00010001 //* 00020001 //* ************************************************************** * 00030001 //* * 00040001 //* THIS REXX EXAMPLE USES THE "GETPSENT" FUNCTION TO GET DATA * 00050001 //* ABOUT EACH ACTIVE UNIX PROCESS. SELECTED INFORMATION IS * 00060001 //* PRINTED FOR EACH PROCESS. THE NUMBER OF PROCESSES RETURNED * 00070001 //* MAY BE AFFECTED BY YOUR SECURITY PROFILE. * 00080001 //* * 00090001 //* ************************************************************** * 00100001 //* 00110001 //COPY EXEC PGM=IEBGENER 00120001 //SYSIN DD DUMMY 00130000 //SYSPRINT DD DUMMY 00140000 //SYSUT2 DD DSN=&&REXX(GETPSENT),DISP=(,PASS),UNIT=SYSALLDA, 00150000 // SPACE=(TRK,(1,1,1)),BLKSIZE=800,LRECL=80,RECFM=FB 00160000 //SYSUT1 DD * 00170000 /* REXX */ 00180000 parse source . . . . . . . envt . 00190000 if envt <> "OMVS" then 00200000 call syscalls 'ON' 00210000 address syscall 00220000 ps.0=0 00230000 say ' PID GID Size Command' 00240000 say '---------- ---------- ---------- -------' 00250000 'getpsent ps.' 00260000 do i=1 to ps.0 00270000 say right(ps.i.ps_pid,10), 00280000 right(ps.i.ps_pgpid,10), 00290000 right(ps.i.ps_size,10), 00300000 ' ' ps.i.ps_cmd 00310000 end 00320000 //REXX EXEC PGM=IRXJCL,REGION=1M, 00330000 // PARM='GETPSENT' 00340000 //SYSEXEC DD DSN=&&REXX,DISP=(SHR,PASS) 00350000 //SYSTSPRT DD SYSOUT=* 00360000 // 00370001 ./ ADD NAME=RXGETPWE //CLARKRX4 JOB ACCT,'BATCH REXX',NOTIFY=&SYSUID,MSGCLASS=K 00010001 //* 00020002 //* ************************************************************** * 00030002 //* * 00040002 //* THIS REXX EXAMPLE USES THE "GETPWENT" FUNCTION TO GET USER * 00050002 //* ENTRIES FROM THE SECURITY DATA BASE. THE FUNCTION IS CALLED * 00060002 //* MULTIPLE TIMES UNTIL ALL ENTRIES ARE RETURNED. FOR EACH * 00070002 //* ENTRY THE USER NAME, USER ID (UID) AND GROUP ID ARE SHOWN. * 00080002 //* YOU MUST HAVE THE PROPER SECURITY PERMISSIONS TO RUN THIS. * 00090002 //* * 00100002 //* ************************************************************** * 00110002 //* 00120002 //COPY EXEC PGM=IEBGENER 00130000 //SYSIN DD DUMMY 00140000 //SYSPRINT DD DUMMY 00150000 //SYSUT2 DD DSN=&&REXX(GETPWENT),DISP=(,PASS),UNIT=SYSALLDA, 00160000 // SPACE=(TRK,(1,1,1)),BLKSIZE=800,LRECL=80,RECFM=FB 00170000 //SYSUT1 DD * 00180000 /* REXX */ 00190001 parse source . . . . . . . envt . 00200001 if envt <> "OMVS" then 00210001 call syscalls 'ON' 00220001 address syscall 00230001 do forever 00240001 'getpwent pw.' 00250001 if retval=0 ³ retval=-1 then 00260001 leave 00270001 say 'Name=' pw.pw_name 'UID=' pw.pw_uid , 00280001 'GID=' pw.pw_gid 00290001 end 00300001 //REXX EXEC PGM=IRXJCL,REGION=1M, 00310000 // PARM='GETPWENT' 00320000 //SYSEXEC DD DSN=&&REXX,DISP=(SHR,PASS) 00330000 //SYSTSPRT DD SYSOUT=* 00340000 // 00350001 ./ ADD NAME=RXSTATFS //CLARKRX5 JOB ACCT,'BATCH REXX',NOTIFY=&SYSUID,MSGCLASS=K 00010001 //* 00020001 //* ************************************************************** * 00030001 //* * 00040001 //* THIS REXX EXAMPLE USES THE "STATFS" FUNCTION TO RETURN DATA * 00050001 //* ABOUT A SPECIFIC MOUNTED FILE SYSTEM. YOU *MUST* MODIFY THE * 00060001 //* PARM PARAMETER IN THE REXX STEP TO CONTAIN THE NAME OF A * 00070001 //* MOUNTED FILE SYSTEM (HFS/TFS/zFS). SPACE INFORMATION IS * 00080001 //* SHOWN FOR THE REQUESTED FILE SYSTEM. IF THE AMOUNT OF FREE * 00090001 //* SPACE REMAINING IS LESS THAN 10%, THE RETURN CODE OF THE REXX * 00100001 //* STEP IS SET TO 4. SEVERAL METHODS FOR HANDLING ERRORS ARE * 00110001 //* ALSO SHOWN IF THE FUNCTION FAILS BECAUSE OF AN INVALID FILE * 00120001 //* SYSTEM NAME OR SOME OTHER PROBLEM. * 00130001 //* * 00140001 //* ************************************************************** * 00150001 //* 00160001 //COPY EXEC PGM=IEBGENER 00170001 //SYSIN DD DUMMY 00180000 //SYSPRINT DD DUMMY 00190000 //SYSUT2 DD DSN=&&REXX(STATFS),DISP=(,PASS),UNIT=SYSALLDA, 00200000 // SPACE=(TRK,(1,1,1)),BLKSIZE=800,LRECL=80,RECFM=FB 00210000 //SYSUT1 DD * 00220000 /* REXX */ 00230001 numeric digits 2 00240001 parse source . . . . . . . envt . 00250001 if envt <> "OMVS" then 00260001 call syscalls 'ON' 00270001 address syscall 00280001 parse upper arg filenm . 00290001 if filenm = '' then 00300001 do 00310001 say 'You Must Specify a File System Name (HFS/zFS/TFS)' 00320001 exit 8 00330001 end 00340001 00350001 'statfs (filenm) fs.' 00360001 if retval = -1 then 00370001 do 00380001 say 'Error processing File System:' filenm 00390001 say 'Return=' errno '/ Reason=' errnojr 00400001 say ' ' 00410001 'strerror' errno errnojr 'erd.' 00420001 say 'Error =' erd.se_errno 00430001 say 'Reason =' erd.se_reason 00440001 say 'Action =' erd.se_action 00450001 say 'Module =' erd.se_modid 00460001 exit 8 00470001 end 00480001 say filenm 00490001 pcf = (fs.stfs_bfree * 100) / fs.stfs_total 00500001 say ' Total Blocks = ' fs.stfs_total 00510001 say ' Free Blocks = ' fs.stfs_bfree 00520001 say ' Percent Free = ' pcf '%' 00530001 if pcf < 10 then exit 4 00540001 //REXX EXEC PGM=IRXJCL,REGION=1M, 00550000 // PARM='STATFS HFS.ROOT' <--- NAME OF HFS/TFS/ZFS ******** 00560001 //SYSEXEC DD DSN=&&REXX,DISP=(SHR,PASS) 00570000 //SYSTSPRT DD SYSOUT=* 00580000 // 00590001 ./ ADD NAME=RXUNAME //CLARKRX6 JOB ACCT,'BATCH REXX',NOTIFY=&SYSUID,MSGCLASS=K 00010002 //* 00020002 //* ************************************************************** * 00030002 //* * 00040002 //* THIS REXX EXAMPLE USES THE "UNAME" FUNCTION TO GET AND DISPLAY * 00050002 //* INFORMATION ABOUT THE HOST SYSTEM ON WHICH THE PROGRAM IS * 00060002 //* RUNNING. * 00070002 //* * 00080002 //* ************************************************************** * 00090002 //* 00100002 //COPY EXEC PGM=IEBGENER 00110000 //SYSIN DD DUMMY 00120000 //SYSPRINT DD DUMMY 00130000 //SYSUT2 DD DSN=&&REXX(UNAME),DISP=(,PASS),UNIT=SYSALLDA, 00140000 // SPACE=(TRK,(1,1,1)),BLKSIZE=800,LRECL=80,RECFM=FB 00150000 //SYSUT1 DD * 00160000 /* REXX */ 00170001 parse source . . . . . . . envt . 00180001 if envt <> "OMVS" then 00190001 call syscalls 'ON' 00200001 address syscall 00210000 'uname us.' 00220000 say 'Hardware Type =' us.u_machine 00230000 say 'System ID =' us.u_nodename 00240000 say 'OS Type =' us.u_sysname 00250000 say 'OS Release =' us.u_release 00260000 say 'OS Version =' us.u_version 00270000 //REXX EXEC PGM=IRXJCL,REGION=1M, 00280000 // PARM='UNAME' 00290000 //SYSEXEC DD DSN=&&REXX,DISP=(SHR,PASS) 00300000 //SYSTSPRT DD SYSOUT=* 00310000 // 00320002 ZZ 00710000 // 00720000