DC/UCF Exits

idms19
DC/UCF user exits allow the site to call site-specific system processing routines. You must associate each user exit routine with a user exit entry point. These entry points are predefined by the system.
2
2
To include a DC/UCF user exit routine other than IDMSSVCX in the system, do the following:
  1. Code the routine based on the information presented in this section.
  2. Link edit the entry point with IDMSUXIT.
To include the IDMS SVC exit routine in the system on z/OS and z/VM systems, link it with the SVC as described in IDMSSVCX." On z/VSE systems, assemble and link the exit routine as a standalone program.
At runtime, the system calls a user exit routine by means of the predefined entry point for the exit. After the exit routine is performed, control returns to the calling module.
If you
do not
link edit a given user exit entry point with IDMSUXIT, the user exit is bypassed at runtime, except for WTOEXIT and WTOREXIT, which can be loaded dynamically. In this case, system operations continue without interruption.
DC/UCF user exits are listed in the following table and described individually after the table.
Entry point
DC/UCF module
Usage of exit
IDMSSVCX
The CA IDMS SVC (or equivalent module)
To capture transaction accounting statistics
TCKREXIT
DC/UCF startup module
To monitor time-related events
USRIDXIT
IDMSSTRT, UCFCICS, or IDMSINTC
To modify the user who is to sign on to the DC/UCF system.
WAITEXIT
DC/UCF startup module
To monitor operating system waits
WTOEXIT
IDMSOS00 or the DC/UCF startup module
To review DC/UCF messages
WTOREXIT
IDMSOS00 or the DC/UCF startup module
To modify operator communications
IDMSSVCX
Entry point
  • IDMSSVCX
    IDMSSVCX is executed whenever an external request attempts to sign on to any DC/UCF system using the CA IDMS SVC. IDMSSVCX is called when the external request attempts signon and is entered in the application program's address space. For z/VM, IDMSSVCX is entered in the virtual machine that is running DC/UCF.
The exit permits you to write information to the following areas:
  • z/OS and z/VSE -- To the extension of the external request element (ERE) in the CA IDMS SVC
  • z/VM -- To the accounting interface for the z/VM system
The SVC exit can contain multiple routines that each update a new variable item in the SVX (described below). Each routine should find the beginning of the SVX and then add the value in SVXAMTUS to find the location at which a new item may be added. Before adding an item, be sure that the total extension length will not exceed the value in ESESVCXLN. Even the first routine in the exit must use the existing value for the SVXAMTUS since some space in the extension may have been reserved for internal CA IDMS items.
The total length of all the items added by the SVC exit, including the 4-byte fixed portion of each item, must be added together to calculate the value for the SVCXLEN parameter on the #SVCOPT macro that is discussed in "Setting Up Interpartition Communication and the SVC."
Sample uses
IDMSSVCX can be used to do the following:
  • Perform extended user processing of ERUS accounting data. For example, checking the time of day to verify that the user/job is allowed to run at that time.
  • Extract information from online programs. For example, CICS accounting information can be extracted from a CICS program.
  • Handle task statistics records. Information written to the ERE extension is passed to DC/UCF, and the first 40 bytes of one item subsequently are written to the task statistics record in the system log file. After the log file has been offloaded to an archive file, data extracted by the IDMSSVCX exit can be used to identify, sort, report on (using DC/UCF statistics reports), and otherwise manipulate task statistics records.
    If an item in the ERE extension has an item id of 'UA', the first 40 bytes of that item are written to the system log file. If no item has an id of 'UA', then the first 40 bytes of the first item are used.
    Task statistics must be enabled at system generation time, as discussed in Statistics.
ERE extension
The ERE extension consists of a 4 byte header followed by a variable number of entries. The header and variable entries are defined by the SVX DSECT available in the installed source member #SVXDS. The DSECT is as follows:
******************************************************************** *** *** * SVX: SVC EXTENSION DSECT. * * * *** *** ******************************************************************** SVX DSECT ******************************************************************** * THE SVC EXTENSION HAS ONE HEADER, AS DESCRIBED BELOW. * *
NOTE:
TOTAL BYTES IN SVC EXSTENTION IS STORED IN ESESVXLN. * * SO, NBR OF FREE BYTES = ESESVXLN - SVXAMTUS. * ******************************************************************** SVXAMTUS DS H AMOUNT OF BYTES USED IN SVC EXTEN. DS H *UNUSED* SVXFIXHL EQU *-SVXAMTUS LENGTH OF FIXED HEADER. ******************************************************************** * THERE ARE N ITEMS WITHIN THE EXTENSION, N > OR = 0. * * * * ADDRESS OF FIRST ITEM = A(ERE) + ESESOXOF + ESESOXLN + SVXFIXHL * * ADDRESS OF NEXT ITEM = CURRENT_ADDR + SVXFIXIL + SVXITMLN * * * * "C" IN 1ST BYTE OF SVXITMID MARKS CA IDMS RESERVED ITEMS. * * USER DEFINED ITEMS MUST NOT HAVE "C" IN 1ST BYTE OF THE ID. * * * * IF AN SVCX ITEM EXISTS WITH AN ID OF "UA", THE FIRST 40 BYTES OF * * THAT ITEM'S DATA GETS WRITTEN IN THE TASK STATISTICS RECORD. * * IF NO "UA" ITEM EXISTS, THE DATA FROM THE FIRST ITEMS GETS USED. * * * * BEFORE LAYING DOWN A NEW EXTENSION, MAKE SURE THAT YOU DON'T * * EXCEED THE LENGTH STORED IN ESESVXLN. * ******************************************************************** SVXITEM DS OH ONE ITEM. SVXITMLN DS H LENGTH OF SVXITEMD. SVXITMID DS CL2 ITEMS ID. SVXUACCT EQU C'UA' ID LENGTH FOR USER ACCOUNTING DATA. SVXFIXIL EQU *-SVXITEM LENGTH OF FIXED PART OF ITEM. SVXITEMD DS OC ITEM DATA. LENGTH IS VARIABLE. EJECT
Parameters
The following registers pass values to IDMSSVCX:
  • Register 1 (z/OS and z/VSE) provides addressability to the local request element (LRE).
    Register 1 (z/VM) provides a parameter list of the following control blocks:
    • Logical request element (LRE) address, at offset +0
    • External request element (ERE) address, at offset +4
    • External service element (ESE) address, at offset +8
    • z/VM element (VME) address, at offset +12
  • Register 2 (z/OS and z/VSE) provides addressability to the external service element (ESE).
  • Register 5 (z/OS) provides addressibility to the SVX.
  • Register 15 contains either of the following pieces of information:
    • z/OS and z/VSE -- Provides addressability to the external request element (ERE)
    • z/VM -- Contains the entry-point address
