A VTAM SPO Program How many times have you wanted to know the session load of the particular applications in your shop? Or the availability of certain VTAM resources (such as the number of unused connections on a 7171 or the status of your NJE SNA links)? Or get information from VTAM which didn't spew across the system console and didn't disappear as fast as the console could scroll? The VTAM Command Facility (VCF) solves all of these problems. VCF is a VTAM Secondary Program Operator program which can take a command (such as "D NET,ID=LINEXX"), pass it to VTAM, and receives the results, displaying them on your terminal or storing them in a file. VTAM SPO's have several desirable characteristics: their command output will not clutter the console, the console's scrolling activity will not affect the command output, and other VTAM command activity output will not be affected (in contrast to the effect of a Primary Program Operator (PPO) program, which captures ALL VTAM messages.) VTAM Customization, Version 3, Releases 1, 1.1, 1.2 and 2, Appendix E, Program Operator Coding Requirements, details how you can write a program operator. While the program here takes the command from the parm passed to it, it is a trivial matter to read a series of commands from an input file. All VTAM commands can be executed by VCF except the "Z NET" command--VTAM will refuse to issue this command when it comes from a Program Operator program. //JOBCARD JOB //* //* //ASM EXEC PGM=IEV90,COND=(0,LT),PARM='LIST,OBJECT,NODECK,XREF,LOAD' //* //SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSIN DD * * * PROGRAM: VCF (VTAM COMMAND FACILITY) * AUTHOR: DAVID SAUNDERS, UNIVERSITY OF VIRGINIA * DATE: NOV 18, 1990 * * THIS PROGRAM CONTAINS NO WARRENTY AND IS SUBMITTED FOR USE AT YOUR * OWN RISK. THE AUTHOR AND THE UNIVERSITY OF VIRGINIA WILL NOT BE * HELD LIABLE FOR ANY ERROR EXISTING IN THIS CODE OR INTRODUCED * BY ANYONE ELSE AS A MODIFICATION OF IT. * * THIS PROGRAM IS A VTAM SECONDARY PROGRAM OPERATOR (SPO). IT * ALLOWS YOU TO ISSUE VTAM COMMANDS AND TO DISPLAY THE RESULTS WITHOUT * CLUTTERING THE OPERATORS SCREEN, OR TO SAVE THE RESULTS IN A FILE, * ALLOWING FOR A MORE LEISURELY EXAMINATION OF THE RESULTS. * * YOU MUST ALLOCATE THE FILE "RESULTS" BEFORE RUNNING THIS PROGRAM. * * YOU MUST ALSO DEFINE AN APPLID WHICH THE PROGRAM WILL USE: * * VBUILD TYPE=APPL 00000100 * XXXXACB APPL EAS=0,AUTH=(SPO) 00000506 * * YOU CAN ALSO DEFINE MULTIPLE APPLIDS AND HAVE THE PROGRAM PICK ONE * (BASED ON TSO USER ID, FOR INSTANCE). THIS WOULD ALLOW FOR * SIMULTANEOUS USAGE BY DIFFERENT PEOPLE. * * * * R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * * VTAM COMMAND FACILITY--START * VCF CSECT STM R14,R12,12(R13) ADDRESSABILITY LR R12,R15 USING VCF,R12 LA R11,SAVE ST R11,8(R13) ST R13,4(R11) LR R13,R11 * LA R11,NETRES POINT AT RESULT AREA USING ISTDPOHD,R11 DSECT FOR CONTROL BYTES * L R1,0(R1) GET POINTER TO PARM LH R3,0(R1) GET PARM LENGTH LTR R3,R3 TEST LENGTH BNZ GETCMD B IF LENGTH > 0 LA R15,4 NO PARM--EXIT WITH RC=4 B EXIT2 * GETCMD MVC NETCMD2(100),BLANKS CLEAR COMMAND BUFFER BCTR R3,R0 DECREMENT FOR EX INSTRUCTION EX R3,MOVCMD MOVE THE COMMAND LA R3,5(R3) INC AFTR EX & ADD FOR 4 HDR BYTS * * OPEN SEQUENTIAL OUTPUT FILE AND VTAM ACB * OPENNET OPEN ACB1 LTR R15,R15 BZ OPENFILE LA R15,12 B EXIT2 OPENFILE OPEN (RESULTS,OUTPUT) * * SEND COMMAND TO VTAM * SENDCMD1 SENDCMD RPL=RPL1,AREA=NETCMD,RECLEN=(R3),OPTCD=SYN LTR R15,R15 BZ RECVCMD1 B IF COMMAND SENT OK LA R15,16 ELSE SET RC=16 AND EXIT B ENDNET * * RECEIVE A LINE OF OUTPUT FROM VTAM * RECVCMD1 RCVCMD RPL=RPL1,AREA=NETRES,AREALEN=NETRESL,OPTCD=(SYN,TRUNC) LTR R15,R15 BZ CHECKRES BRANCH IF WE RECEIVED A LINE LA R15,20 ELSE SET RC=20 AND EXIT B ENDNET * * PERFORM COMMAND ANALYSIS * CHECKRES PUT RESULTS,NETRES+4 WRITE OUTPUT TO FILE MVC NETRES+11(119),BLANKS BLANK OUT VTAM RESULT TEXT TM POHSTAT,POHEND END LINE OF A MULTI-LINE MSG? BO ENDNET IF SO, EXIT TM POHSTAT,POHDATA DATA LINE OF A MULTI-LINE MSG? BO RECVCMD1 IF SO, CONTINUE GETTING DATA TM POHSTAT,POHLBL LABEL LINE OF A MULTI-LINE MSG? BO RECVCMD1 IF SO, CONTINUE GETTING DATA TM POHSTAT,POHCNTRL CNTRL LINE OF A MULTI-LINE MSG? BO RECVCMD1 IF SO, CONTINUE GETTING DATA CLC NETRES+4(7),=CL7'IST097I' IS THIS AN IST097I MSG? BE RECVCMD1 IF SO, IS PART OF ML MSG B ENDNET EXIT * * CLOSE THE ACB * ENDNET CLOSE ACB1 * * CLOSE RESULTS FILE AND EXIT * EXIT1 CLOSE (RESULTS) SR R15,R15 * EXIT2 L R13,4(R13) LM R0,R12,20(R13) L R14,12(R13) BR R14 * * RESULTS FILE DEFINITION * RESULTS DCB DDNAME=RESULTS,LRECL=126,BLKSIZE=126,RECFM=F, X MACRF=PM,DSORG=PS * BLANKS DC CL130' ' * * COMMAND TO BE SENT TO VTAM * NETCMD DC X'00030000' COMMAND HEADER NETCMD2 DS CL100 COMMAND NETCMDL EQU *-NETCMD * NETRES DS CL130 RESULT AREA NETRESL EQU *-NETRES * RPL1 RPL AM=VTAM,ACB=ACB1,OPTCD=SYN ACB1 ACB AM=VTAM,APPLID=PGMNAME,MACRF=NLOGON * * APPLID AREA * PGMNAME DC XL1'08' DC CL8'XXXXACB ' <==REPLACE THIS WITH YOUR APPLID * SAVE DS 18F SAVE AREA MOVCMD MVC NETCMD2(0),2(R1) MOVE PARM STRING TO COMMAND AREA LTORG ISTDPOHD END /* //SYSLIN DD DSN=&&OBJ,DISP=(,PASS),UNIT=SYSDA, // DCB=(RECFM=FB,BLKSIZE=960,LRECL=80),SPACE=(CYL,(1,1)) //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(5,5)) //SYSUT2 DD UNIT=SYSDA,SPACE=(CYL,(5,5)) //SYSUT3 DD UNIT=SYSDA,SPACE=(CYL,(5,5)) //SYSUDUMP DD SYSOUT=Q //* //* //* //LINK EXEC PGM=IEWL,COND=(0,LT),PARM='XREF,LET' //SYSPRINT DD SYSOUT=* //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(1,1)) //SYSLMOD DD DSN=YOUR.PROGRAM.LIBRARY(VCF),DISP=SHR //SYSLIN DD DSN=&&OBJ,DISP=(OLD,DELETE)