Considerations
A IDMSSVCX routine can be coordinated with the following two numbered exits, which are detailed in System-invoked Numbered Exits.
  • Exit 5 (task termination exit I) can be invoked to extract accounting data at run-unit signoff.
  • Exit 14 (bind run unit and ready area exit) can be invoked to perform security checks when a BIND RUN UNIT or READY AREA statement is issued. For example, exit 14 can cause a transaction to abort based on the job accounting information collected through IDMSSVCX.
IDMSSVCX can use:
  • Register 0
  • Register 3
  • Register 4 for non-z/OS systems
  • Register 5
  • Register 10 for z/OS systems
Return codes
None.
IDMSSVCX Examples
A sample IDMSSVCX macro appears below for z/OS, z/VSE, and z/VM operating systems. The sample is also available in the installed CA IDMS source library. Tailor the sample for your operating system environment.
The exit routines in this sample macro extract information from the jobcard associated with each external request unit signing on to the DC/UCF system.
z/OS sample IDMSSVCX user exit
MACRO &NAME. IDMSSVCX &VM=NO.,&SVCXLEN=0.,&VSE=NO. AIF ('&VM'. EQ 'YES' AND '&VSE'. EQ 'YES').ERROR AIF ('&VM'. EQ 'YES').VMXIT ? VM EXIT AIF ('&VSE'. NE 'YES').NOTVSE **************************************************************** * * * ON ENTRY R1 = A(LRE) * * R2 = A(ESE) * * R13 = SAME AS WHEN SVC INVOKED * * NOTE : FOR CICS THIS IS THE CSA ADDRESS * * R15 = A(ERE) * * R14 = RETURN ADDRESS * * * **************************************************************** * [email protected] EQU 16 LENGTH OF DATA WE WANT TO STORE. USING ERE,R15 USING ESE,R2 USING LRE,R1 AIF ('&NAME'. EQ '').VSE2 &NAME. CSECT AGO .VSE2A .VSE2 ANOP IDMSSVCX CSECT .VSE2A ANOP BALR R8,0 USING *,R8 PUSH USING LA R5,ERE LOAD ERE BASE. AH R5,ESESOXOF POINT R5 TO AH R5,ESESOXLN SVC EXTENSION. USING SVX,R5 (SVX) LH R3,SVXAMTUS GET AMOUNT USED. LA R4,0(R3,R5) POINT R4 TO UNUSED AREA. USING SVXITEM,R4 (SVXITEM) AH R3,=AL2([email protected]+SVXFIXIL) ADD IN WHAT WE WANT. CH R3,ESESVXLN IF USED+WANTED > SVX LENG BH [email protected] THEN: END WITHOUT ADO. STH R3,SVXAMTUS NEW AMOUNT USED. MVC SVXITMLN,=AL2([email protected]) ITEM'S LENGTH. MVC SVXITMID,=AL2(SVXUACCT) ITEM'S ID. * ************************************************************** * GET THE ACCOUNT INFORMATION AND MOVE IT INTO THE DATA AREA * * OF THE SVXITEM THAT R4 POINTS TO. * ************************************************************** * SPACE CLC =C'VME',LREID COMING FROM VM ? BNE DSVX01 NO * USING VME,R1 MVC SVXITEMD(8),VMEUSER MOVE VM USER NAME MVI SVXITEMD+8,C' ' MVC SVXITEMD+9([email protected]),SVXITEMD+8 CLEAR REST USING LRE,R1 BR R14 EXIT * DSVX01 DS 0H L R3,X'14' LOAD CURRENT COMREG AREA LTR R3,R3 VALID ADDRESS? BZR R14 ..NO GOOD - MUST BE LOST * USING COMREG,R3 (COMREG) L R3,JAPART GET JOB PARTITION TABLE LTR R3,R3 ANY ADDRESS? BZR R14 NO - EXIT DROP R3 (COMREG) * USING JPT,R3 (JPT) CLC JPTUFLD,=CL16' ' ANY USER = DATA BER R14 ..NO - EXIT CLC JPTUFLD,=16X'00' IS MEMORY NULL BER R14 ..YES - NO FIELDS TO MOVE MVC SVXITEMD([email protected]),JPTUFLD MOVE ACCOUNT INFO TO EXT * [email protected] DS 0H BR R14 RETURN * LTORG * #REGEQU MAPCOMR * JPT DSECT mm/dd/yy JPTUFLD EQU JPT+56 16 BYTES OF ACCOUNTING INFO * COPY #LREDS COPY #EREDS COPY #ESEDS COPY #SVXDS MEXIT .NOTVSE ANOP COPY #EREDS COPY #ESEDS COPY #SVXDS #REGEQU IDMSSVCX CSECT *********************************************************************** * This code is executed for non z/VSE and z/VM systems. It supports the * the following systems: z/OS (all flavors). * * Register utilization is as follows: * R1 - Points to the LRE. * R2 - Points to the ESE. * R3 - Used to get to the account info. * R4 - Used to return to IDMSMSVC. * R5 - Points to the SVX. * R10 - Points to the SVXITEM. * R12 - Bases the exit code. * R14 - Must not be modified. * R15 - Points to the ERE. * *********************************************************************** SPACE SVX01000 DS 0H BALR R12,0 USING *,R12 USING ESE,R2 USING SVX,R5 R5 POINTS TO THE SVC EXTENSION SPACE B SVX01100 Skip over the eyecatcher. DC CL8'IDMSSVCX' Eyecatcher for dump reading. SPACE SVX01100 DS 0H LH R3,SVXAMTUS GET AMOUNT USED. LA R10,0(R3,R5) POINT R10 TO UNUSED AREA. USING SVXITEM,R10 R10 POINTS TO SVXITEM AH R3,=AL2([email protected]+SVXFIXIL) ADD IN WHAT WE WANT. CH R3,ESESVXLN IF USED + WANTED > SVX LENGTH BH [email protected] THEN: END WITHOUT ADO. STH R3,SVXAMTUS NEW AMOUNT USED. MVC SVXITMLN,=AL2([email protected]) ITEM'S LENGTH. MVC SVXITMID,=AL2(SVXUACCT) ITEM'S ID. SPACE ************************************************************** * Get the account information and move it into the data area * * of the SVXITEM that R10 points to. * ************************************************************** SPACE L R3,X'B4'(,R9) PICKUP A(JSCB) L R3,X'104'(,R3) R3---JCT-X'10' LA R3,X'10'(,R3) R3---JCT L R3,X'28'(,R3) R3---ACT SPACE SRL R3,8 MOVE ADDR OVER MVC SVXITEMD([email protected]),X'31'(R3) MOVE ACCOUNT INFO TO EXT SPACE [email protected] DS 0H BR R4 RETURN TO IDMSMSVC [email protected] EQU 40 LENGTH OF DATA WE WANT TO STORE. DROP R5,R10 (SVX) (SVXITEM) MEXIT .VMXIT ANOP *********************************************************************** * SVC EXIT FOR VM STARTS HERE. WHEN INVOKED BY IDMSUSVC REGISTER * CONTENTS WILL BE AS FOLLOWS: * R1 ─► PLIST OF FOLLOWING FORMAT * +0 A(LRE) * +4 A(ERE) * +8 A(ESE) * +C A(VME) * R13 ─► STANDARD OS SAVE AREA * R14 ─► RETURN ADDRESS * R15 ─► ENTRY POINT ADDRESS * * WE WILL ESTABLISH R12 AS BASE REGISTER WITHIN OUR CODE. * PUSH AND POP ASSEMBLER DIRECTIVES ARE USED TO SAVE AND * RESTORE THE BASE. * * RETURN IS MADE VIA R14. SET R15 TO A NON-ZERO VALUE IF * THE RUN UNIT IS TO BE ABENDED. *********************************************************************** SPACE PUSH USING ENTRY SVCEXIT USING SVCEXIT,R15 SVCEXIT B VM&SYSNDX. DC H'&SVCXLEN'. VM&SYSNDX. DS 0H DROP R15 LR R12,R15 ESTABLISH BASE USING SVCEXIT,R12 L R3,4(R1) R3 ─► ERE L R4,8(R1) R4 ─► ESE USING ERE,R3 USING ESE,R4 LA R5,ERE AH R5,ESESOXOF AH R5,ESESOXLN USING SVX,R5 (SVX) LH R2,SVXAMTUS GET AMOUNT USED. LA R5,0(R2,R5) POINT R5 TO UNUSED AREA. DROP R5 USING SVXITEM,R5 (SVXITEM) AH R2,=AL2([email protected]+SVXFIXIL) ADD IN WHAT WE WANT. CH R2,ESESVXLN IF USED+WANTED > SVX LENG BH [email protected] THEN: END WITHOUT ADO. STH R2,SVXAMTUS NEW AMOUNT USED. MVC SVXITMLN,=AL2([email protected]) ITEM'S LENGTH. MVC SVXITMID,=AL2(SVXUACCT) ITEM'S ID. L R2,0(R1) R2 ─► LRE USING LRE,R2 ********************************************************************* * R5 NOW POINTS AT THE ERE EXTENSION ITEM. * * INSERT ADDITIONAL CODE TO PROCESS THE REQUEST AND SET * * THE RETURN CODE FOLLOWING THIS COMMENT BLOCK. * ********************************************************************* [email protected] DS 0H LA R15,0 BR R14 DROP R12,R2,R3,R4,R5 POP USING .ERROR ANOP MNOTE 8,'&VSE=. AND &VM=. CAN NOT BE BOTH SPECIFIED AS YES' MEND /*
Steps to Add IDMSSVCX to Your System
Perform the following steps to add IDMSSVCX to your system:
  1. Code SVC exit parameters
  2. Modify the sample IDMSSVCX macro
  3. Make the IDMSSVCX module available
  4. Link edit IDMSSVCX
Code SVC Exit Parameters
Code SVC exit parameters appropriate to your operating system to specify that the IDMSSVCX exit is used at the site:
Operating System
SVC Exit Parameter
z/OS
Specify the following parameter in the #SVCOPT macro
SVCXLEN; specify, in bytes, the length of the ERE extension
z/VSE
Specify the following parameter in the #DEFSVC macro when IDMSVCTB is generated:
SVCXNAME; specify the name of your SVC user exit module
SVCXLEN; specify, in bytes, the length of the ERE extension
z/VM
Specify the following parameters in the IDMSSVCX macro:
VM=YES
SVCXLEN; specify, in bytes, the length of the ERE extension
For more information on SVC exit parameters, see the documentation for your system's CA IDMS SVC macro in "Setting Up Interpartition Communication and the SVC."
Modify the sample IDMSSVCX macro
Modify the sample IDMSSVCX macro to add any site-specific logic such as site-coded validation or accounting routines.
Make the IDMSSVCX module available
Make IDMSSVCX available, as follows:
  • z/OS -- After modifying the IDMSSVCX macro, assemble and link it into your custom load library by executing the z/OS Assemble and Link-Edit JCL (see "Sample z/OS JCL"). Include your IDMSSVCX load module when creating the IDMS SVC.
  • z/VM -- Create an Assembler source module that invokes the IDMSSVCX macro. This module can contain other exits to simplify maintenance.
  • z/VSE -- Assemble and link IDMSSVCX as a stand-alone phase.
    1. Assemble and catalog the module using the sample JCL from the "z/VSE Assemble JCL" section of the "Sample z/VSE JCL" topic.
      Modify the JCL by substituting the following in place of the
      Assembler input statements
      .
      You must first place your modified IDMSSVCX macro in your idms.sublib.
      PUNCH 'CATALOG idmssvcx.OBJ REPLACE=YES' IDMSSVCX VSE=YES END
    2. Link the IDMSSVCX program using the sample JCL in "z/VSE Link JCL."
      Modify the JCL by substituting the following statements in place of the
      Linkage editor control statements
      :
      PHASE IDMSSVCX INCLUDE
      idmssvcx
      ENTRY IDMSSVCX
      • idmssvcx
        Specifies the name of the object module created by the assembly.
TCKREXIT
Entry point
TCKREXIT
This exit is called whenever the ticker interval expires. The ticker interval is established at system generation time by the TICKER INTERVAL parameter of the SYSTEM statement.
Sample uses
TCKREXIT can be used to monitor time-related events.
Considerations
This exit routine must not destroy the contents of registers 8 through 15. Note that no save area is passed in register 13.
Call this exit by using the following instruction:
BALR R14,R15
Parameters
None.
Return codes
None.
USRIDXIT
Entry point
USRIDXIT
Linking USRIDXIT
USRIDXIT can be linked with the following programs:
  • IDMSUXIT for access from batch or from a TSO front-end.
  • UCFCICS for UCF access from a CICS Transaction front-end. For more information, see the sample link-edit JCL in "CICS Front-end JCL."
  • IDMSINTC for DML or SQL access from a CICS Transaction Server front-end. For more information, see the sample link-edit JCL in "IDMSINTC."
Description
Called whenever an automatic signon to a DC/UCF system is to be performed from a non-DC/UCF front-end.
Parameters
When USRIDXIT is called, register 1 points to the SON. The SON is described by the #SONDS DSECT.
Considerations
Two sample source modules are suppplied in the installed IDMS source library: USRIDXIT and USRXCICS. The USRIDXIT source is suitable for batch and TSO access. It can also be used for UCF, DML, or SQL access from CICS provided that there is no need to code EXEC CICS commands in the exit. This will be the case at most CICS sites.
If it is necessary to code EXEC CICS commands, base your exit on the sample in source member USRXCICS. In all cases, compile the exit as a stand-alone load or object module as documented within the sample source member. The exit must have an ENTRY or CSECT name of USRIDXIT. Then link the exit with the appropriate system module as documented under
Link edit with
.
It may be desirable to have a different exit for TSO access and for batch access. In that case, make sure that a different copy of IDMSUXIT is used in each environment and that an appropriate version of the exit (or no exit) is linked with each copy.
Return codes
None.
WAITEXIT
Entry point
WAITEXIT
This exit is called whenever DC/UCF is about to issue an operating system WAIT, indicating that no DC/UCF tasks are ready to execute.
Sample uses
WAITEXIT can be used to monitor the activity of the DC/UCF system.
Considerations
The exit routine can use registers 0 through 5 only. Note that no save area is passed in register 13.
Call this exit by using the following instruction:
BALR R14,R15
Parameters
One parameter is passed: the operating system event control block (ECB) list.
Return codes
None.
WTOEXIT
Entry point
WTOEXIT
Linking WTOEXIT
WTOEXIT can be linked as follows:
  • With IDMSUXIT
  • As a stand-alone load module and specify its name on the runtime options in the startup JCL.
  • On z/VSE: link WTOEXIT as a standalone phase in a library that is searched at CV startup. Name the phase WTOEXIT so that the phase is recognized by the CV.
WTOEXIT is called each time a message is routed to the console. Control is passed to the entry point
before
the message is written to the console. By using this user exit, it is possible to:
  • Review, alter, redirect, and suppress the text of messages written to the operator's console.
  • (Under z/OS) Review, alter, redirect, and suppress the WTO DESC and ROUTCDE values of all messages written to the operator's console.
Sample uses
WTOEXIT can be called to perform the following activities:
  • Automatically offload the disk journal file when it becomes full. To do this, WTOEXIT:
    1. Evaluates messages, looking for messages indicating that the disk journal file is full
    2. Passes control to a subroutine that invokes ARCHIVE JOURNAL
    3. Receives control back from the subroutine
    4. Returns control to the system
    Sample WTOEXIT routines that perform this processing are shown later in this discussion for z/OS and z/VSE operating systems.
  • Perform site-specific functions in response to particular DC/UCF messages.
    Note that altered system messages are not, under any circumstances, written to the DC/UCF log file. System messages are written to the log as they are originally issued.
For more information about using an OPS/MVS API rule as a replacement for the WTOEXIT, see "Sample OPS/MVS API rule." This can lead to improved performance when using the CA IDMS zIIP feature.
Parameters
When the WTOEXIT entry point is called, register 1 contains the address of the WTO message control block. The layout of this control block depends on the operating system in use. For, z/OS, z/VSE, and z/VM the following table shows the layout of this control block:
Field
Field description
Message length (halfword initialized to 130 by the startup module)
The length, in bytes, of the message to the console.
(halfword)
z/OS and z/VSE only
System-reserved area.
Message text (132-byte alphanumeric field)
The text of the message to the console.
Do not adjust the message-length field in the WTO control block, even if the text length changes when the text is altered. When the return code is set to zero, DC/UCF adjusts the field by ignoring trailing blanks.
WTO DESC (halfword)
z/OS and z/VSE only
The value of the WTO descriptor code that would be in effect if the standard z/OS or z/VSE WTO macro were invoked.
WTO ROUTCDE (halfword)
z/OS and z/VSE only
The value of the WTO route code that would be in effect if the standard z/OS or z/VSE WTO macro were invoked.
Considerations
To call WTOEXIT in local mode, link edit WTOEXIT with IDMSUXIT. Calling conventions for local mode are the same as for central version.
Return codes
Before returning to the calling module, WTOEXIT places a return code of 0 or 4 in register 15:
  • 0 -- The message text (altered or unchanged) is to be written to the console.
  • 4 -- The message text is not to be written to the console.
WTOEXIT Examples
Sample Assembler WTOEXIT user exit routines appear below for z/OS and z/VSE operating systems. The corresponding source can be found in the installed source library. For a sample z/VM WTOEXIT routine, see the Installing section -- z/VM.
In each of these routines, WTOEXIT tests each DC/UCF message to see if it requests the ARCHIVE JOURNAL utility statement:
  • If the message
    does
    request ARCHIVE JOURNAL, the exit routine:
    1. Invokes the ARCHIVE JOURNAL utility statement
    2. Sets register 15 to 4, indicating that the DC/UCF message is not to be written to the console
  • If the message
    does not
    request ARCHIVE JOURNAL, the exit routine sets register 15 to 0, routing the message to the console.
z/OS sample WTOEXIT user exit
*PROCESS OVERRIDE(NORENT) WTO TITLE 'CA IDMS WTO EXIT FOR PLOG, PTRC AND AJNL' * * NOTE: THIS ROUTINE IS NOT REENTRANT. HOWEVER, THE ONLY MESSAGES * WE'RE DOING SOMETHING WITH ARE ALWAYS OUTPUT BY RHDCWTL, WHICH * IS HOLDING AN MPMODE LOCK (DC AT THE TIME OF THIS WRITING). * THEREFORE, NO PROBLEMS WILL EXIST. * THIS ROUTINE MUST BE MADE REENTRANT IF ANY MESSAGES OTHER THAN * THOSE GENERATED THROUGH #WTL ARE TO BE PROCESSED. * WTOEXIT CSECT WRITE TO OPERATOR EXIT PRINT NOGEN 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 STM R14,R12,12(R13) SAVE REGISTERS LR R3,R15 R3 IS PROGRAM BASE USING WTOEXIT,R3 LR R4,R1 R4 IS MESSAGE CONTROL BLOCK USING WTOMCB,R4 BASE LA R15,RUNAJNL CLC WTOMTEXT(13),=C'IDMS DC205003' IF JOURNAL MESSAGE BE SAVEREGS LA R15,TSTFULL CLC WTOMTEXT(13),=C'IDMS DC050001' IF LOG MESSAGE BE SAVEREGS LA R15,RUNPLOG RUNPLOG IF FULL CLC WTOMTEXT(13),=C'IDMS DC050004' LOG FULL? BE SAVEREGS CLC WTOMTEXT(13),=C'IDMS DC286003' FORCED OFFLOAD? BE SAVEREGS LA R15,TRCTEST CLC WTOMTEXT(13),=C'IDMS DC050024' IF TRC MESSAGE BE SAVEREGS LA R15,TRCRUN RUNPTRC IF FULL CLC WTOMTEXT(13),=C'IDMS DC050027' TRC FULL? BE SAVEREGS B RETURNLM * SAVEREGS DS 0H ST R13,SAVEAREA+4 AND SET BACKWARD LA R12,SAVEAREA AND FOREWARD CHAINS ST R12,8(R13) LR R13,R12 BR R15 OFF TO THE REQUESTED ROUTINE * RUNAJNL LA R0,0 L R15,=A(SETAMODE) BALR R14,R15 OPEN (JESRDR,(OUTPUT)) OPEN (AJNLJOB,(INPUT)) NEXTCARD GET AJNLJOB,CARD PUT JESRDR,CARD B NEXTCARD CLOSES CLOSE (JESRDR) CLOSE (AJNLJOB) LA R0,1 L R15,=A(SETAMODE) BALR R14,R15 B RETURN * TSTFULL LA R6,WTOMTEXT LH R5,WTOMLEN AR R6,R5 LA R5,WTOMTEXT+10 NEXCHAR LA R5,1(R5) CR R5,R6 BH RETURN CLI 0(R5),C'%' BNE NEXCHAR S R5,=F'2' PACK PNUM,0(2,R5) CP PNUM,=P'25' BNL RUNPLOG B RETURN RUNPLOG LA R0,0 L R15,=A(SETAMODE) BALR R14,R15 OPEN (JESRDR,(OUTPUT)) OPEN (PLOGJOB,(INPUT)) NEXTONE GET PLOGJOB,CARD PUT JESRDR,CARD B NEXTONE CLOSE2 CLOSE (JESRDR) CLOSE (PLOGJOB) LA R0,1 L R15,=A(SETAMODE) BALR R14,R15 * * TRCTEST LA R6,WTOMTEXT LH R5,WTOMLEN AR R6,R5 LA R5,WTOMTEXT+10 TRCNXCH LA R5,1(R5) CR R5,R6 BH RETURN CLI 0(R5),C'%' BNE TRCNXCH S R5,=F'2' PACK PNUM,0(2,R5) CP PNUM,=P'25' BNL TRCRUN B RETURN TRCRUN LA R0,0 L R15,=A(SETAMODE) BALR R14,R15 OPEN (JESRDR,(OUTPUT)) OPEN (PTRCJOB,(INPUT)) TRCNEXT GET PTRCJOB,CARD PUT JESRDR,CARD B TRCNEXT TRCCLOS CLOSE (JESRDR) CLOSE (PTRCJOB) LA R0,1 L R15,=A(SETAMODE) BALR R14,R15 * RETURN L R13,SAVEAREA+4 RESTORE OLD SAVE AREA RETURNLM LM R14,R12,12(R13) AND REGISTERS XR R15,R15 R15 TO ZERO FOR RETURN CODE BR R14 * SETAMODE DS 0H LA R14,0(,R14) SLL R0,31 OR R14,R0 BSM R15,R14 * SAVEAREA DC 18F'0' PNUM DS PL2 CARD DS CL80 JESRDR DCB BLKSIZE=80,LRECL=80,RECFM=F,DDNAME=JESRDR,DSORG=PS, X MACRF=PM AJNLJOB DCB DDNAME=AJNLJOB,DSORG=PS,MACRF=GM,EODAD=CLOSES PLOGJOB DCB DDNAME=PLOGJOB,DSORG=PS,MACRF=GM,EODAD=CLOSE2 PTRCJOB DCB DDNAME=PTRCJOB,DSORG=PS,MACRF=GM,EODAD=TRCCLOS LTORG WTOMCB DSECT WTO MESSAGE CONTROL BLOCK WTOMLEN DS H MESSAGE LENGTH WTOMFLGS DS H MESSAGE CONTROL SYSTEM FLAGS WTOMTEXT DS CL132 MESSAGE TEXT WTOMDESC DS H MESSAGE DESCRIPTOR CODE WTOMROUT DS H MESSAGE ROUTE CODE END
z/VSE sample WTOEXIT user exit
TITLE 'WTO EXIT FOR DOS ' 00001000 WTOEXIT CSECT 00002000 * ******************************************************************** 00003000 * R2 - XPCCB 00004000 * R3 - WTOEXIT BASE REGISTER 00005000 * R4 - WTO MESSAGE CTL BLOCK 00006000 * R5 & R6 - WORK REGS 00007000 * R7 - SPLWTO - POWER SPOOL 00008000 * R8 & R9 - WORK REGS 00009000 * R10- DATA TO BE SENT TO POWER VIA SPL 00010000 * R11- DATA TO BE RCVD FROM POWER VIA SPL 00011000 * ******************************************************************** 00012000 * #REGEQU 00013000 R0 EQU 0 00014000 R1 EQU 1 00015000 R2 EQU 2 00016000 R3 EQU 3 00017000 R4 EQU 4 00018000 R5 EQU 5 00019000 R6 EQU 6 00020000 R7 EQU 7 00021000 R8 EQU 8 00022000 R9 EQU 9 00023000 R10 EQU 10 00024000 R11 EQU 11 00025000 R12 EQU 12 00026000 R13 EQU 13 00027000 R14 EQU 14 00028000 R15 EQU 15 00029000 WTOEXIT CSECT 00030000 ENTRY WTOEXIT 00031000 USING WTOEXIT,R15 ESTABLISH ADDRESSABILITY 00032000 STM R14,R12,12(R13) SAVE REGISTERS 00033000 ST R13,SAVEAREA+4 AND SET BACKWARD 00034000 LA R12,SAVEAREA AND FORWARD CHAINS 00035000 ST R12,8(R13) 00036000 LR R13,R12 00037000 LR R3,R15 R3 IS PROGRAM BASE 00038000 DROP R15 00039000 USING WTOEXIT,R3 00040000 LR R4,R1 R4 IS MESSAGE CONTROL BLOCK 00041000 USING WTOMCB,R4 BASE 00042000 MVI SPLIND,X'00' INITIALIZE SWITCH 00043000 CK205003 CLC WTOMTEXT(13),=C'IDMS DC205003' IF JOURNAL MESSAGE 00044000 BNE CK50001 NOT JNL -- CHECK LOG 00045000 LA R9,AJNLJOB 00046000 LA R5,AJNLLEN 00047000 MVC JOBNA,JNAME 00048000 B CONNECT 00049000 CK50001 CLC WTOMTEXT(13),=C'IDMS DC050001' IF LOG MESSAGE 00050000 BNE RETURN 00051000 TSTFULL LA R6,WTOMTEXT 00052000 LH R5,WTOMLEN 00053000 AR R6,R5 00054000 LA R5,WTOMTEXT+10 00055000 NEXCHAR LA R5,1(R5) 00056000 CR R5,R6 00057000 BH RETURN 00058000 CLI 0(R5),C'%' 00059000 BNE NEXCHAR 00060000 S R5,=F'2' 00061000 PACK PNUM,0(2,R5) 00062000 CP PNUM,=P'25' 00063000 BL RETURN 00064000 RUNPLOG DS 0H 00065000 LA R9,PLOGJOB 00066000 LA R5,PLOGLEN 00067000 MVC JOBNA,PNAME 00068000 OI SPLIND,X'40' SET LOOK FOR PLOG IND 00069000 * ********************************************************* 00070000 * * 00071000 * ISSUE IDENTIFY & CONNECT TO POWER * 00072000 * * 00073000 * ********************************************************* 00074000 CONNECT DS 0H 00075000 LA R7,SPLWTO 00076000 USING SPLWTODS,R7 POINT TO PWRSPL 00077000 LA R2,WTOXPCCB 00078000 USING IJBXPCCB,R2 POINT TO XPCCB 00079000 LA R10,IJBXSUSR POINT TO DATA TO BE SENT 00080000 USING PXUUSER,R10 00081000 LA R11,IJBXRUSR POINT TO DATA TO BE RCVD 00082000 USING PXPUSER,R11 00083000 XPCC FUNC=IDENT,XPCCB=WTOXPCCB 00084000 CLM R15,1,X'08' ERROR- R15 LT 8 SAYS OK 00085000 BO SPOOLERR RC OF 8 SAYS NO GOOD ON ID 00086000 XPCC FUNC=CONNECT,XPCCB=WTOXPCCB 00087000 LTR R15,R15 CONNECT AVAILABLE? 00088000 BZ CONNOK YET- DON'T HAVE TO WAIT 00089000 CLM R15,1,X'08' ERROR- R15 = 8 SAYS NO GOOD 00090000 BNL SPOOLERR R15 = 4 SAYS WAIT FOR POWER TO POST 00091000 SR R6,R6 00092000 BUSY DS 0H 00093000 SETIME 5,TECB POST ECB 00094000 WAIT TECB WAIT 5 SECONDS 00095000 TM IJBXCECB+2,X'80' CONN MADE?? 00096000 BO CONNOK 00097000 LA R6,1(R6) 00098000 CH R6,=H'5' WAIT 5 SECONDS 5 TIMES 00099000 BL BUSY WAIT 5 MORE 00100000 B TERM NO CONNECT - GO TERMINATE 00101000 CONNOK DS 0H 00102000 OI SPLIND,X'80' SET GOOD CONNECT SWITCH 00103000 TM SPLIND,X'40' LOOK FOR PLOG IN QUEUE? 00104000 BZ SUBMIT 00105000 * ********************************************************* 00106000 * * 00107000 * CHECK FOR PLOG JOB ALREADY IN RDR QUEUE * 00108000 * IF ONE EXISTS, DON'T SUBMIT ANOTHER * 00109000 * * 00110000 * ********************************************************* 00111000 LOK4PLOG DS 0H 00112000 PWRSPL TYPE=UPD,FUNC=DISPLAY,JOBN=PNAME,QUEUE=RDR,REQ=CTL, X00113000 SPL=SPLWTO 00114000 MVI PXUBTYP,PXUBTSPL CHECK FRO PLOG JOB IN RDR 00115000 MVI PXUACT1,0 00116000 STCM R7,7,IJBXADR 00117000 LA R15,SPLGSLEN 00118000 ST R15,IJBXBLN 00119000 XPCC XPCCB=WTOXPCCB,FUNC=SENDR 00120000 LTR R15,R15 ZERO RC? 00121000 BNZ SPOOLERR NO 00122000 LA R6,IJBXSECB 00123000 WAIT (R6) WAIT FOR COMPLETION OF SENDR 00124000 CLI IJBXREAS,0 ANY ERRORS? 00125000 BNE SPOOLERR 00126000 CLI PXPRETCD,0 RC OF 0 SAYS PLOGJOB ALREADY IN RDR 00127000 BE DISC 00128000 CLI PXPRETCD,X'04' NO PLOG JOBS FOUND? 00129000 BNE SPOOLERR 00130000 CLI PXPFBKCD,X'0B' NO PLOG JOBS FOUND? 00131000 BNE SPOOLERR 00132000 * ********************************************************* 00133000 * * 00134000 * ISSUE OPEN TO POWER USING SPL * 00135000 * * 00136000 * ********************************************************* 00137000 SUBMIT PWRSPL TYPE=UPD,SPL=SPLWTO,REQ=PUT,QUEUE=RDR 00138000 MVI PXUBTYP,PXUBTSPL 00139000 MVI PXUACT1,0 00140000 MVI PXUSIGNL,0 USE SPL FOR PUT OPEN REQUEST 00141000 STCM R7,7,IJBXADR 00142000 LA R15,SPLGLEN 00143000 ST R15,IJBXBLN 00144000 OI IJBXIND,IJBXM80 SET LIST TYPE 00145000 XPCC XPCCB=WTOXPCCB,FUNC=SENDR 00146000 LTR R15,R15 ZERO RC? 00147000 BNZ SPOOLERR NO 00148000 LA R6,IJBXSECB 00149000 WAIT (R6) WAIT FOR COMPLETION OF SENDR 00150000 CLI IJBXREAS,0 ANY ERRORS? 00151000 BNE SPOOLERR 00152000 CLI PXPRETCD,0 RC OK? 00153000 BNE SPOOLERR 00154000 * ********************************************************* 00155000 * * 00156000 * MOVE JOB TO POWER RDR QUEUE * 00157000 * * 00158000 * ******************************************************** 00159000 SETADDR DS 0H 00160000 STCM R9,7,IJBXADR 00161000 OI IJBXIND,IJBXM80 SPECIFY PROPER BUFFER TYPE 00162000 ST R5,IJBXBLN STORE LENGTH 00163000 MVI PXUBTYP,PXUBTNDB MOVE BUFF TYPE DATA 00164000 MVI PXUACT1,PXUATEOD SET EOD INDICATOR 00165000 MVC SPLGJB,JOBNA MOVE JOBNAME 00166000 XPCC XPCCB=WTOXPCCB,FUNC=SENDR 00167000 LTR R15,R15 00168000 BNZ SPOOLERR 00169000 LA R6,IJBXSECB 00170000 WAIT (R6) WAIT FOR COMPLETION OF SENDR 00171000 CLI IJBXREAS,0 ANY ERRORS? 00172000 BNE SPOOLERR 00173000 CLI PXPRETCD,0 RC OK? 00174000 BNE SPOOLERR 00175000 CLI PXPFBKCD,0 FEEDBACK OK? 00176000 BNE SPOOLERR 00177000 B DISC YES -- GET OUT 00178000 SPOOLERR DS 0H ADD ANY ERROR HANDLING HERE 00179000 PDUMP SPLWTO,BUFEND 00180000 TM SPLIND,X'80' WAS CONNECT DONE ? 00181000 BNO RETURN 00182000 * ********************************************************* 00183000 * * 00184000 * GO ISSUE DISC & TERMINATE TO POWER * 00185000 * * 00186000 * ********************************************************* 00187000 DISC DS 0H 00188000 XPCC XPCCB=WTOXPCCB,FUNC=DISCONN GO DISCONNECT 00189000 LTR R15,R15 ERROR ON DISC???? 00190000 BNZ RETURN YES -- JUST RETURN 00191000 TERM DS 0H 00192000 XPCC XPCCB=WTOXPCCB,FUNC=TERMIN SAY GOODBYE 00193000 RETURN DS 0H RESTORE OLD SAVE AREA 00194000 L R13,SAVEAREA+4 RESTORE OLD SAVE AREA 00195000 LM R14,R12,12(R13) AND REGISTERS 00196000 XR R15,R15 R15 TO ZERO FOR RETURN CODE 00197000 BR R14 00198000 PNAME DC CL8'PLOGJOB ' 00199000 JNAME DC CL8'AJNLJOB ' 00200000 JOBNA DC CL8' ' 00201000 SAVEAREA DC 18F'0' 00202000 * ORECBA DS A 00203000 * ORREPA DS A 00204000 PNUM DS PL2 00205000 TECB TECB 00206000 AJNLJOB DC A(80,0),CL80'* $$ JOB JNM=AJNLJOB,CLASS=A,PRI=9,DISP=D,U*00207000 SER=CULLDBA' 00208000 DC A(80,0),CL80'* $$ LST CLASS=Z' 00209000 DC A(80,0),CL80'// JOB AJNLJOB S851CC07S00' 00210000 DC A(80,0),CL80'// EXEC PROC=DBDCLIB' LIBDEFS 00211000 DC A(80,0),CL80'// EXEC PROC=DBDCAJNL' AJNL DLBL+EXEC 00212000 DC A(80,0),CL80'/&.&'. 00213000 DC A(80,0),CL80'* $$ EOJ' 00214000 AJNLLEN EQU *-AJNLJOB 00215000 PLOGJOB DC A(80,0),CL80'* $$ JOB JNM=PLOGJOB,CLASS=A,PRI=9,DISP=D,U*00216000 ,USER=CULLDBA' 00217000 DC A(80,0),CL80'* $$ LST CLASS=Z' 00218000 DC A(80,0),CL80'// JOB PLOGJOB S851CC07S00' 00219000 DC A(80,0),CL80'// EXEC PROC=DBDCLIB' LIBDEFS 00220000 DC A(80,0),CL80'// EXEC PROC=DBDCPLOG' PLOG DLBL+EXEC 00221000 DC A(80,0),CL80'/&.&'. 00222000 DC A(80,0),CL80'* $$ EOJ' 00223000 PLOGLEN EQU *-PLOGJOB 00224000 SPLIND DC XL1'00' '80' MEANS CONNECT DONE '40' LOOK4PLOG 00225000 SPLWTO PWRSPL TYPE=GEN,JOBN=JOBNA,PRFX=WTO,QUEUE=RDR,REQ=PUT, X00226000 USERID=CULLDBA,OPT=NOWAIT 00227000 WTOXPCCB XPCCB APPL=WOTEXIT,TOAPPL=SYSPWR, X00228000 REPAREA=(WTOBUF,200) 00229000 WTOBUF DC CL200' ' 00230000 BUFEND EQU * 00231000 WTOMCB DSECT WTO MESSAGE CONTROL BLOCK 00232000 WTOMLEN DS H MESSAGE LENGTH 00233000 WTOMFLGS DS H MESSAGE CONTROL SYSTEM FLAGS 00234000 WTOMTEXT DS CL132 MESSAGE TEXT 00235000 WTOMDESC DS H MESSAGE DESCRIPTOR CODE 00236000 WTOMROUT DS H MESSAGE ROUTE CODE 00237000 MAPXPCCB 00238000 SPLWTODS PWRSPL TYPE=MAP 00239000 END WTOEXIT 00240000
WTOREXIT
Entry point
WTOREXIT
Link edit with:
  • IDMSUXIT
  • As a stand-alone load module and specify its name on the runtime options in the startup JCL.
  • On z/VSE: link WTOREXIT as a standalone phase in a library that is searched at CV startup. Name the phase WTOREXIT so that the phase is recognized by the CV.
The DC/UCF startup module calls this user exit each time the system is ready to solicit an operator command.
To notify DC/UCF that an operator command is present, WTOREXIT:
  1. Places the length and text of the command in the WTOR reply area. This is true for commands either issued by an operator or generated by the exit routine.
  2. Posts a reply event control block (ECB) to notify the DC/UCF that an operator command is present:
    • z/OS and z/VM -- By performing an operating-system POST to set the reply ECB completion code to 240
    • z/VSE -- By performing an operating system POST
    Posting of the reply ECB causes DC/UCF to process the operator command placed in the WTOR reply area.
    After processing the command, DC/UCF clears the reply ECB and the WTOR reply area. DC/UCF is again ready to solicit an operator command, which in turn prompts another call to the WTOREXIT entry point.
Sample uses
The WTOREXIT user exit routine can be used to:
  • Review and optionally alter commands
    before
    they reach the DC/UCF system.
  • Solicit operator commands from the console.
  • Generate site-specific operator commands.
  • Disallow operator commands. To accomplish this, see parameter descriptions below.
Having WTOREXIT generate commands is especially useful when direct operator-to-system communication is
not
allowed. Even when direct operator-to-system communication is allowed, the WTOREXIT routine can solicit operator commands from the console and/or generate its own operator commands and pass them to DC/UCF.
  • z/VSE Systems
    The WTOREXIT can be used to intercept and reply to immediate WTOR requests. It can reply to a general operator prompt, but cannot suppress the outstanding operator prompt. It cannot intercept or suppress the OC EXIT.
    Considerations:
    For details on how DC/UCF allows operators to enter console commands when WTOREXIT is
    not
    linked, see the
    System Tasks and Operator Reference section
    .
Parameters
When the WTOREXIT entry point is called:
  • Register 0 contains the address of a reply event control block (ECB).
  • Register 1 contains the address of the WTOR reply area to which operator commands are written. The following table shows the layout of the WTOR reply area:
Field
Field description
Reply length (halfword)
The length, in bytes, of the reply.
Reply text (alphanumeric, varying length)
The text of the reply message.
The WTOREXIT routine can save the addresses of the reply ECB and the WTOR reply area for future use.
Return codes
WTOREXIT returns either 0 or 4 in register 15.
  • 0 -- Suppress issuing of WTOR command:
    • z/OS and z/VM -- Disallows direct operator-to system communication by suppressing the DC/UCF console outstanding-response message.
    • z/VSE -- Allows the exit to reply to a WTOR request instead of prompting the operator console.
    Typically, WTOREXIT sets register 15 to 0 when the exit routine solicits its own operator commands and passes them to the DC/UCF system.
  • 4 -- Allows direct operator-to-system communication:
    • z/OS and z/VM -- By directing the DC/UCF outstanding-response message to the console
    • z/VSE -- By allowing an immediate WTOR command to be issued.
    If the WTOREXIT user exit routine sets register 15 to 4, the routine cannot review or alter the text of future operator commands before the commands reach the DC/UCF system. This is because the exit is never called again.
WTOREXIT Examples
A sample WTOREXIT user exit for a z/OS system appears below. This exit routine:
  1. Suppresses the DC/UCF outstanding-response message
  2. Solicits operator commands from the console
  3. Passes to DC/UCF the resultant operator commands
This WTOREXIT user exit could include additional code to alter the text of acquired operator commands before passing the commands to the ECB.
z/OS sample WTOREXIT user exit
************************************************************************* * SAMPLE WTOREXIT * ************************************************************************* * * * This routine is intended to serve as a sample WTOREXIT routine only. * * It disables the standard CV WTOR routine and replaces it with a * * different WTOR. * * * * In order to be asynchronous with the main CV task, this routine * * attaches an OS subtask that waits for operator responses. * * * * Note the following: * * * * 1. Typically, the responses from the operator would be screened * * or otherwise processed by WTOREXIT before being passed to * * the CV. In this example, operator responses are passed to the * * CV without being reviewed or processed by the WTOREXIT user exit. * * * * * ************************************************************************* WTORCSCT CSECT DC CL8'WTORSAMP' * #REGEQU EJECT WTORCSCT CSECT ENTRY WTOREXIT WTOREXIT STM R14,R12,12(R13) LR R12,R15 Establish addressability USING WTOREXIT,R12 STM R0,R1,SAVEPARM Save input parameters LTR R0,R0 Is this an immediate WTOR? BZ WTOR200 Yes; do not suppress * * The above test for R0=0 is only relevant to IDMS-DC systems, and * applies to special WTORs that prompt for startup parameter * overrides. In that case, DC should be allowed to issue the WTOR, * so that register 15 will be set to 4. * WTOR100 L R1,WTORECBA Clear ECB and XC 0(4,R1),0(R1) then WTOR101 LM R14,R12,12(R13) return SR R15,R15 Do not perform standard WTOR BR R14 SPACE 3 WTOR200 LM R14,R12,12(R13 Return and allow the LA R15,4 WTOR to be issued by CV/DC BR R14 DROP R12 EJECT ATTNXIT STM R14,R12,12(R13) Save registers LR R12,R15 Establish addressability USING ATTNXIT,R12 ATTNXIT1 WTOR 'SPECIAL PROMPT',WTORREP,WTORMSGL,WTORECB WAIT ECB=WTORECB Wait for reply XC WTORECB,WTORECB Clear reply ECB L R5,WTORECBA If ECB is still posted, TM 0(R5),X'40' then prior message not yet BO ATTNXNO processed L R4,WTORREPA Point to reply area LH R3,0(,R4) Get length LA R5,WTORMSGL Get input length CR R3,R5 Do not exceed buffer length BNL *+6 LR R5,R3 SH R5,=H'1' Subtract 1 for MVC BM *+8 but do not do it if length=0 EX R5,MVCREPLY Move reply string AH R5,=H'1' Fix length STH R5,0(,R4) Give to user L R1,WTORECBA Post user POST (1),240 B ATTNXIT1 ATTNXRTN LM R14,R12,12(R13) BR R14 ATTNXNO WTO 'LAST MESSAGE NOT YET PROCESSED' B ATTNXIT1 * MVCREPLY MVC 2(*-*,R4),WTORREP DROP R12 EJECT *********************************************************************** * * * NONREENTRANT AREAS * * * *********************************************************************** WTORREP DC CL100' ' WTOR REPLY AREA. WTORMSGL EQU 100 MAX LENGTH FOR WTOR REPLY. WTORECB DC F'0' POSTED WHEN WTOR IS DONE. SAVEPARM DS 0F START OF 2 WORDS TO SAVE R0, R1. WTORECBA DS A SAVE ECB ADDRESS FOR WTOR. WTORREPA DS A SAVE REPLY STRING ADDRESS FOR WTOR. ATCHDONE DC X'00' FLAG SET ONCE INITIALIZED. END ***********************************************************************