Skip to content

Instantly share code, notes, and snippets.

@mainframed
Created February 1, 2023 05:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mainframed/63966886037bc5157efad83031d83c3a to your computer and use it in GitHub Desktop.
Save mainframed/63966886037bc5157efad83031d83c3a to your computer and use it in GitHub Desktop.
NJE38 TRANSMIT & RECIEVE
//NJE38 JOB (TSO),
// 'Install NJE38',
// CLASS=A,
// MSGCLASS=H,
// MSGLEVEL=(1,1),
// USER=IBMUSER,
// PASSWORD=SYS1
/*JOBPARM LINES=1000
//*
//* This JCL does 4 things:
//* 1) Creates SYSGEN.NJE38.MACLIB and adds the NJE38 maclibs to it
//* 2) Creates SYSGEN.NJE38.ASMSRC and adds the needed source files
//* 3) Assembles the required and adds them to SYS2.CMDLIB
//* 4) Updates and adds TRANSMIT/RECEIVE to SYS1.UMODSRC(IKJEFTE2)
//* 5) Installs the IKJEFTE2 changes with SMP
//*
//* ********
//* **
//* ** You must Re-IPL with CLPA or you will get a TSO error
//* **
//* ** This JCL is for MVS/CE ONLY
//* **
//* ********
//*
//* Type HELP TRANSMIT or HELP RECEIVE for information how to use
//* these commands.
//*
//* *******************************************************************
//*
//* Installs SYSGEN.NJE38.MACLIB
//*
//NJE38MAC EXEC PGM=PDSLOAD
//STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD DSN=SYSGEN.NJE38.MACLIB,DISP=(NEW,CATLG),
// VOL=SER=PUB001,
// UNIT=3390,SPACE=(CYL,(1,1,5)),
// DCB=(BLKSIZE=3120,RECFM=FB,LRECL=80)
//SYSUT1 DD DATA,DLM=@@
./ ADD NAME=AUTHLIST
AUTHLIST DSECT
AUTHPTR DS A -> next AUTHLIST entry or 0
DS A Reserved
AUTHUSER DS CL8 Authorized userid
AUTHNODE DS CL8 Authorized node of above userid
AUTHSIZE EQU *-AUTHLIST Length of an authlist entry
./ ADD NAME=LINKTABL
LINKTABL DSECT
*
*** LINKTABL - LINK TABLE ENTRY
*
* 0 +-----------------------------------------------+
* | LINKID |
* 8 +-----------------------+-----------------------+
* | LDEFTNME | LACTTNME |
* 10 +-----------------------+-----------------------+
* | LDEFDRVR |
* 18 +-----------------------------------------------+
* | LACTDRVR |
* 20 +-----------+-----------+-----------------------+
* | LDEFLINE | LACTLINE | LDRVRVAR |
* 28 +-----+-----+-----+-----+-----+-----+-----+-----+
* | L*1 | L*2 | L*3 | L*4 | L*5 | L*6 | L*7 | L*8 |
* 30 +-----+-----+-----+-----+-----+-----+-----+-----+
* | L*9 |LFLAG| LBUFF | LPENDING | LTAKEN |
* 38 +-----+-----+-----------+-----------+-----------+
* | LPOINTER | LMSGQ |
* 40 +-----------+-----------+-----------+-----------+
* | LTRNSCNT | LERRCNT | LTOCNT |
* 48 +-----------+-----------+-----------+-----------+
* | LNKCLOCK |
* 50 +-----------------------------------------------+
*
*
*** LINKTABL - LINK TABLE ENTRY
*
LINKID DS CL8 EBCDIC LINK ID
LDEFTNME DS CL4 DEFAULT TASK NAME
LACTTNME DS CL4 ACTIVE TASK NAME
LDEFUSER DS 0CL8 DEFAULT USERID IF NO SECURITY v130
LDEFDRVR DS CL8 DEFAULT DRIVER ID
LACTDRVR DS CL8 ACTIVE DRIVER ID
LDEFLINE DS XL2 DEFAULT VIRTUAL LINE ADDRESS *XJE
LACTLINE DS XL2 ACTIVE VIRTUAL LINE ADDRESS *XJE
LDRVRVAR DS 1F LINE DRIVER VARIABLE INFO
LDEFCLS1 DS CL1 L*1 DEFAULT SPOOL FILE CLS 1
LDEFCLS2 DS CL1 L*2 DEFAULT SPOOL FILE CLS 2
LDEFCLS3 DS CL1 L*3 DEFAULT SPOOL FILE CLS 3
LDEFCLS4 DS CL1 L*4 DEFAULT SPOOL FILE CLS 4
LACTCLS1 DS CL1 L*5 ACTIVE SPOOL FILE CLS 1
LACTCLS2 DS CL1 L*6 ACTIVE SPOOL FILE CLS 2
LACTCLS3 DS CL1 L*7 ACTIVE SPOOL FILE CLS 3
LACTCLS4 DS CL1 L*8 ACTIVE SPOOL FILE CLS 4
LTIMEZON DS 1X L*9 2 COMP TIME ZONE DISP FROM GMT
LFLAG DS 1X LINK FLAG BYTE
LACTIVE EQU X'80' LINK ACTIVE
*LALERT EQU X'40' ************AXS ALERT EXIT SET-not used in XJE
LAUTO EQU X'40' LINK TO BE AUTOSTARTED *XJE
LHOLD EQU X'20' LINK HOLD SET
LDRAIN EQU X'10' LINK DRAIN IN PROGRESS
LTRALL EQU X'08' LINK TRANSACTION TRACING (ALL)
LTRERR EQU X'04' LINK TRANSACTION TRACING (ERROR)
LCONNECT EQU X'02' Link successfully signed onHRC031DT
LHALT EQU X'01' LINK TO BE FORCED INACTIVE
LBUFF DS 1H Max buffer size for line *XJE
LNEGO DS 1H Negotiated actual buffer size *XJE
LTAKEN DS 1H COUNT OF TAG SLOTS IN USE
LPOINTER DS 1F LINK QUEUE ADDR
LMSGQ DS 1F MSG QUEUE POINTER
LTRNSCNT DS 1H LINK TRANSACTION COUNT
LERRCNT DS 1H ERROR COUNT
LTOCNT DS 1H TIMEOUT COUNT
LSPARE DS 1H SPARE HALF WORD
LNKCLOCK DS 8X CLOCK COMP VALUE FOR THIS LINK @VA03349
*
*- New fields for NJE/MVS use; below *XJE
*
LNEXT DS A -> next LINKTABL entry or 0
LTCBA DS A -> TCB for this link
LTRMECB DS F Link subtask termination ECB
LECB DS F ECB for main task notific'n to link
LNJEW DS A -> local work area for this link
DS F Available
LWRESWAP DS 0D CDS swap doubleword
LWREQIN DS A Incoming WREs Q chain anchor
LWREQCT DS F Incoming synchronization count
LINKLEN EQU *-LINKTABL LENGTH OF LINK TABLE ENTRY
SPACE
./ ADD NAME=MSGX
MACRO
&LABEL MSGX &NUM,&VAR
.* REENTERABLE FORM OF MSG MACRO
LCLA &TOFF,&TVARS
LCLC &COFF
&LABEL MVC MSGXNUM,=AL2(&NUM)
AIF (N'&SYSLIST(2) EQ 0).NOVAR
&TOFF SETA N'&SYSLIST(2)
&COFF SETC '&TOFF'
.NOVAR ANOP
AIF (N'&SYSLIST(2) EQ 0).NOVAR1
&TOFF SETA 0
&TVARS SETA 1
.MLOP ANOP
&COFF SETC '&TOFF'
MVC MSGXVAL+&COFF.(8),&SYSLIST(2,&TVARS)
&TOFF SETA &TOFF+8
&TVARS SETA &TVARS+1
AIF (&TVARS LE N'&SYSLIST(2)).MLOP
.NOVAR1 ANOP
LA 1,MSGXNUM
LA 0,&TOFF+4
BAL 14,MSG
SPACE 1
MEND
./ ADD NAME=NETSPOOL
*
* Change log:
*
* 23 Jul 20 - Add NCBPCT to return spool file percentage v200
* 02 Jul 20 - Default userid to CSA in support of TRANSMIT/RECEOVE v200
* 21 May 20 - Add update directory entry funcation v120
* 04 May 20 - Show CONFIG assembly date and time on start up. v102
*
*
NCB DSECT NETSPOOL CONTROL BLOCK
NCBEYE DS CL4'NCB' NCB id
NCBTKN DS F Token identifier (caller unique)
NCBFL1 DS X Flag bits
NCBPRT EQU X'40' PRT type data
NCBPUN EQU X'80' PUN type data
NCBREQ DS X Request type
NCBOPEN EQU X'01' Open NETSPOOL dataset
NCBCLOSE EQU X'02' Close NETSPOOL dataset
NCBPUT EQU X'03' Write a logical record
NCBGET EQU X'04' Read a logical record
NCBPURGE EQU X'05' Delete a file
NCBLOC EQU X'06' Locate a file
NCBCON EQU X'07' Get directory contents
NCBUDIR EQU X'08' Update directory entry v120
NCBRTNCD DS X RC from VSAM macro (same as R15)
NCBERRCD DS X Error code from VSAM macro
NCBMACAD DS A Addr of failing VSAM macro
NCBTAG DS A Addr of associated TAG block
NCBEODAD DS A Addr of End of Data routine
NCBAREAL DS F Length of record area
NCBAREA DS A Addr of record area
NCBRECLN DS AL2 Length of record
NCBRECCT DS AL2 Record count
NCBPCT DS 0AL2 Spool percentage full (NCBCON) v200
NCBFID DS AL2 File id # (avail on new file CLOSE)
NCBRESV1 DS AL2 Available bytes
NCBRESV2 DS A Available bytes
DS 0D Force doubleword boundary
NCBSZ EQU *-NCB Size of NCB
*
*
NSDIR DSECT NETSPOOL directory entry
NSLEN DS AL2(NSDIRLN) Length of this record incl len
NSRESV1 DS AL2 Resv
NSBLK DS AL4 Block number of file's ptr block
NSINLOC DS CL8 Originating location
NSLINK DS CL8 Next location for transmission
NSINTOD DS CL8 Time of file origin
NSINVM DS CL8 Originating virtual machine
NSRECNM DS 1F Number of records in file
NSRECLN DS 1H Maximum file data record length
NSINDEV DS 1X Device code of originating dev
NSCLASS DS CL1 File output class
NSID DS 1H File number at origin location
NSCOPY DS 1H Number of copies requested
NSFLAG DS 1X VM/370 SFBLOK control flags
NSFLAG2 DS 1X VM/370 SFBLOK control flags
NSSPARE DS 1H Spare
NSNAME DS CL12 File name
NSTYPE DS CL12 File type
NSDIST DS CL8 File distribution code
NSTOLOC DS CL8 Destination location id
NSTOVM DS CL8 Destination virtual machine id
NSPRIOR DS 1H Transmission priority
NSDEV DS 2X Active file's virt dev addr
NSRESV2 DS AL4 Resv
NSDIRLN EQU *-NSDIR
*
NJ38CSA DSECT NJE38 CSA STORAGE BLOCK
NJ38NODE DS CL8 Node name of this NJE38
NJ38ASCB DS A ASCB address of NJE38 addr space
NJ38ECB DS F NJE38 ECB for cross memory post
NJ38SWAP DS 0D CDS swap doubleword
NJ38WRIN DS A Incoming WREs Q chain anchor
NJ38WRCT DS F Incoming synchronization count v200
NJ38DUSR DS CL8 Default 'no security' userid v200
NJ38CSAZ EQU *-NJ38CSA Size of CSA area
*
CMDBLOK DSECT Map cmd area used by DMTXJE
CMDBLEN DS AL1 CMDBLOK length
CMDBTYP DS AL1(0) Type 0 = CMDBLOK request
DS AL1
DS AL1
CMDLINK DS CL8 LINKID
CMDVMID DS CL8 VIRTUAL MACHINE ID
CMDTEXT DS CL120' ' text of command
CMDBLOKL EQU *-CMDBLOK Size of dsect
*
STACKMSG DSECT Stacked message format
STKOWN DS A RQE owner
STKNEXT DS A -> next STACKMSG or zero
STKLEN DS AL1 Stacked msg length
STKZERO DS AL1(0) Must be 0
STKNODE DS CL8 Node of receiver of this msg
STKID DS CL8 userid of receiver of this msg
STKMSG DS CL238 Area for msg text
STKSZ EQU *-STACKMSG Total size should be 264=RQESZ
*
*
*
RQE DSECT
RQEOWN DS A ->LINKTABL entry of owner (0=free)
RQEDATA DS XL260 TANK or MSG data as used by DMTXJE
RQESZ EQU *-RQE Size of RQE area
*
*
./ ADD NAME=NJE
*
* DSECTs defining NJE headers
*
* Prefix section common to all headers
*
NJEPDSEC DSECT NJE header prefix
NJEPLEN DS AL2 NJE header segment length
NJEPFLGS DS XL1 NJE header segment flags
NJEPSEQ DS XL1 NJE header segment sequence
NJEPSIZE EQU *-NJEPDSEC NJE header prefix size
*
* NJE job header general section
*
NJHGDSEC DSECT NJE job hdr general section
NJHGLEN DS AL2 NJE job gen. sect. length
NJHGTYPE DS XL1 NJE job gen. sect. type
NJHGMOD DS XL1 NJE job gen. sect. modifier
NJHGJID DS AL2 NJE job gen. sect. identif.
NJHGJCLS DS CL1 NJE job gen. sect. class
NJHGMCLS DS CL1 NJE job gen. sect. msg cls
NJHGFLG1 DS XL1 NJE job gen. sect. flags
NJHGPRIO DS XL1 NJE job gen. sect. priority
NJHGORGQ DS XL1 NJE job gen. sect. qualifier
NJHGJCPY DS XL1 NJE job gen. sect. copy
NJHGLNCT DS XL1 NJE job gen. sect. lpp
DS XL1 NJE job gen. sect. reserved
NJHGHOPS DS AL2 NJE job gen. sect. hop count
NJHGACCT DS CL8 NJE job gen. sect. acct
NJHGJNAM DS CL8 NJE job gen. sect. name
NJHGUSID DS CL8 NJE job gen. sect. userid
NJHGPASS DS XL8 NJE job gen. sect. password
NJHGNPAS DS XL8 NJE job gen. sect. new pass
NJHGETS DS XL8 NJE job gen. sect. TOD time
NJHGORGN DS CL8 NJE job gen. sect. org node
NJHGORGR DS CL8 NJE job gen. sect. org user
NJHGXEQN DS CL8 NJE job gen. sect. exe node
NJHGXEQU DS CL8 NJE job gen. sect. exe user
NJHGPRTN DS CL8 NJE job gen. sect. prt dest
NJHGPRTR DS CL8 NJE job gen. sect. prt user
NJHGPUNN DS CL8 NJE job gen. sect. pun dest
NJHGPUNR DS CL8 NJE job gen. sect. pun user
NJHGFORM DS CL8 NJE job gen. sect. form
NJHGICRD DS XL4 NJE job gen. sect. inp cards
NJHGETIM DS XL4 NJE job gen. sect. job time
NJHGELIN DS XL4 NJE job gen. sect. prt lines
NJHGECRD DS XL4 NJE job gen. sect. pun cards
NJHGPRGN DS CL20 NJE job gen. sect. programmr
NJHGROOM DS CL8 NJE job gen. sect. room no
NJHGDEPT DS CL8 NJE job gen. sect. dept
NJHGBLDG DS CL8 NJE job gen. sect. building
NJHGNREC DS XL4 NJE job gen. sect. rec. cnt
NJHGSIZE EQU *-NJHGDSEC NJE job gen. sect. size
NJHSIZE EQU NJEPSIZE+NJHGSIZE NJE job header total size
*
* NJE data set header general section
*
NDHGDSEC DSECT NJE data set general sect.
NDHGLEN DS AL2 NJE ds gen sect. length
NDHGTYPE DS XL1 NJE ds gen sect. type
NDHGMOD DS XL1 NJE ds gen sect. type modif
NDHGNODE DS CL8 NJE ds gen sect. dest node
NDHGRMT DS CL8 NJE ds gen sect. dest user
NDHGPROC DS CL8 NJE ds gen sect. proc name
NDHGSTEP DS CL8 NJE ds gen sect. step type
NDHGDD DS CL8 NJE ds gen sect. ddname
NDHGDSNO DS AL2 NJE ds gen sect. count
DS XL1 Reserved
NDHGCLAS DS CL1 NJE ds gen sect. class
NDHGNREC DS XL4 NJE ds gen sect. Record cnt
NDHGFLG1 DS XL1 NJE ds gen sect. flags
NDHGRCFM DS XL1 NJE ds gen sect. record fmt
NDHGLREC DS AL2 NJE ds gen sect. record len
NDHGDSCT DS XL1 NJE ds gen sect. copy count
NDHGFCBI DS XL1 NJE ds gen sect. print index
NDHGLNCT DS XL1 NJE ds gen sect. lpp
DS XL1 Reserved
NDHGFORM DS CL8 NJE ds gen sect. form
NDHGFCB DS CL8 NJE ds gen sect. FCB
NDHGUCS DS CL8 Universal char set name
NDHGXWTR DS CL8 Data set external writer
NDHGNAME DS CL8 Data set name qualifier
NDHGFLG2 DS XL1 Second flag byte
NDHGUCSO DS XL1 NJE ds gen sect. UCS options
DS XL2 Reserved
NDHGPMDE DS CL8 NJE ds gen sect. proc mode
NDHGSIZE EQU *-NDHGDSEC Ds hdr general section size
*
* NJE data set header RSCS section
*
NDHVDSEC DSECT Data set header RSCS sect.
NDHVLEN DS AL2 Ds header RSCS sect. length
NDHVTYPE DS AL1 Ds header RSCS sect. type
NDHVMOD DS AL1 Ds header RSCS sec modifier
NDHVFLG1 DS AL1 Ds header RSCS sect flags
NDHVCLAS DS CL1 Ds header RSCS sect class
NDHVIDEV DS AL1 Ds header RSCS sect dev typ
NDHVPGLE DS AL1 Ds header RSCS 3800 page ln
NDHVDIST DS CL8 Ds header RSCS dist code
NDHVFNAM DS CL12 Ds header RSCS filename
NDHVFTYP DS CL12 Ds header RSCS filetype
NDHVPRIO DS AL2 Ds header RSCS trn priority
NDHVVRSN DS AL1 Ds header RSCS version no
NDHVRELN DS AL1 Ds header RSCS release no
NDHVSIZE EQU *-NDHVDSEC Ds header RSCS section size
NDHSIZE EQU NJEPSIZE+NDHGSIZE+NDHVSIZE Total ds header size
*
* NJE job trailer general section
*
NJTGDSEC DSECT Job trailer general section
NJTGLEN DS AL2 Job trailer gen sect length
NJTGTYPE DS AL1 Job trailer gen sect type
NJTGMOD DS AL1 Job trailer gen sc modifier
NJTGFLG1 DS AL1 Job trailer gen sect flags
NJTGXCLS DS CL1 Job trailer execution class
DS XL2 Reserved
NJTGSTRT DS XL8 Job trailer job start TOD
NJTGSTOP DS XL8 Job trailer job stop TOD
DS XL4 Reserved
NJTGALIN DS XL4 Job trailer print lines
NJTGACRD DS XL4 Job trailer card images
DS XL4 Reserved
NJTGIXPR DS XL1 Job trailer init exec prior
NJTGAXPR DS XL1 Job trailer actul exe prior
NJTGIOPR DS XL1 Job trailer init job prior
NJTGAOPR DS XL1 Job trailer actual job prio
NJTGSIZE EQU *-NJTGDSEC Job trailer gen. sect. size
NJTSIZE EQU NJEPSIZE+NJTGSIZE Job trailer total size
*
* NMR record
*
NMRDSECT DSECT
NMRFLAG DS XL1 NMR flags
NMRLVPR DS XL1 NMR level / priority
NMRTYPE DS XL1 NMR type
NMRML DS XL1 Length of contents of NMRMSG
NMRTO DS 0XL9 Destination system
NMRTONOD DS CL8 NMR destination node
NMRTOQUL DS XL1 Destination node system identifier
NMROUT DS CL8 Userid / remote id / console id
NMRFM DS 0XL9 NMR originating system
NMRFMNOD DS CL8 NMR originating node
NMRFMQUL DS XL1 Originating node system identifier
NMRHSIZE EQU *-NMRDSECT Size of NMR header only
NMRECSID DS 0CL8 Message origination node
NMRMSG DS CL148 NMR message / command
NMRSIZE EQU *-NMRDSECT NMR size including message / command
*
* Fields in NMRFLAG
*
NMRFLAGC EQU X'80' NMR is a command
NMRFLAGW EQU X'40' NMROUT has remote workstation id
NMRFLAGT EQU X'20' NMROUT contains a userid
NMRFLAGU EQU X'10' NMROUT contains console identifier
NMRFLAGR EQU X'08' Console is remote-authorized only
NMRFLAGJ EQU X'04' Console is not job-authorized
NMRFLAGD EQU X'02' Console is not device-authorized
NMRFLAGS EQU X'01' Console is not system-authorized
*
* Fields in NMRTYPE
*
NMRTYPE4 EQU X'08' Source userid embedded in NMRMSG
NMRTYPET EQU X'04' Timestamp is not embedded in NMRMSG
NMRTYPEF EQU X'02' NMR comtains a formatted command
NMRTYPED EQU X'02' Contains a delete operator message
*
* SYSIN RCBs
*
RRCB1 EQU X'98' Stream 1 sysin records
RRCB2 EQU X'A8' Stream 2 sysin records
RRCB3 EQU X'B8' Stream 3 sysin records
RRCB4 EQU X'C8' Stream 4 sysin records
RRCB5 EQU X'D8' Stream 5 sysin records
RRCB6 EQU X'E8' Stream 6 sysin records
RRCB7 EQU X'F8' Stream 7 sysin records
*
* SYSOUT RCBs
*
PRCB1 EQU X'99' Stream 1 sysout records
PRCB2 EQU X'A9' Stream 2 sysout records
PRCB3 EQU X'B9' Stream 3 sysout records
PRCB4 EQU X'C9' Stream 4 sysout records
PRCB5 EQU X'D9' Stream 5 sysout records
PRCB6 EQU X'E9' Stream 6 sysout records
PRCB7 EQU X'F9' Stream 7 sysout records
./ ADD NAME=NJEPARMS
MACRO
&X NJEPARMS
.*
.* Change log:
.*
.*
.* 04 Dec 20 - Expanded internal trace table support v212
.* 29 Nov 20 - Use text-based configuration; alternate routes v211
.* 29 Nov 20 - Initial creation. v211
.*
*--this area mapped as INITPARM; passed to NJEDRV/NJECMX/NJESCN v211
DS 0D v211
INITPARM DS 0XL72 v220
* Offset Owner Area to be passed v211
* ------ ------- --------------------------------v211
LCLNODE DS CL8 0 NJEINIT Local node name v211
CPUID DS D 8 NJEINIT CPUID of this system v211
ANJECMX DS A 10 NJEINIT -> entry of NJECMX cmd processorv211
ANJESPL DS A 14 NJEINIT -> NJESPOOL interface v211
RQENUM DS F 18 NJEINIT # RQEs in stg area v211
ARQESTG DS A 1C NJEINIT -> RQE stg area v211
CSABLK DS A 20 NJEINIT -> CSA communication area v211
ALINKS DS A 24 NJEINIT -> LINKS (LINKTABL anchor) v211
AROUTES DS A 28 NJEINIT -> ROUTES (RTE list anchor) v211
AAUTHS DS A 2C NJEINIT -> AUTHS (AUTHLIST anchor) v211
ACMDBLOK DS A 30 NJEINIT -> CMDBLOK dsect (CMNDBLOK) v211
MSGQ DS A 34 NJEDRV Stacked msg Q anchor v211
XJELINK DS A 38 NJEDRV -> task's LINKTABL v211
ATRACE DS A 3C NJEINIT -> Trace table control v212
AREGUSER DS A 40 NJEINIT -> REGUSER (REGUSER anchor) v220
RESV1 DS F 44 Available word v220
* 48 Total length v220
INITPRML EQU *-INITPARM Length of this parm list v211
*--end of passed area v211
MEND
./ ADD NAME=NJEQUMSG
MACRO
&X NJEQUMSG
.*
.* Change log:
.*
.* 11 Dec 20 - Initial creation. v220
.*
QUMSG DSECT Queued user message
QUMNEXT DS A -> next QUMSG or 0
QUMOWNER DS A -> REGUSER that owns this msg
QUMSGTXT DS CL120 Message text
QUMSIZE EQU *-QUMSG Size of dsect
MEND
./ ADD NAME=NJERUSER
MACRO
&X NJERUSER
.*
.* Change log:
.*
.* 10 Dec 20 - Initial creation. v220
.*
*
REGUSERB DSECT Registered userid block
REGNEXT DS A -> next REGUSER or 0
REGEYE DS CL4'REGU' Eyecatcher
REGWRE DS A -> user's registration WRE in CSA
REGMSGQ DS A -> user's queued msgs WRE chain
REGUSRID DS CL8 Userid
REGSIZE EQU *-REGUSERB Size of dsect
MEND
./ ADD NAME=NJETRACE
MACRO
&X NJETRACE &TYPE=
.*
.* Change log:
.*
.* 10 Dec 20 - Support for registered users and message queuing v220
.* 10 Dec 20 - Create NJETRACE macro from old in-line TRACE macro v220
.*
AIF ('&TYPE' EQ 'DSECT').DSECT
.*
&X STM R15,R2,16(R13) R0-R2 restored by trace rtn
L R2,ATRACE -> trace table
L R15,TRCRTN-TRCCTL(,R2) -> trace routine
BALR R14,R15 Go get a new trace entry
L R15,16(,R13) Restore R15
MVI 0(R14),&TYPE Move in trace type code
MEXIT
.*
.DSECT ANOP
TRCCTL DSECT
TRCEYE DS CL8'TRACETAB' Eyecatcher
TRCRTN DS A -> Trace routine
DS A Reserved
TRCSTRT DS A -> Start of trace table
TRCCURR DS A -> Current trace entry
TRCEND DS A -> End of trace table
DS A Reserved
TRCSZ EQU 32 Size of each trace entry
*
*-- TRACE TABLE TYPES
*
TRCEXCP EQU X'01' EXCP operation
TRCWAIT EQU X'02' Wait completed
TRCDYNA EQU X'03' Dynamic Allocation
TRCMSG EQU X'04' Message
TRCRCMD EQU X'05' remote command
TRCGET EQU X'06' Getmain
TRCFREE EQU X'07' Freemain
TRCOPNO EQU X'08' Open output request
TRCCLSO EQU X'09' Close output request
TRCOPNI EQU X'0A' Open input request
TRCCONT EQU X'0B' Spool contents request
TRCCLSI EQU X'0C' Close input request
TRCPURG EQU X'0D' File Purge request
TRC0E EQU X'0E' Available
TRCGLQ EQU X'0F' GLINKREQ
TRCGRQ EQU X'10' GROUTREQ
TRCALQ EQU X'11' ALERTREQ
TRCGMQM EQU X'12' GMSGREQ from MSGQ
TRCGMQR EQU X'13' GMSGREQ from RQE
TRCIWRE EQU X'14' Incoming WRE
TRCOWRE EQU X'15' Outgoing WRE
TRCGWRE EQU X'16' Getmain WRE
TRCFWRE EQU X'17' Freemain WRE
*
MEND
./ ADD NAME=NJEVER
MACRO
NJEVER
GBLC &VERS
&VERS SETC 'v2.3.0' -> Current version
B 34(,R15)
DC AL1(29)
DC CL9'&SYSECT'
DC CL6'&VERS'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
MEND
./ ADD NAME=NJEWRE
MACRO
&X NJEWRE
.*
.* Change log:
.*
.* 10 Dec 20 - Support for registered users and message queuing v220
.*
WRE DSECT
WRENEXT DS A -> next WRE or 0
WRETYPE DS X WRE type
WRENEW EQU X'04' New file added to NETSPOOL
WRECMD EQU X'08' CMD type
WREMSG EQU X'0C' MSG type
WRESTAR EQU X'10' START type
WREREG EQU X'14' Registration request v220
WREDREG EQU X'18' Deregistration request v220
WREQRM EQU X'1C' Queue registered user msg v220
WREDRM EQU X'20' Dequeue registered user msg v220
WRECODE DS X Command code for link driver
WRETXTLN DS X CMD or MSG text length
WRESP DS X Getmained subpool number v220
WRELINK DS CL8 Target link name for this WRE
WREUSER DS CL8 Target user name for this WRE
WREORIG DS 0CL8 Originating userid of MSG v220
WREASCB DS A Originating ASCB addr v220
WREECB DS F Originator ECB for CM POST v220
WRETXT DS CL120 Command or message text
WRESIZE EQU *-WRE Size of WRE v220
*
*- Error codes for registered user services (POST code in WREECB) v220
ERNOERR EQU 0 No errors v220
ERNOMSG EQU 4 No more messages v220
ERSTOP EQU 8 STOP command issued v220
ERINVREQ EQU 12 Invalid request v220
ERINACT EQU 16 NJE38 is not active v220
ERPOST EQU 20 CM POST to NJE38 failure v220
ERDUPUSR EQU 24 User already registered v220
ERUSERNF EQU 28 Userid is not registered v220
ERECBPST EQU 32 User ECB was posted v220
MEND
./ ADD NAME=NSIO
MACRO MAC00010
&L NSIO &TYPE=, XMAC00020
&NCB=NCB, XMAC00030
&TAG=, XMAC00040
&EODAD=, XMAC00050
&AREALEN=, XMAC00060
&AREA=, XMAC00070
&RECLEN=, v210XMAC00080
&ENTRY= v210 MAC00080
.*
.* Change log:
.*
.* 10 AUG 20 - Add alternate entry point via ENTRY= v210
.* 21 May 20 - Add update directory entry functionality v120
.*
.* MAC00100
LCLA &OFFREQ MAC00110
LCLA &OFFTAG MAC00120
LCLA &OFFEOD MAC00130
LCLA &OFFARL MAC00140
LCLA &OFFARA MAC00150
LCLA &OFFRCL MAC00160
LCLA &NSIZE MAC00180
LCLA &REQ MAC00190
LCLC &W MAC00200
.* MAC00210
.* Offsets within NCB block MAC00220
&OFFREQ SETA 9 Offset of NCBREQ MAC00230
&OFFTAG SETA 16 Offset of NCBTAG MAC00240
&OFFEOD SETA 20 Offset of NCBEODAD MAC00250
&OFFARL SETA 24 Offset of NCBAREAL MAC00260
&OFFARA SETA 28 Offset of NCBAREA MAC00270
&OFFRCL SETA 32 Offset of NCBRECLN MAC00280
* MAC00300
.* Assembled size of NCB DSECT MAC00310
&NSIZE SETA 48 Size of an NCB MAC00320
.* MAC00330
AIF (T'&NCB NE 'O').NCB1 MAC00340
MNOTE 8,'NCB= PARAMETER REQUIRED' MAC00350
AGO .TYPE MAC00360
.* MAC00370
.NCB1 ANOP MAC00380
AIF ('&NCB'(1,1) EQ '(').NCB1R MAC00390
&L LA 1,&NCB -> NCB MAC00400
AGO .TYPE MAC00410
.NCB1R ANOP MAC00420
&W SETC '&NCB'(2,K'&NCB-2) MAC00430
&L LR 1,&W -> NCB MAC00440
.* MAC00450
.ISTYPE ANOP MAC00460
AIF (T'&TYPE NE 'O').TYPE MAC00470
MNOTE 8,'TYPE= PARAMETER REQUIRED' MAC00480
MEXIT MAC00490
.* MAC00500
.TYPE ANOP MAC00510
AIF ('&TYPE' EQ 'OPEN').OPEN MAC00520
AIF ('&TYPE' EQ 'CLOSE').CLOSE MAC00530
AIF ('&TYPE' EQ 'PUT').PUT MAC00540
AIF ('&TYPE' EQ 'GET').GET MAC00550
AIF ('&TYPE' EQ 'PURGE').PURGE MAC00560
AIF ('&TYPE' EQ 'FIND').FIND MAC00570
AIF ('&TYPE' EQ 'CONTENTS').CONTENT MAC00580
AIF ('&TYPE' EQ 'UDIR').UDIR v120 MAC00570
MNOTE 8,'TYPE=&TYPE IS NOT A VALID FUNCTION TYPE' MAC00590
MEXIT MAC00600
.* MAC00610
.OPEN ANOP MAC00620
&REQ SETA 1 MAC00630
XC 0(&NSIZE,1),0(1) Initialize NCB MAC00640
MVC 0(4,1),=CL4'NCB' Set NCB identifier MAC00650
AGO .SETREQ MAC00660
.* MAC00670
.CLOSE ANOP MAC00680
&REQ SETA 2 MAC00690
AGO .SETREQ MAC00700
.* MAC00710
.PUT ANOP MAC00720
&REQ SETA 3 MAC00730
AGO .SETREQ MAC00740
.* MAC00750
.GET ANOP MAC00760
&REQ SETA 4 MAC00770
AGO .SETREQ MAC00780
.* MAC00790
.PURGE ANOP MAC00800
&REQ SETA 5 MAC00810
AGO .SETREQ MAC00820
.* MAC00830
.FIND ANOP MAC00840
&REQ SETA 6 MAC00850
AGO .SETREQ MAC00860
.* MAC00870
.CONTENT ANOP MAC00880
&REQ SETA 7 MAC00890
AGO .SETREQ v120 MAC00860
.* MAC00830
.UDIR ANOP v120 MAC00840
&REQ SETA 8 v120 MAC00850
.* MAC00900
.SETREQ ANOP MAC00910
MVI &OFFREQ.(1),&REQ Set NCBREQ type MAC00920
.* MAC00930
.TAG ANOP MAC00940
AIF (T'&TAG EQ 'O').EODAD MAC00950
AIF ('&TAG'(1,1) EQ '(').TAG1R MAC00960
LA 0,&TAG -> TAG data MAC00970
ST 0,&OFFTAG.(,1) Store in NCB MAC00980
AGO .EODAD MAC00990
.TAG1R ANOP MAC01000
&W SETC '&TAG'(2,K'&TAG-2) MAC01010
ST &W,&OFFTAG.(,1) Store tag ptr in NCB MAC01020
.* MAC01030
.EODAD ANOP MAC01040
AIF (T'&EODAD EQ 'O').AREALEN MAC01050
AIF ('&EODAD'(1,1) EQ '(').EODAD1R MAC01060
LA 0,&EODAD -> End of data routine MAC01070
ST 0,&OFFEOD.(,1) Store in NCB MAC01080
AGO .AREALEN MAC01090
.EODAD1R ANOP MAC01100
&W SETC '&EODAD'(2,K'&EODAD-2) MAC01110
ST &W,&OFFEOD.(,1) Set EODAD address in NCB MAC01120
.* MAC01130
.AREALEN ANOP MAC01140
AIF (T'&AREALEN EQ 'O').AREA MAC01150
AIF ('&AREALEN'(1,1) EQ '(').AREAL1R MAC01160
MVC &OFFARL.(4,1),=A(&AREALEN) Set area length value in NCB MAC01170
AGO .AREA MAC01180
.AREAL1R ANOP MAC01190
&W SETC '&AREALEN'(2,K'&AREALEN-2) MAC01200
ST &W,&OFFARL.(,1) Set area length in NCB MAC01210
.* MAC01220
.AREA ANOP MAC01230
AIF (T'&AREA EQ 'O').RECLEN MAC01240
AIF ('&AREA'(1,1) EQ '(').AREA1R MAC01250
LA 0,&AREA -> Record buffer area MAC01260
ST 0,&OFFARA.(,1) Store in NCB MAC01270
AGO .RECLEN MAC01280
.AREA1R ANOP MAC01290
&W SETC '&AREA'(2,K'&AREA-2) MAC01300
ST &W,&OFFARA.(,1) Set area address in NCB MAC01310
.* MAC01320
.RECLEN ANOP MAC01330
AIF (T'&RECLEN EQ 'O').ENTRY v210 MAC01340
AIF ('&RECLEN'(1,1) EQ '(').REC1R MAC01350
MVC &OFFRCL.(2,1),=Y(&RECLEN) Set record length in NCB MAC01360
AGO .ENTRY v210 MAC01370
.REC1R ANOP MAC01380
&W SETC '&RECLEN'(2,K'&RECLEN-2) MAC01390
STH &W,&OFFRCL.(,1) Set record length in NCB MAC01400
.* MAC01500
.ENTRY ANOP MAC01510
AIF (T'&ENTRY EQ 'O').VCON v210
AIF ('&ENTRY'(1,1) EQ '(').ENT1R v210 MAC01350
L 15,&ENTRY Load NJESPOOL entry addr v210
AGO .LAUNCH v210
.* MAC01500
.ENT1R ANOP v210 MAC01510
&W SETC '&ENTRY'(2,K'&ENTRY-2) v210 MAC01390
AIF ('&W' EQ '15').LAUNCH v210 MAC01350
LR 15,&W Entry addr to R15 v210 MAC01400
AGO .LAUNCH v210
.*
.VCON ANOP v210
L 15,=V(NJESPOOL)
.*
.LAUNCH ANOP v210
BALR 14,15
.*
.MEND ANOP v210 MAC01510
MEND MAC01520
./ ADD NAME=REGEQU
MACRO REG00010
&X REGEQU REG00020
* DEFINES GENERAL REGISTERS REG00030
R0 EQU 0 REG00040
R1 EQU 1 REG00050
R2 EQU 2 REG00060
R3 EQU 3 REG00070
R4 EQU 4 REG00080
R5 EQU 5 REG00090
R6 EQU 6 REG00100
R7 EQU 7 REG00110
R8 EQU 8 REG00120
R9 EQU 9 REG00130
R10 EQU 10 REG00140
R11 EQU 11 REG00150
R12 EQU 12 REG00160
R13 EQU 13 REG00170
R14 EQU 14 REG00180
R15 EQU 15 REG00190
* DEFINES CONTROL REGISTERS REG00200
C0 EQU 0 REG00210
C1 EQU 1 REG00220
C2 EQU 2 REG00230
C3 EQU 3 REG00240
C4 EQU 4 REG00250
C5 EQU 5 REG00260
C6 EQU 6 REG00270
C7 EQU 7 REG00280
C8 EQU 8 REG00290
C9 EQU 9 REG00300
C10 EQU 10 REG00310
C11 EQU 11 REG00320
C12 EQU 12 REG00330
C13 EQU 13 REG00340
C14 EQU 14 REG00350
C15 EQU 15 REG00360
* DEFINES FLOATING PT REGISTERS REG00370
F0 EQU 0 REG00380
F2 EQU 2 REG00390
F4 EQU 4 REG00400
F6 EQU 6 REG00410
MEND REG00420
./ ADD NAME=ROUTE
MACRO
&LABEL ROUTE &PARM1,&PARM2, X
&TYPE=ENTRY
GBLA &RTETOT
AIF ('&TYPE' EQ 'FINAL').FINAL
LCLC &DEST,&NEXT
&RTETOT SETA &RTETOT+1
AIF (&RTETOT NE 1).NOT1
ROUTES DS 0D
.NOT1 ANOP
&DEST SETC ' '
&NEXT SETC ' '
AIF (T'&PARM1 EQ 'O').NOID
&DEST SETC '&PARM1'
AIF (T'&PARM2 EQ 'O').NOID
&NEXT SETC '&PARM2'
.NOID ANOP
&LABEL DC CL8'&DEST',CL8'&NEXT' DESTINATION, NEXT LINK
MEXIT
.FINAL ANOP
NUMRTES EQU &RTETOT
AIF (&RTETOT NE 0).MEND
ROUTES DS 0D
.MEND ANOP
MEND
./ ADD NAME=RSSEQU
PUSH PRINT
AIF ('&SYSPARM' NE 'SUP').RSS01
PRINT OFF,NOGEN
.RSS01 ANOP
*
*** RSS EQUATE SYMBOLS - MACHINE USAGE
*
SPACE 1
* BITS DEFINED IN STANDARD/EXTENDED PSW
EXTMODE EQU X'08' BIT 12 - EXTENDED MODE
MCHEK EQU X'04' BIT 13 - MACHINE CHECK ENABLED
WAIT EQU X'02' BIT 14 - WAIT STATE
PROBMODE EQU X'01' BIT 15 - PROBLEM STATE
SPACE 1
* BITS DEFINED IN CHANNEL STATUS WORD - CSW
ATTN EQU X'80' BIT 32 - ATTENTION
SM EQU X'40' BIT 33 - STATUS MODIFIER
CUE EQU X'20' BIT 34 - CONTROL UNIT END
BUSY EQU X'10' BIT 35 - BUSY
CE EQU X'08' BIT 36 - CHANNEL END
DE EQU X'04' BIT 37 - DEVICE END
UC EQU X'02' BIT 38 - UNIT CHECK
UE EQU X'01' BIT 39 - UNIT EXCEPTION
*
PCI EQU X'80' BIT 40 - PROGRAM-CONTROL INTERRUPT
IL EQU X'40' BIT 41 - INCORRECT LENGTH
PRGC EQU X'20' BIT 42 - PROGRAM CHECK
PRTC EQU X'10' BIT 43 - PROTECTION CHECK
CDC EQU X'08' BIT 44 - CHANNEL DATA CHECK
CCC EQU X'04' BIT 45 - CHANNEL CONTROL CHECK
IFCC EQU X'02' BIT 46 - INTERFACE CONTROL CHECK
CHC EQU X'01' BIT 47 - CHAINING CHECK
SPACE 1
* BITS DEFINED IN CHANNEL COMMAND WORD - CCW
CD EQU X'80' BIT 32 - CHAIN DATA
CC EQU X'40' BIT 33 - COMMAND CHAIN
SILI EQU X'20' BIT 34 - SUPPRESS INCORRECT LENGTH IND.
SKIP EQU X'10' BIT 35 - SUPPRESS DATA TRANSFER
PCIF EQU X'08' BIT 36 - PROGRAM-CONTROL INTERRUPT FETCH
IDA EQU X'04' BIT 37 - INDIRECT DATA ADDRESS
SPACE 1
* BITS DEFINED IN SENSE BYTE 0 -- COMMON TO MOST DEVICES
CMDREJ EQU X'80' BIT 0 - COMMAND REJECT
INTREQ EQU X'40' BIT 1 - INTERVENTION REQUIRED
BUSOUT EQU X'20' BIT 2 - BUS OUT
EQCHK EQU X'10' BIT 3 - EQUIPMENT CHECK
DATACHK EQU X'08' BIT 4 - DATA CHECK
EJECT
*
*** CP370 EQUATE SYMBOLS - CP USAGE
*
* SYMBOLIC REGISTER EQUATES
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7 GENERAL
R8 EQU 8 REGISTER
R9 EQU 9 DEFINITIONS
R10 EQU 10
R11 EQU 11
R12 EQU 12
R13 EQU 13
R14 EQU 14
R15 EQU 15
*
Y0 EQU 0 FLOATING
Y2 EQU 2 POINT
Y4 EQU 4 REGISTER
Y6 EQU 6 DEFINITIONS
EJECT
POP PRINT
SPACE
./ ADD NAME=RTE
RTE DSECT
ROUTPTR DS A -> next RTE entry or 0
DS A Reserved
ROUTNAME DS CL8 Route destination node
ROUTNEXT DS CL8 Link id for indirect routing
ROUTALT1 DS CL8 Alternate link id for indirect rt'g
ROUTALT2 DS CL8 Alternate link id for indirect rt'g
ROUTALT3 DS CL8 Alternate link id for indirect rt'g
ROUTSIZE EQU *-RTE Length of a routing table entry
./ ADD NAME=TAG
PUSH PRINT
AIF ('&SYSPARM' NE 'SUP').TAG01
PRINT OFF,NOGEN
.TAG01 ANOP
TAG DSECT
SPACE 1
*** TAG - FILE TAG
*
* 0 +-----------------------+-----------------------+
* | TAGNEXT | TAGBLOCK |
* 8 +-----------------------+-----------------------+
* | TAGINLOC |
* 10 +-----------------------------------------------+
* | TAGLINK |
* 18 +-----------------------------------------------+
* | TAGINTOD |
* 20 +-----------------------------------------------+
* | TAGINVM |
* 28 +-----------------------+-----------+-----+-----+
* | TAGRECNM | TAGRECLN | T*1 | T*2 |
* 30 +-----------+-----------+-----------+-----+-----+
* | TAGID | TAGCOPY | T*3 | T*4 | SPARE |
* 38 +-----------+-----------+-----------------------+
* | TAGNAME |
* 40 | +-----------------------+
* | | |
* 48 +-----------------------+ |
* | TAGTYPE |
* 50 +-----------------------------------------------+
* | TAGDIST |
* 58 +-----------------------------------------------+
* | TAGTOLOC |
* 60 +-----------------------------------------------+
* | TAGTOVM |
* 68 +-----------------------------------------------+
* | TAGPRIOR | TAGDEV |
* 70 +-----------+-----------+
*
*** TAG - FILE TAG
SPACE 1
TAGNEXT DS 1F ADDR OF NEXT ACTIVE QUEUE ENTRY
TAGBLOCK DS 1F ADDR OF ASSOCIATED I/O AREA
SPACE
TAGINLOC DS CL8 ORIGINATING LOCATION
TAGLINK DS CL8 NEXT LOCATION FOR TRANSMISSION
TAGINTOD DS CL8 TIME OF FILE ORIGIN
TAGINVM DS CL8 ORIGINATING VIRTUAL MACHINE
TAGRECNM DS 1F NUMBER OF RECORDS IN FILE
TAGRECLN DS 1H MAXIMUM FILE DATA RECORD LENGTH
TAGINDEV DS 1X T*1 DEVICE CODE OF ORIGINATING DEV
TAGCLASS DS CL1 T*2 FILE OUTPUT CLASS
TAGID DS 1H FILE NUMBER AT ORIGIN LOCATION
TAGCOPY DS 1H NUMBER OF COPIES REQUESTED
TAGFLAG DS 1X T*3 VM/370 SFBLOK CONTROL FLAGS
TAGFLAG2 DS 1X T*4 VM/370 SFBLOK CONTROL FLAGS
DS 1H SPARE
TAGNAME DS CL12 FILE NAME
TAGTYPE DS CL12 FILE TYPE
TAGDIST DS CL8 FILE DISTRIBUTION CODE
TAGTOLOC DS CL8 DESTINATION LOCATION ID
TAGTOVM DS CL8 DESTINATION VIRTUAL MACHINE ID
TAGPRIOR DS 1H TRANSMISSION PRIORITY
TAGDEV DS 2X ACTIVE FILE'S VIRT DEV ADDR
SPACE
TAGUSELN EQU *-TAGINLOC USABLE TAG INFO LEN *XJE
TAGLEN EQU *-TAGNEXT LENGTH OF THE FILE TAG
EJECT
POP PRINT
SPACE
@@
//*
//* Installs SYSGEN.NJE38.ASMSRC
//*
//ASMSRC EXEC PGM=PDSLOAD
//STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD DSN=SYSGEN.NJE38.ASMSRC,DISP=(NEW,CATLG),
// VOL=SER=PUB001,
// UNIT=3390,SPACE=(CYL,(2,1,10)),
// DCB=(BLKSIZE=6160,LRECL=80,RECFM=FB)
//SYSUT1 DD DATA,DLM=@@
./ ADD NAME=NJESYS
*
*
*-- NJE38 - Locate NJE38 information from an ENQ resource
*
*
* Called by NJEINIT,NJERCV,NJETRN,NJE38,NJ38XMIT,NJ38RECV
*
*
* Change log:
*
* 01 Oct 20 - Initial creation v210
*
*
GBLC &VERS
REGEQU
NJESYS CSECT
NJEVER
STM R14,R12,12(R13) Save regs
LR R12,R15
USING NJESYS,R12
*
*-- Determine if NJE38 is already active in another address space
*
CHK000 EQU *
L R2,16 Get CVT ptr
USING CVT,R2
LA R2,CVTFQCB -> ENQ QCB chain anchor
USING QCB,R2
*
CHK010 EQU *
ICM R2,15,MAJNMAJ -> next major QCB
BZ CHK080 Our guy not found
CLC MAJNAME,NJE38Q Look for our QNAME "NJE38"
BNE CHK010 Nope, go to next QCB
*
L R3,MAJFMIN -> first minor QCB
USING MIN,R3
*
CHK020 EQU *
LA R4,MINNAME -> minor name
CLC NJERCON,0(R4) Does minor name match?
BE CHK030 Yes. NJE38 is active
C R3,MAJLMIN Is this the last minor QCB?
BE CHK080 Yes, we're done. NJE38 is not active
ICM R3,15,MINNMIN -> next minor name
BZR R14 Just in case no address
B CHK020 Spin through the minor QCBs
*
CHK030 EQU *
LTR R1,R1 Store spool DSN?
BZ CHK040 No
MVC 0(44,R1),12(R4) Save off NETSPOOL dsname
*
CHK040 EQU *
L R1,8(,R4) Get CSABLK ptr from QCB minor
SR R15,R15 RC=0, ENQ data was found
B CHK090
*
CHK080 EQU *
LA R15,4 RC=4, no ENQ located
*
CHK090 EQU *
ST R1,24(,R13) Return R1 value
ST R15,16(,R13) Return R15 RC
*
LM R14,R12,12(R13) Reload regs
BR R14 Return
*
DS 0D
NJE38Q DC CL8'NJE38'
NJERCON DC CL8'NJEINIT'
*
LTORG ,
*
CVT DSECT=YES,PREFIX=NO
IHAQCB
*
END
./ ADD NAME=NJESPOOL
*
*
*-- NJE38 - "Spool" Services
*
*
* Called by NJEINIT and NJEDRV for spool-like services
*
*
*
* Change log:
*
* 23 Jul 20 - Make CONTENTS return spool full percentage v200
* 21 Jul 20 - Only part of record buffer area was FREEMAINed v200
* 01 Jun 20 - Exclusive control error because ENDREQ not issued v130
* on CONTENTS function against an empty spool. v130
* 21 May 20 - Add update directory entry functionality v120
* 08 May 20 - RC 12 errors need error addr in NCBMACAD v110
*
*
* NJESPOOL - Provide a spooling mechanism "access method" for use by
* NJE38 to hold data files queued for transmission, or to
* hold data files that have been received via transmission
* but not yet retrieved by the destination user.
*
* The main goal of NJESPOOL is to provide a simple way to read and
* write files by the NJE line driver without the line driver having
* to know the vagaries of i/o, record formats, directories, and so on.
* NJESPOOL does the heavier lifting and spool management under the
* covers and unknown to the line driver.
*
* The spool dataset, "NETSPOOL", is a VSAM RRDS-type dataset. All
* blocks in the dataset are one control interval in size. The CI size
* must be 4096, which gives a usable record size of 4089 bytes. The
* NETSPOOL internal format is based on these sizes.
*
* NETSPOOL contains a directory which describes the data files
* present within. There are two directories; one is the current
* directory which describes the true state of NETSPOOL, the other is
* the current-minus-1 diectory, which is the state of NETSPOOL just
* prior to the very last directory update. When new data files are
* added or removed from NETSPOOL, the current directory is copied onto
* current-minus-1 and then the addition or deletion is applied. This
* then becomes the current directory and the directory that was most
* recently current becomes current-minus-1. Thus the directories
* alternate back and forth. The first block of each directory are
* blocks 2 and 3, respectively. If the directory size expands to
* additional blocks, they can be anywhere in the dataset, but the
* very first block of either directory is ALWAYS 2 or 3.
*
* Block #1 contains a fullword pointer that contains the block number
* of whichever directory is current. Thus, it will contain a 2 or 3.
* Alternating directories ensures that in the event of a failure while
* adding or deleting a data file, the changes do not clobber the
* current directory. Only when those updates complete successfully
* is the block 1 pointer to the new current directory updated.
*
*
* The format of the NETSPOOL dataset is very simple.
* Block 1 - contains the block # of the current directory block and
* a few other items.
* Blocks 2-3 - contain the 1st directory block for the current
* and current-minus-1 directories.
* Blocks 4-7 - contains the free space bit map.
* Blocks 8-n - data blocks available for data files or directory blks.
*
* The free space bitmap is simply a 4-block long (4089 * 4 = 16356
* bytes) string of bits that represent whether a given CI in the
* dataset is used or available. Upon initial formatting, the blocks
* 1-7 are marked as used. The rest of the data blocks are free until
* the last block number that is physically present in the VSAM RRDS
* dataset. The maximum number of blocks supported by this scheme is
* 130,848. This is 873 cylinders of 3380 DASD space, for example.
* For VSAM RRDS NETSPOOL sizes of fewer cylinders, blocks higher than
* the highest available physical block number are marked as used out
* to the end of the bitmap so they will never be allocated.
*
*
* ACCESSING NETSPOOL VIA PROGRAMMING
*
* You may access the NETSPOOL dataset via programming the same way
* that the NJE line driver and NJE38 utilities do: via a NETSPOOL
* CONTROL BLOCK (NCB) and the NSIO macro.
*
* The NCB is a small control block that is something akin to a VSAM
* RPL. It simply contains information about the file being read or
* written and contains pointers to the user buffer, and file
* attributes.
*
* The NSIO macro is used to open or close the NETSPOOL dataset. It is
* also used to read or write data records, and obtain directory
* information.
*
* The NCB and the NSIO macro are used together and provide the
* functions for spool access:
*
* NSIO TYPE=OPEN - Opens the NETSPOOL dataset for i/o
* CLOSE - Closes NETSPOOL and updates directory
* PUT - Writes a single record to the spool
* GET - Reads a single record from the spool
* PURGE - Deletes a data file from the spool
* FIND - Locates a data file by file number
* CONTENTS - Returns the current directory contents
* UDIR - Update a directory entry v120
*
* All NSIO macros must specify the NCB that it is associated with.
* The spool is not opened for "input" or for "output" in the
* traditional sense. Rather, the first TYPE=GET or TYPE=PUT
* issued establishes the mode. Once the mode is established you
* may not change from PUT to GET, or GET to PUT, without first
* closing the spool and re-opening. The PURGE, FIND, and CONTENTS
* functions do not establish any mode, and can be used any time
* the spool is open.
*
* If you need to open the spool file by two or more tasks or modes
* simultaneously, use multiple NCBs.
*
* VSAM errors are returned via the NCBRTNCD and NCBERRCD fields which
* are analagous to the VSAM RPLRTNCD and RPLERRCD fields. If an
* actual VSAM error occurs, NCBRTNCD will be set to 8 and the NCBERRCD
* field contains the actual VSAM RPLERRCD value. If NCBRTNCD is 12,
* the error code value is an internal value used by NJESPOOL. These
* are:
*
* NCBRTNCD=X'0C' Internal NJESPOOL error
* NCBERRCD=X'01' Invalid function code (not open, close, get, etc).
* X'02' VSAM RRDS ACB is not open
* X'03' NETSPOOL dataset is full
* X'04' File # not found in directory (TYPE=FIND/PURGE)
* X'05' GET attempted in PUT mode, or,
* PUT attempted in GET mode
* X'06' No files in directory (TYPE=CONTENTS)
*
* Refer to the utilities NJ38XMIT and NJ38RECV for examples using
* NCB and NSIO to access the spool.
*
PRINT GEN NJE00030
REGEQU REGISTER EQUATES NJE00040
*
* NETSPOOL Internal values
*
ALLOCBLK EQU 4 Starting BLK# of allocation map
ALLOCNUM EQU 4 Number of allocation map blocks
*
*
NJESPOOL CSECT NJE00020
NJEVER
STM R14,R12,12(R13) SAVE CMS REGS NJE00050
LR R12,R15 BASE NJE00060
USING NJESPOOL,R12 ADDRESS IT NJE00070
LTR R9,R1 NCB ptr to R9
BZ EXIT16 Exit if no ptr
USING NCB,R9
CLC NCBEYE,=CL4'NCB' Is it an NCB?
BNE EXIT16 Exit if not
XC NCBRTNCD(2),NCBRTNCD Clear prior error codes
CLI NCBREQ,NCBOPEN Is this an OPEN function?
BE INIT000 Yes, ignore token
L R10,NCBTKN Get caller token
CLC 0(4,R10),=CL4'NSPL' Token point to NSPL work area?
BE INIT010 Yes, looks good
B EXIT16 Exit if token invalid
*
*
INIT000 EQU *
GETMAIN RU, Get local stg area X
LV=4096, X
BNDRY=PAGE
LR R10,R1
ST R10,NCBTKN Set area addr as token
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the page
*
USING NJEWK,R10
MVC NJEEYE,=CL4'NSPL' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
*
INIT010 EQU *
USING NJEWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
L R11,=A(NJECMN) -> common csect
ST R11,ANJECMN Save addr
USING NJECMN,R11
*
*
INIT100 EQU *
LA R14,* -> location of error source v110
SR R1,R1 Clear for IC
IC R1,NCBREQ Get request type
SLL R1,2 Multiply by 4 to make index
C R1,=A(INIT120-INIT110) Size of branch table
BH ERR1201 Exit if req type invalid
B INIT110(R1) Branch to requested function
*
INIT110 B ERR1201 00 Invalid function
B OPN000 01 Open NETSPOOL dataset
B CLS000 02 Close NETSPOOL dataset
B PUT000 03 Write a logical record
B GET000 04 Read a logical record
B PUR000 05 Purge a file from NETSPOOL
B FID000 06 Locate a file by file id
B CON000 07 Get a list of files in NETSPOOL
B UDR000 08 Update directory entry v120
*
INIT120 EQU * Must mark end of branch table
*
* NJE00920
******************** NJE00920
* * NJE00920
* OPEN DATASET * NJE00920
* NCBREQ = X'01' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
*
*- Get storage for NETSPOOL block
*
OPN000 EQU *
GETMAIN RU, Get stg for NETSPOOL blocks X
LV=3*4096, X
BNDRY=PAGE
ST R1,BLOCK This is the VSAM AREA
LR R3,R1 R3 for now
LA R2,4089(,R1) -> end of BLOCK record size
ST R2,BLOCKEND Save it
A R1,=F'4096' -> 2nd page
ST R1,PTRBUF This is an internal rec'd buffer
ST R1,PTRPOS Save also as internal write pos
LA R2,4084(,R1) -> end of ptr part of PTRBUF
ST R2,PTRBUFEN Save it (bytes 4084-4089 special
A R1,=F'4096' -> 2nd page
ST R1,BUFF This is an internal rec'd buffer
ST R1,PUTPOS Save also as internal write pos
LA R1,4089(,R1) -> end of BUFF record size
ST R1,BUFFEND Save it
XC PTRBLK,PTRBLK Initialize
XC NEWBLK,NEWBLK Initialize
XC PUTCNT,PUTCNT Initialize (to be placed in TAG)
XC GETCNT,GETCNT Initialize (only used for debug)
*
GENCB BLK=ACB, x
DDNAME=NETSPOOL, x
MACRF=(OUT,KEY,DIR), x
MF=(G,MACLIST)
STM R0,R1,ACBL Save len, addr
*
LA R4,KEY -> block number argument
GENCB BLK=RPL, x
ACB=(*,ACB), x
AREA=(R3), -> block area x
AREALEN=4089, x
RECLEN=4089, x
ARG=(R4), x
OPTCD=(KEY,DIR,MVE,UPD), x
MF=(G,MACLIST)
STM R0,R1,RPLL Save len, addr
*
BAL R14,ENQ000 Get exclusive control
*
L R7,ACB -> ACB
MVC MACLIST(OPENL),OPEN Move macro model
OPEN ((R7)), Open NETSPOOL x
MF=(E,MACLIST)
*
BAL R14,CHKOC Check open/close result
BNZ EXIT08 Exit with VSAM error
OI NJFL1,NJF1OACB Indic ACB open
*
*-- Get NETSPOOL directory block ptr from block 1; determine if
*-- NETSPOOL has been formatted.
*
OPN040 EQU *
MVC KEY,=F'1'
L R7,RPL
GET RPL=(R7)
BAL R14,CHKRPL Check RPL result
BNZ EXIT08 Exit with VSAM error
*
ENDREQ RPL=(R7) Cancel the update request
BAL R14,CHKRPL Check RPL result
BNZ EXIT08 Exit with VSAM error
*
BAL R14,DEQ000 Release control
B EXIT00 Otherwise OPEN is complete
* NJE00920
* NJE00920
******************** NJE00920
* * NJE00920
* CLOSE DATASET * NJE00920
* NCBREQ = X'02' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
CLS000 EQU *
SR R5,R5 Clear possible RC
TM NJFL1,NJF1OACB Is ACB open?
BZ CLS090 No
BAL R14,ENQ000 Get exclusive control
*
TM NJFL1,NJF1PUT Processing PUTs against file?
BZ CLS050 N, skip close related PUT funcs.
*
CLC NCBTAG,=A(0) Is tag data present?
BE CLS050 0, Cant write a directory
*
TM NJFL1,NJF1WPND Is physical write pending?
BZ CLS030 No
NI NJFL1,255-NJF1WPND No physical write pending
*
MVC KEY,NEWBLK Prep for update of blk to write
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R3,PUTPOS -> logical record position
LA R3,2(,R3) Account for FFFF EOF marker
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,BUFF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
*
CLS030 EQU *
NC PTRBLK,PTRBLK Is ptr block write pending?
BZ CLS040
MVC KEY,PTRBLK Prep for update of blk to write
XC PTRBLK,PTRBLK Clear block number for recursion
OI NJFL1,NJF1DPND Indic directory add pending
*
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R3,PTRPOS -> ptr record position
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,PTRBUF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
*
CLS040 EQU *
TM NJFL1,NJF1DPND Directory add pending?
BZ CLS050 No
NI NJFL1,255-NJF1DPND Remove directory add pending
*
L R1,NCBTAG -> tag data
USING TAG,R1
MVC TAGRECNM,PUTCNT Save # records actually written
DROP R1
*
LA R0,DIRADD Add directory entry function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File to add is in NCB
LR R5,R15 Any RC to R5
*
CLS050 EQU *
L R7,ACB -> ACB
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE ((R7)), Close the ACB x
MF=(E,MACLIST)
*
NI NJFL1,255-NJF1OACB ACB now closed
BAL R14,DEQ000 Release control
*
CLS090 EQU *
L R1,BLOCK -> NETSPOOL record areas
FREEMAIN RU,LV=3*4096,A=(1) Release it v200
*
LM R0,R1,RPLL
FREEMAIN RU,LV=(0),A=(1)
*
LM R0,R1,ACBL
FREEMAIN RU,LV=(0),A=(1)
*
XC NCBTKN,NCBTKN Clear token
B QUIT000 Exit with RC in R5
* NJE00920
* NJE00920
******************** NJE00920
* * Write a logical record (not a physical block) NJE00920
* PUT * NJE00920
* NCBREQ = X'03' * No ENQ is required when writing the physical NJE00920
* * blocks as these blocks are allocated exclusively NJE00920
******************** to the calling task. NJE00920
* NJE00920
PUT000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
TM NJFL1,NJF1GET Processing GETs against file?
BO ERR1205 Yes, cant do PUT now
OI NJFL1,NJF1PUT Indicate PUT in progress
*
NC PTRBLK,PTRBLK Do we have a ptr block?
BNZ PUT020 Yes
BAL R14,GETBLK Allocate a new physical block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,PTRBLK Save block number of ptr blk
ST R0,INITBLK Save first block # used in PUT
L R0,PTRBUF -> ptr block area
LA R1,4089 Size of physical block
LR R3,R1 Compute length to write out
MVCL R0,R2 Clear the ptr block
MVC PTRPOS,PTRBUF Set write position in block
*
BAL R14,GETBLK Allocate a new physical block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,NEWBLK Save allocated blk #
MVC PUTPOS,BUFF Set write position in block
L R1,PTRPOS Get current ptr block position
ST R0,0(,R1) Save new blk# in ptr block
LA R1,4(,R1) Next ptr block slot
ST R1,PTRPOS Update position
*
PUT020 EQU *
L R3,PUTPOS Get current position
L R1,BUFFEND -> end of buffer
SR R1,R3 Determine remaining space in blk
LH R4,NCBRECLN Get size of record to write
LA R2,2+2(,R4) Add in overhead
* +2 for length halfword
* +2 for next block marker
CR R1,R2 Is there room to add record?
BL PUT100 No, better get another block
*
L R15,NCBAREA -> to logical record
BCT R4,*+10 Adjust len for execute
PUTREC MVC 2(0,R3),0(R15)
EX R4,PUTREC Move record to block
LA R4,1+2(,R4) Get record len + overhead
* +1 to get back true length
* +2 for length halfword itself
STCM R4,3,0(R3) Store the length
*
TM NCBFL1,NCBPUN Is this PUN type data?
BO PUT050 Y, no special action
TM 2(R3),X'03' Is carriage ctl an immediate?
BO PUT060 Y, Don't count these records
*
PUT050 EQU *
L R1,PUTCNT Get count of records written
LA R1,1(,R1) Bump it
ST R1,PUTCNT Update count
*
PUT060 EQU *
AR R3,R4 Compute next avail byte in blk
MVC 0(2,R3),=X'FFFF' Set current EOF marker in case
* we write no more records
ST R3,PUTPOS Save write position for next
* record; would overwrite the
* FFFF marker on next PUT.
OI NJFL1,NJF1WPND Indicate physical write req'd
B EXIT00
*
PUT100 EQU *
L R5,NEWBLK Get current blk # we need to wrt
BAL R14,GETBLK Allocate a new physical block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,NEWBLK Save newly allocated blk #
MVC 0(2,R3),=X'FFFE' Insert ptr indic for next blk
LA R3,2(,R3) -> next write position
*
ST R5,KEY Prep for update of blk to write
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,BUFF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
MVC PUTPOS,BUFF Reset write position in new blk
NI NJFL1,255-NJF1WPND No physical write pending
*
*-- Now ensure newly allocated block is also pointed to by ptr block
*
L R3,PTRPOS Get current ptr block position
MVC 0(4,R3),NEWBLK Save new blk# in ptr block
LA R3,4(,R3) Next ptr block slot
C R3,PTRBUFEN Is ptr block full?
BNL PUT200 Yes
ST R3,PTRPOS Update position
B PUT020 Now retry to add next logical
*
*-- Here if we need another ptr block (chain them together)
*
PUT200 EQU *
L R5,PTRBLK Get current blk # we need to wrt
BAL R14,GETBLK Allocate a new phys ptr block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,PTRBLK Save newly allocated blk #
ST R0,0(,R3) Insert ptr to next ptr blk in
* full ptr block
MVI 0(R3),X'FE' Indic "ptr to next ptr blk" and
* not ptr to a data block
LA R3,4(,R3) -> next write position
*
ST R5,KEY Prep for update of blk to write
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,PTRBUF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R0,PTRBUF -> ptr block area
LA R1,4089 Size of physical block
LR R3,R1 Compute length to write out
MVCL R0,R2 Clear the ptr block
MVC PTRPOS,PTRBUF Reset ptr position in new blk
B PUT020 Now retry to add next logical
* NJE00200
*
* NJE00920
******************** NJE00920
* * Read a logical record (not a physical block) NJE00920
* GET * NJE00920
* NCBREQ = X'04' * No ENQ is required when reading the physical NJE00920
* * blocks as these blocks are allocated exclusively NJE00920
******************** to the calling task. The file id to read must NJE00920
* be in NSID in the tag data pointed to by NCBTAG
* NJE00920
GET000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
TM NJFL1,NJF1PUT Processing PUTs against file?
BO ERR1205 Yes, cant do GET now
OI NJFL1,NJF1GET Indicate GET in progress
*
L R7,RPL -> RPL
NC PTRBLK,PTRBLK Do we have a ptr block in prog?
BNZ GET060 Yes, read next logical rec
*
LA R0,DIRLOC Locate file function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File id is in tag field TAGID
*
LTR R15,R15 Was file found?
BZ GET010 Yes
C R15,=F'12' Errors processing directory?
BL EXIT08 Exit here if 4 or 8=VSAM errors
B EXIT12 All others Exit12
*
GET010 EQU *
MODCB RPL=(R7), x
OPTCD=(KEY,DIR,MVE,NUP), No update needed on GETs x
MF=(G,MACLIST)
*
L R3,NCBTAG -> tag data
USING TAG,R3
MVC GETLIM,TAGRECNM Save off # of records in file
DROP R3
*
L R3,INITBLK Get 1st block # of file
*
GET020 EQU * ** Get a ptr block
ST R3,KEY Set block retrieval key
GET RPL=(R7) Get the ptr block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
ST R3,PTRBLK Save ptr blk #
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer containing repl dir
LR R15,R1 Copy length
MVCL R14,R0 Put ptr data in ptrbuf
*
L R4,PTRBUF -> ptr block ptrs
ST R4,PTRPOS Maintain ptr position
*
GET030 EQU *
C R4,PTRBUFEN Out of ptrs this block?
BL GET040 No
*
* ** Here if ptr block chains to
* another ptr block
CLI 0(R4),X'FE' ptr to ptrblk indicator?
BNE GET200 EOF No, done with ptrs
SR R3,R3 Clear for IC
ICM R3,7,1(R4) Get ptr to next ptr block
ST R3,KEY Set up for retrieval
B GET020 Go get it
*
GET040 EQU *
ICM R2,15,0(R4) Get a data block #
BZ GET200 EOF Done with ptrs
*
ST R2,KEY Set block retrieval key
GET RPL=(R7) Get the ptr block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R5,BLOCK -> VSAM i/o area
ST R5,GETPOS Maintain read position
*
GET060 EQU *
L R5,GETPOS -> next logical record to read
CLC 0(2,R5),=X'FFFF' Is this end of file?
BE GET200 Yes
CLC 0(2,R5),=X'FFFE' Skip to next ptr indication?
BE GET100 Yes
*
SR R14,R14 Clear for IC
ICM R14,3,0(R5) Get the record length
BCTR R14,0 Reduce length of length
BCTR R14,0 Reduce length of length
STH R14,NCBRECLN Return length to caller
*
L R15,NCBAREA -> to caller's record buffer
BCT R14,*+10 Adjust len for execute
GETREC MVC 0(0,R15),2(R5)
EX R14,GETREC Move record to user area
LA R5,1+2(R14,R5) Get record len + overhead
* +1 to get back true length
* +2 for length halfword itself
ST R5,GETPOS Save read position
L R1,GETCNT Get count of records read
LA R1,1(,R1) Bump it
ST R1,GETCNT Update count for debug purposes
B EXIT00 Exit with record in NCBAREA
*
GET100 EQU *
L R4,PTRPOS Get ptr position
LA R4,4(,R4) -> next ptr field
ST R4,PTRPOS Maintain ptr position
B GET030 Go process next ptr
*
GET200 EQU *
MVI NCBERRCD,X'04' Indicate EOF
B EXIT08
* NJE00920
* NJE00920
******************** NJE00920
* * Delete a file from the NETSPOOL dataset NJE00920
* PURGE * NJE00920
* NCBREQ = X'05' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
PUR000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
*
LA R0,DIRDEL Del file function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File to del is in NCB ???
LR R5,R15 Any RC to R5
B QUIT000
*
* NJE00920
******************** NJE00920
* * Locate a file in the directory by file id NJE00920
* LOCATE * NJE00920
* NCBREQ = X'06' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
FID000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
*
LA R0,DIRLOC Locate file function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File id is in tag field TAGID
LR R5,R15 Any RC to R5
B QUIT000
*
* NJE00920
******************** NJE00920
* * Return a list of files in NETSPOOL dataset NJE00920
* CONTENTS * NJE00920
* NCBREQ = X'07' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
CON000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
*
LA R0,DIRLST List files function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15
LR R5,R15 Any RC to R5
B QUIT000
*
* NJE00920
******************** NJE00920
* * Update a directory entry by file id v120 NJE00920
* UDIR * NJE00920
* NCBREQ = X'08' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
UDR000 EQU * v120
LA R14,* -> location of error source v120
TM NJFL1,NJF1OACB Is ACB open? v120
BZ ERR1202 No v120
* v120
LA R0,DIRUPD Update dir function v120
L R15,=A(NJEDIR) Call directory mgmt v120
BALR R14,R15 v120
LR R5,R15 Any RC to R5 v120
B QUIT000 v120
*
*
ERR1201 EQU * Invalid NCBREQ function code
MVI NCBERRCD,X'01' Set error code
B EXIT12
*
ERR1202 EQU * ACB is not open
MVI NCBERRCD,X'02' Set error code
B EXIT12
*
ERR1203 EQU * NETSPOOL dataset is full
MVI NCBERRCD,X'03' Set error code
B EXIT12
*
ERR1204 EQU * File # not found in directory
MVI NCBERRCD,X'04' Set error code
B EXIT12
*
ERR1205 EQU * GET attempted in PUT mode, or,
* PUT attempted in GET mode
MVI NCBERRCD,X'05' Set error code
B EXIT12
*
ERR1206 EQU * No files in directory (NCBCON)
MVI NCBERRCD,X'06' Set error code
B EXIT12
*
* NJE00200
* Exit points NJE00200
* NJE00200
* NJE00200
* NJE00200
EXIT00 EQU * NJE00210
SR R5,R5 Set RC=0
B QUIT000
*
* Exit04 reasons:
* All VSAM OPEN/CLOSE and RPL errors.
*
EXIT04 EQU * NJE00210
LA R5,4 Set RC=4
B QUIT000
*
* Exit08 reasons:
* All VSAM OPEN/CLOSE and RPL errors.
*
EXIT08 EQU * NJE00210
C R15,=F'4' Is is really RC 4?
BE EXIT04 Reflect the truth
LA R5,8 Set RC=8
B QUIT000
*
* Exit12 reasons:
* NETSPOOL dataset is full (no available blocks)
* NCBREQ contains invalid/unsupported function code
* File is not open
* File # is not found in directory
* GET issued during PUT activity
* PUT issued during GET activity
*
EXIT12 EQU * NJE00210
ST R14,NCBMACAD Save error address v110
LA R5,12 Set RC=12
B QUIT000
*
* Exit16 reasons:
* R1 = zero on entry
* R1 doesnt point to NCB ('NCB ' in 1st four bytes)
* NCBTKN is zero but NCBREQ is not NCBOPEN
* NCBTKN doesnt point to area containing 'NSPL'
*
EXIT16 EQU * NJE00210
L R13,4(,R13) -> caller's sa NJE00210
LA R5,16 Set RC=16
B QUIT090
*
QUIT000 EQU *
STC R5,NCBRTNCD Set R15 return code
BAL R14,DEQ000 Remove any ENQ
L R13,4(,R13) -> caller's sa NJE00210
CLC NCBREQ(3),=AL1(NCBGET,8,4) EOF on a NCBGET function?
BNE QUIT020 No
ICM R15,15,NCBEODAD Get EODAD address
BZ QUIT020 If none, let 8,4 rtn cd pass
ST R15,12(,R13) Set R14 return to EODAD address
XC NCBRTNCD(2),NCBRTNCD Remove EOF error indicators
SR R5,R5 Set RC=0
*
QUIT020 EQU *
CLI NCBREQ,NCBCLOSE Is this a close request?
BNE QUIT090 No. Exit without free stgs
*
LR R1,R10 -> NJEWK main work area page
FREEMAIN RU, x
LV=4096, x
A=(1)
*
QUIT090 EQU *
ST R5,16(,R13) Set RC in R15
LM R14,R12,12(R13) Reload callers's regs NJE00220
BR R14 Return NJE00240
* NJE00250
LTORG NJE00280
*
*
OPEN OPEN 0,MF=L
OPENL EQU *-OPEN
CLOSE CLOSE 0,MF=L
CLOSEL EQU *-CLOSE
*
*
DROP R12
*
* NJE00920
********************* NJE00920
* N J E C M N * NJECMN hosts small routines and NJE00920
* * frequently used constants NJE00920
* Common routines * NJE00920
* and constants * via base register 11 NJE00920
* * NJE00920
********************* NJE00920
* NJE00920
NJECMN CSECT NJE00020
DC A(0) No branch around constants
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECMN'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
USING NJECMN,R11
USING NJEWK,R10
*
*-- Check result of VSAM OPEN or CLOSE macro
*
CHKOC EQU *
LTR R15,R15 Did request succeed?
BZR R14 Yes return
ST R14,NCBMACAD Save addr of failing macro
STC R15,NCBRTNCD Set return code
MVC NCBERRCD,ACBERFLG-IFGACB(R7) error code
BR R14 Return with VSAM error
*
*-- Check result of VSAM RPL macros
*
CHKRPL EQU *
LTR R15,R15 Did request succeed?
BZR R14 Yes return
ST R14,NCBMACAD Save addr of failing macro
STC R15,NCBRTNCD Set return code
MVC NCBERRCD,RPLERRCD-IFGRPL(R7) error code
BR R14 Return with VSAM error
*
*
ENQ000 EQU *
TM NJFL1,NJF1ENQ Is ENQ active?
BOR R14 Return if so
*
ST R14,SV14 Save return addr
ENQ (NJE38Q,NJEDSN,E,44,SYSTEM), X
RET=NONE
*
OI NJFL1,NJF1ENQ ENQ active
L R14,SV14 Reload return addr
BR R14 Return
*
*
DEQ000 EQU *
TM NJFL1,NJF1ENQ Is ENQ active?
BZR R14 Return if not
*
ST R14,SV14 Save return addr
DEQ (NJE38Q,NJEDSN,44,SYSTEM), X
RET=NONE
NI NJFL1,255-NJF1ENQ ENQ off
L R14,SV14 Reload return addr
BR R14 Return
* NJE00200
* NJE00200
*-- ADDBLK / GETBLK routines NJE00200
* NJE00200
*-- Allocate a new physical block. Scan the allocation map for a free NJE00200
*-- block and mark it as taken, and return the new block number to the NJE00200
*-- caller.
*
*-- ADDBLK and GETBLK are functionally identical except that ADDBLK
*-- does not ENQ or DEQ on NETSPOOL; it is assumed that the caller
*-- already has done that (the DIR functions).
*
*-- Uses R14-R4,R7. R1-R4 are preserved across call
* NJE00200
*-- Entry: None NJE00200
* NJE00200
*-- Exit: R15 = 0 if ok, else RC from VSAM macro. NJE00200
* R0 = block # of new block. If R0=0, no blocks available. NJE00200
* NJE00200
ADDBLK EQU *
ST R14,SV14GB Save return addr
STM R1,R4,SVGB Save caller's regs
BAL R14,GETB000 Go allocate the block
LTR R15,R15 VSAM RC in R15, set CC
LR R0,R4 Return block # in R0
LM R1,R4,SVGB Load caller's regs
L R14,SV14GB Load return addr
BR R14 Return
* NJE00200
GETBLK EQU *
ST R14,SV14GB Save return addr
STM R1,R4,SVGB Save caller's regs
BAL R14,ENQ000 Get exclusive control
BAL R14,GETB000 Go allocate the block
LR R3,R15 Save R15 across DEQ
BAL R14,DEQ000 Release control
LTR R15,R3 Return VSAM RC in R15, set CC
LR R0,R4 Return block # in R0
LM R1,R4,SVGB Load caller's regs
L R14,SV14GB Load return addr
BR R14 Return
*
GETB000 EQU *
ST R14,SV14B0 Save return addr
LA R2,ALLOCNUM Get # of alloc map blocks
LA R3,ALLOCBLK Get 1st alloc map block #
LA R4,1 Starting relative block #
*
GETB010 EQU *
ST R3,KEY Set retrieval key
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ GETB090 Exit with VSAM error
*
L R14,BLOCK -> allocation map
LA R15,4089 # of entries in map
L R1,=X'FF000000' Set pad char=X'FF'
CLCL R14,R0 Look for a non-FF entry
BE GETB030 all FFs: We're full up in this block
*
LR R1,R14 Copy ptr to map byte
S R1,BLOCK Compute offset from start
SLL R1,3 Each map byte is 8 records
AR R4,R1 Adjust relative block number for
* byte position we located
ICM R1,8,0(R14) Get map byte with the free bit
LA R2,X'80' Create possible opposing bit
*
GETB020 EQU *
SR R0,R0 Clear for shift use
SLDL R0,1 Shift off one bit into R0
LTR R0,R0 Is this the zero bit?
BZ GETB040 Yes
SRL R2,1 Next opposing bit position
LA R4,1(,R4) Compute next rel blk #
B GETB020 Find that 0 bit
*
GETB030 EQU *
LA R4,4089(,R4) Incr starting relative block #
LA R3,1(,R3) Next map block key
BCT R2,GETB010 Read next map block
*
ENDREQ RPL=(R7) No update
SR R4,R4 Return no block #: ALL FULL
SR R15,R15 No VSAM errors
B GETB090 Done
*
SETMAP OI 0(R14),X'00' Executed instr
*
GETB040 EQU *
EX R2,SETMAP Set the bit in allocation map
*
PUT RPL=(R7) Update the allocation map
BAL R14,CHKRPL Deal with errors
*
GETB090 EQU *
L R14,SV14B0 Load return addr
BR R14 Return
*
*
LTORG
*
WTOMSG WTO ' x
',MF=L
WTOMSGL EQU *-WTOMSG
*
ENQ ENQ (0),MF=L
ENQL EQU *-ENQ
*
DEQ DEQ (0),MF=L
DEQL EQU *-DEQ
*
DS 0D
NJE38Q DC CL8'NJE38'
NJEDSN DC CL44'NJE38.NETSPOOL'
*
BLANKS DC CL120' '
NONBLANK DC 64X'FF',X'00',191X'FF' TR Table to locate nonblank
BLANK DC 64X'00',X'FF',100X'00' TR Table to locate blanks
TRTAB$ DC 91X'00',X'FF',164X'00' TR Table to locate '$'
HEXTRAN DC CL16'0123456789ABCDEF' Translate table
* NJE00920
* NJE00920
********************* NJE00920
* * NJE00920
* N J E D I R * NJE00920
* * NJE00920
* Directory * NJE00920
* Management * NJE00920
* * NJE00920
********************* NJE00920
* NJE00920
*
NJEDIR CSECT NJE00020
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDIR'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
STM R14,R12,12(R13) SAVE CMS REGS NJE00050
LR R12,R15 BASE NJE00060
USING NJEDIR,R12 ADDRESS IT NJE00070
USING NJEWK,R10
USING NCB,R9
*
ST R13,NJEDIRSA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJEDIRSA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
L R11,=A(NJECMN) -> common csect
ST R11,ANJECMN Save addr
USING NJECMN,R11
*
DIRADD EQU 0 Add new file to directory
DIRDEL EQU 4 Purge a file from directory
DIRLOC EQU 8 Locate a file by ID
DIRLST EQU 12 List directory contents
DIRUPD EQU 16 Update directory entry v120
*
LR R2,R0 Copy entry code
B *+4(R2) Branch into branch table
B ADD000 0 Add a new directory entry
B DEL000 4 Delete a directory entry
B LOC000 8 Locate a file by ID
B LST000 C List directory contents
B UPD000 10 Update directory entry v120
*
ADD000 EQU *
LA R0,(10000/8)+1 Byte size of 10,000 bits
ST R0,SPLIDLEN Save the length
GETMAIN RU, Get stg for spool id bitmap x
LV=(0)
ST R1,SPLIDMAP Save stg addr
LR R0,R1 Copy starting addr
L R1,SPLIDLEN Get the length
SR R15,R15 Set pad char
MVCL R0,R14 Initialize the map
*
BAL R14,ENQ000 Get exclusivity
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
MVC SPLID,SPLNUM Save the last assigned id #
L R2,DIRBLK Get blk# of current directory
DROP R2
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
*
*-- R2 = starting block number of current directory
*-- R3 = starting block number of replacement directory
*
*
ST R2,KEY Get a current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
ST R3,KEY Get a replacement dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
*-- Copy all of the directory entries in the current directory over
*-- to the (new) replacement directory (where we will eventually add
*-- a new directory entry). Along the way, build a bit map of all
*-- of the spool file numbers that are in use (they're in the
*-- directory entries) so that we can assign a new unique file # to
*-- the new file in its new directory entry.
*
L R4,BUFF -> current directory
L R5,BLOCK -> replacement directory
L R8,NSRECNM-NSDIR(,R4) Get # directory entries current
LA R1,1(,R8) +1 for new dir ent to be added
ST R1,NSRECNM-NSDIR(,R4) Store (will get copied to repl)
ST R3,NSBLK-NSDIR(,R4) Store starting blk of dir (will
* get copied to replacement dir)
*
ADD050 EQU *
CLC NSLEN-NSDIR(,R4),=X'FFFE' Ptr to next block?
BE ADD100 yes
MVC 0(NSDIRLN,R5),0(R4) Copy existing dir entry to repl
*
LH R7,NSID-NSDIR(,R4) Get file id # for this file
SR R6,R6 Clear for divide
D R6,=F'8' Get byte offset remainder bits
*
A R7,SPLIDMAP -> byte containing bit for
* this file #
LA R1,X'80' Create a bit
SRL R1,0(R6) Adjust to bit for this file #
EX R1,SPLSET Set the bit in the spool id map
*
LA R4,NSDIRLN(,R4) -> next current dir entry
LA R5,NSDIRLN(,R5) -> next replacement dir entry
BCT R8,ADD050 Keep copying dir entries
B ADD200 Go add the new dir entry
*
SPLSET OI 0(R7),X'00' Executed instr
*
*
*-- Here if the directory continues onto another block. Get these
*-- blocks, and continue processing individual entries.
*
ADD100 EQU *
L R7,RPL -> RPL
PUT RPL=(R7) Update the replacement block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
CLC NSLEN-NSDIR(,R5),=X'FFFE' Repl dir ptr to next block?
BNE ADD190 No; we need to add a block
*
ADD120 EQU *
ICM R2,15,2(R4) Get ptr to next current dir blk
ICM R3,15,2(R5) Get ptr to next repl dir blk
*
ST R2,KEY Get next current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
ST R3,KEY Get next replacement dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R4,BUFF -> current directory
L R5,BLOCK -> replacement directory
B ADD050 Continue processing
*
ADD190 EQU *
L R3,KEY Get current blk # we just wrote
*
BAL R14,ADDBLK Allocate a new physical block
BNZ ADD900 Exit with VSAM error
LTR R6,R0 Is there a block number?
BZ ADD910 No, NETSPOOL dataset full v130
*
ST R3,KEY Gotta update blk again with ptr
GET RPL=(R7) Get the physical block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
MVC 0(2,R5),=X'FFFE' Insert ptr indic for next blk
STCM R6,15,2(R5) Insert next block #
B ADD100 Now go jump to next dir blks
*
*-- Here when all current directory entries have been copied to the
*-- new (replacement) directory. Add the new directory entry for
*-- the file just written out via PUT actions.
*
ADD200 EQU *
L R1,BLOCKEND -> end of buffer
SR R1,R5 Determine remaining space in blk
LA R4,NSDIRLN Get size of directory entry
LA R4,2+4(,R4) Add in overhead
* +2 for n block marker
* +4 for next block ptr
CR R1,R4 Is there room to add entry?
BL ADD300 No, better get another block
*
USING NSDIR,R5
XC NSDIR(NSDIRLN),NSDIR Init new entry
MVC NSLEN,=Y(NSDIRLN) Set entry length
MVC NSBLK,INITBLK Set starting blk# of the file
L R6,NCBTAG -> TAG block for file
USING TAG,R6
MVC NSINLOC(TAGUSELN),TAGINLOC Tag data to dir entry
*
L R1,SPLID Get last assigned file id #
L R0,=F'10000' 10,000 possible spool ids
*
ADD250 EQU *
LA R15,1(,R1) Choose next number
C R15,=F'10000' At the limit?
BL *+8 No
LA R15,1 Reset to 1
LR R1,R15 Save next possible number
*
SR R14,R14 Clear for divide
D R14,=F'8' Get byte offset remainder bits
*
A R15,SPLIDMAP -> byte containing bit for
* this spool id #
LA R7,X'80' Create a bit
SRL R7,0(R14) Adjust to bit for this id #
EX R7,TMBIT Check bit status in the bitmap
BZ ADD260 Spool id not in use. take it
BCT R0,ADD250 Else try next number
SR R1,R1 Otherwise use id=0000
B ADD260
*
TMBIT TM 0(R15),X'00' Executed instr
*
*
*
ADD260 EQU *
ST R1,SPLID Save newly assigned spool id
STCM R1,3,NSID Assign the file id # to file
STCM R1,3,NCBFID Also put it in the NCB
STCM R1,3,TAGID Also, put it in the tag data
DROP R5,R6 NSDIR,TAG
*
LA R4,NSDIRLN(,R5) Skip past entry just added
L R5,BLOCKEND -> end of block
SR R5,R4 Compute length remaining in blk
SR R15,R15 Set pad
MVCL R4,R14 Clear to end of block
*
L R7,RPL -> RPL
PUT RPL=(R7) Update final replacement block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
*-- Now update block 1 to activate the replacement directory
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R1,BLOCK -> blk #1 in stg
USING BLKONE,R1
L R2,DIRBLK Get blk# of current directory
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
ST R3,DIRBLK Plug in alternate
MVC SPLNUM,SPLID Save last assigned spool id
DROP R1
*
L R7,RPL -> RPL
PUT RPL=(R7) Update block 1
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
B XITDIR Exit with RC=0
*
*-- Here if there is no room in a directory block to add the new
*-- file's directory entry. An additional block will be allocated and
*-- chained to the directory entries.
*
ADD300 EQU *
L R7,RPL -> RPL
PUT RPL=(R7) Write back the dir block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
L R4,KEY Get current blk # we just wrote
*
BAL R14,ADDBLK Allocate a new physical block
BNZ ADD900 Exit with VSAM error
LTR R6,R0 Is there a block number?
BZ ADD910 No, NETSPOOL dataset full v130
*
ST R4,KEY Gotta update blk again with ptr
GET RPL=(R7) Get the physical block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
MVC 0(2,R5),=X'FFFE' Insert ptr indic for next blk
STCM R6,15,2(R5) Insert next block #
*
L R7,RPL -> RPL
PUT RPL=(R7) Write back the dir block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
ST R6,KEY Now point to newly obtained blk
GET RPL=(R7) Get the physical block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
SR R3,R3 Pad
MVCL R0,R2 Clear it
*
L R5,BLOCK -> new block stg
B ADD200 Try again to add new dir entry
*
ADD900 EQU * VSAM Error return
* Error codes in NCB already
B XITDIR Exit with RC in R15
*
ADD910 EQU * No space in NETSPOOL
MVC NCBRTNCD(2),=X'0C03' Set to 12,3 code
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
LA R15,12 Set RC
B XITDIR Return that notice
*
*
*
*
*
DEL000 EQU *
GETMAIN RU, Get stg for alloc bitmap x
LV=16384
STM R0,R1,SPLIDLEN Save len,addr
*
L R7,RPL -> RPL
MODCB RPL=(R7), x
OPTCD=(KEY,DIR,MVE,UPD), Update mode x
MF=(G,MACLIST)
*
BAL R14,ENQ000 Get exclusivity
*
LA R2,ALLOCNUM Get # of alloc map blocks
LA R3,ALLOCBLK Get 1st alloc map block #
L R4,SPLIDMAP -> receiving stg area
*
DEL020 EQU *
ST R3,KEY Set retrieval key
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R14,BLOCK -> block just read
LA R15,4089 # of bytes in block
LR R5,R15 Copy len
MVCL R4,R14 Move alloc bitmap to stg area
*
LA R3,1(,R3) Next block number of alloc map
BCT R2,DEL020 Go read them all
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
L R2,DIRBLK Get blk# of current directory
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
DROP R2
*
*-- R2 = starting block number of current directory
*-- R3 = starting block number of replacement directory
*
*
ST R2,KEY Get a current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
ST R3,KEY Get a replacement dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
*-- Current directory is in BUFF
*-- Replacement directory will be in PTRBUF
*
*
*-- Copy all of the directory entries in the current directory over
*-- to the (new) replacement directory (where we will eventually delete
*-- a directory entry). Along the way, look for the entry to be
*-- purged.
*
L R4,BUFF -> current directory
L R5,PTRBUF -> replacement directory
L R8,NSRECNM-NSDIR(,R4) Get # directory entries current
LR R1,R8 Copy count
BCTR R1,0 Reduce for to-be-deleted file
ST R1,NSRECNM-NSDIR(,R4) Store (will get copied to repl)
ST R3,NSBLK-NSDIR(,R4) Store starting blk of dir (will
* get copied to replacement dir)
L R6,NCBTAG -> TAG data
LH R6,TAGID-TAG(,R6) Get file id number
XC INITBLK,INITBLK Clear file's starting blk #
*
DEL050 EQU *
CLC NSLEN-NSDIR(,R4),=X'FFFE' Ptr to next block?
BE DEL100 yes
CH R6,NSID-NSDIR(,R4) Is this the file to be purged?
BE DEL070
CLC NSLEN-NSDIR(,R5),=X'FFFE' Ptr to next block?
BE DEL120 yes
MVC 0(NSDIRLN,R5),0(R4) Copy existing dir entry to repl
LA R5,NSDIRLN(,R5) -> next replacement dir entry
*
DEL060 EQU *
LA R4,NSDIRLN(,R4) -> next current dir entry
BCT R8,DEL050 Keep copying dir entries
B DEL200 Done with copy
*
DEL070 EQU *
MVC INITBLK,NSBLK-NSDIR(R4) Save starting block # of file
B DEL060 Continue copy
*
*
*-- Get next current dir block (move it to BUFF)
*
DEL100 EQU *
ICM R2,15,2(R4) Get ptr to next current dir blk
*
ST R2,KEY Get next current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
L R4,BUFF -> current directory
B DEL050 Continue with copy
*
*-- Get next replacement dir block
*-- 1. Write back the replacement we've been copying to (from PTRBUF)
*-- 2. Get next block
*-- 3. Move it to PTFBUF
*
DEL120 EQU *
ST R3,KEY Set blk# of repl dir block
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer containing repl dir
LR R15,R1 Copy length
MVCL R0,R14 Move data to i/o buffer
*
L R7,RPL -> RPL
PUT RPL=(R7) Update the replacement block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
ICM R3,15,2(R5) Get ptr to next current dir blk
*
ST R3,KEY Get next current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
L R5,PTRBUF -> replacement directory
B DEL050 Continue with copy
*
*-- Fix up the last replacement dir block
*
DEL200 EQU *
L R1,PTRBUF -> start of buffer
LA R15,4088(,R1) -> end of that buffer - 1
*
DEL210 EQU *
CR R1,R15 Past end of buffer?
BH DEL230 Y, done searching
CLC 0(2,R1),=X'FFFE' Left over pointer indicator?
BE DEL220 Yes
LA R1,NSDIRLN(,R1) Next dir entry position
B DEL210
*
DEL220 EQU *
ICM R7,15,2(R1) Pick up the left over block #
BAL R14,FREBLK Go free the block in R7
*
DEL230 EQU *
LR R0,R5 -> end of used part of ptrbuf
L R1,PTRBUF -> start of buffer
LA R1,4089(,R1) -> end of that buffer
SR R1,R5 Compute length to clear
SR R15,R15 Compute length to write out
MVCL R0,R14 Clear to end of block
*
ST R3,KEY Set blk# of repl dir block
L R7,RPL -> RPL
GET RPL=(R7) Re-get for update
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer containing repl dir
LR R15,R1 Copy length
MVCL R0,R14 Move repl data to i/o buffer
*
PUT RPL=(R7) Update the last repl block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
*-- DEL300 is used to free all of the blocks used by the file itself
*
DEL300 EQU *
ICM R7,15,INITBLK Get 1st block # of deleted file
BZ DEL910 If 0, file # wasn't found
*
DEL310 EQU *
ST R7,KEY Set block retreival key
BAL R14,FREBLK Mark the block as free in bitmap
*
L R7,RPL -> RPL
GET RPL=(R7) Get the ptr block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R4,BLOCK -> ptr block ptrs
LA R5,4084(,R4) -> end of ptr block ptrs
*
DEL330 EQU *
ICM R7,15,0(R4) Get a block #
BZ DEL350 Done with ptrs
BAL R14,FREBLK Free the block
LA R4,4(,R4) -> next ptr field
CR R4,R5 At end of ptr block?
BL DEL330
* ** Here if ptr block chains to
* another ptr block
CLI 0(R4),X'FE' Ptr to ptr blk indicator?
BNE DEL350 No, we've processed last ptr
SR R7,R7 Clear for IC
ICM R7,7,1(R4) Get ptr to next ptr block
B DEL310
*
*-- Write back the allocation map
*
DEL350 EQU *
LA R2,ALLOCNUM Get # of alloc map blocks
LA R3,ALLOCBLK Get 1st alloc map block #
L R4,SPLIDMAP -> map stg area
*
DEL360 EQU *
ST R3,KEY Set retrieval key
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R14,BLOCK -> block just read
LA R15,4089 # of bytes in block
LR R5,R15 Copy len
MVCL R14,R4 Move alloc bitmap to i/o buffer
*
PUT RPL=(R7) Put the map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
LA R3,1(,R3) Next block number of alloc map
BCT R2,DEL360 Go read them all
*
*-- Now update block 1 to activate the replacement directory
*
DEL400 EQU *
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R1,BLOCK -> blk #1 in stg
USING BLKONE,R1
L R2,DIRBLK Get blk# of current directory
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
ST R3,DIRBLK Plug in alternate
DROP R1
*
L R7,RPL -> RPL
PUT RPL=(R7) Update block 1
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
B XITDIR Exit with RC=0
*
DEL900 EQU * VSAM Error return
* Error codes in NCB already
B XITDIR Exit with RC in R15
*
DEL910 EQU * ** Here if directry entry not found
MVC NCBRTNCD(2),=X'0C04' Set to 12,4 code
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
LA R15,12 Set RC
B XITDIR Exit with RC in R15
*
*-- Free a block (mark it available in the allocation bitmap)
*
*-- Entry: R7 = block #
*
FREBLK EQU *
BCTR R7,0 Make blk # relative to 0
SR R6,R6 Clear for divide
D R6,=F'8' Get byte offset remainder bits
*
A R7,SPLIDMAP -> byte containing bit for
* this block
LA R1,X'80' Create a bit
SRL R1,0(R6) Adjust to bit for this blk #
LA R0,X'FF' Create AND mask
XR R1,R0 Compute mask to turn a bit off
EX R1,FREBIT Turn off the bit in the bitmap
BR R14 Return
*
FREBIT NI 0(R7),X'00' Executed instr
*
*
*
* LOC000 - FIND a file by id in the directory. v120
* UPD000 - UDIR update a directory entry for a specific file. v120
*
*
*-- UDIR functionality only updates the destination node id and v120
*-- destination user id within the directory entry from v120
*-- the TAG data supplied by the caller. No other directory v120
*-- fields are altered. v120
*
*
LOC000 EQU *
UPD000 EQU * v120
BAL R14,ENQ000 Get exclusivity
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ LOC900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
L R2,DIRBLK Get blk# of current directory
DROP R2
*
*
ST R2,KEY Get a current dir block
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LOC900 Exit with VSAM error
*
*
L R4,BLOCK -> current directory
USING NSDIR,R4
L R8,NSRECNM Get # directory entries current
*
L R6,NCBTAG -> TAG data
USING TAG,R6
XC INITBLK,INITBLK Clear file's starting blk #
*
LOC050 EQU *
CLC NSLEN,=X'FFFE' Ptr to next block?
BNE LOC060 No
*
ICM R2,15,2(R4) Get ptr to next current dir blk
ST R2,KEY Get next current dir block
*
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LOC900 Exit with VSAM error
L R4,BLOCK -> next directory block
*
LOC060 EQU *
CLC TAGID,NSID Is this the file we need?
BE LOC070
*
LA R4,NSDIRLN(,R4) -> next current dir entry
BCT R8,LOC050 Keep looking
B LOC100 Done with search
*
LOC070 EQU *
CLI NCBREQ,NCBUDIR Is this UDIR function? v120
BE UPD100 Yes v120
*
MVC INITBLK,NSBLK Save starting block # of file
MVC TAGINLOC(TAGUSELN),NSINLOC Return the tag data to callr
*
*
LOC100 EQU *
ENDREQ RPL=(R7) Release the get-for-update
*
NC INITBLK,INITBLK Did we find a file?
BZ LOC910 No, exit with not found error
SR R15,R15 Set RC to 0
B XITDIR
*
*
UPD100 EQU * v120
MVC NSTOLOC,TAGTOLOC Update destination node id v120
MVC NSTOVM,TAGTOVM Update destination user id v120
MVC TAGINLOC(TAGUSELN),NSINLOC Rtrn tag data to caller v120
MVC INITBLK,NSBLK Save file's startinblock # v120
*
PUT RPL=(R7) Update the directory v120
BAL R14,CHKRPL Deal with errors v120
BNZ LOC900 Exit if VSAM error v120
B XITDIR
*
DROP R6 TAG v120
DROP R4 NSDIR v120
*
*
LOC900 EQU * VSAM Error return
* Error codes in NCB already
B XITDIR Exit with RC in R15
*
LOC910 EQU * ** Here if directry entry not found
MVC NCBRTNCD(2),=X'0C04' Set to 12,4 code
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
LA R15,12 Set RC
B XITDIR Exit with RC in R15
*
*
*
*
*
LST000 EQU *
XC LISTLEN,LISTLEN Ensure no stray len
XC LISTADDR,LISTADDR Ensure no stray address
BAL R14,ENQ000 Get exclusivity
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ LST900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
L R3,ALMBLK Get blk# of alloc map v200
L R8,MAXBLK Get blk# in dataset v200
L R2,DIRBLK Get blk# of current directory
DROP R2
*
*-- Compute spool percentage full from alloc map v200
*
SR R5,R5 Init blks used counter v200
LR R6,R8 Copy max blocks in dataset v200
SRL R6,3 divide by 8 # map bytes represent'g blksv200
*
LST010 EQU * v200
ST R3,KEY Get a block of map v200
L R7,RPL -> RPL v200
GET RPL=(R7) Get a map block v200
BAL R14,CHKRPL Deal with errors v200
BNZ LST900 Exit with VSAM error v200
* v200
SR R0,R0 Clear for IC work v200
L R15,BLOCK -> record v200
LA R14,4089 # bytes to process v200
*
LST020 EQU * v200
CLI 0(R15),X'00' Map byte unallocated? v200
BE LST050 Dont count any v200
CLI 0(R15),X'FF' Map byte fully allocated? v200
BE LST060 Yes, count 8 blocks v200
LA R4,8 # bits in a byte v200
IC R0,0(,R15) Get a map byte v200
*
LST030 EQU * v200
SR R1,R1 Clear for shift v200
SRDL R0,1 Move a bit into R1 v200
LTR R1,R1 Was the bit=1? v200
BZ LST040 No, dont count it v200
LA R5,1(,R5) Count the block bit v200
*
LST040 EQU * v200
BCT R4,LST030 Scan whole byte v200
*
LST050 EQU * v200
BCT R6,LST070 # map bytes remaining to scnv200
B LST080 Done counting v200
*
LST060 EQU * v200
LA R5,8(,R5) All 8 blocks allocated v200
B LST050 Decr remaining and continue v200
*
LST070 EQU * v200
LA R15,1(,R15) -> next map byte v200
BCT R14,LST020 Keep scanning v200
LA R3,1(,R3) Bump alloc map block number v200
B LST010 Get another map block v200
*
LST080 EQU * v200
MH R5,=Y(100) Blocks used: prep for % calcv200
SR R4,R4 Clear for divide v200
DR R4,R8 Compute % full v200
AR R4,R4 Double remainder v200
CR R4,R8 Do we need to round up? v200
BL LST090 No v200
LA R5,1(,R5) Round up percent full v200
*
LST090 EQU * v200
STH R5,NCBPCT Return % full in NCB v200
*
*-- Retrieve directory contents v200
*
LST100 EQU *
ST R2,KEY Get a current dir block
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LST900 Exit with VSAM error
*
*
L R4,BLOCK -> current directory
USING NSDIR,R4
L R8,NSRECNM Get # directory entries
BCTR R8,0 Less 1 for directory itself
STCM R8,3,NCBRECCT Set entries count in NCB
LTR R8,R8 Were there any entries?
BZ LST910 No
SR R0,R0 Clear for multiply
LA R1,NSDIRLN Length of directory entry
MR R0,R8 Compute size of area needed
LR R0,R1 Copy size to r0
GETMAIN RU, Get stg area to hold entries x
LV=(0)
STM R0,R1,LISTLEN
LR R5,R1 -> where to place entries
LA R4,NSDIRLN(,R4) Skip over directory's own entry
*
*
LST150 EQU * v200
CLC NSLEN,=X'FFFE' Ptr to next block?
BNE LST160 No v200
*
ICM R2,15,2(R4) Get ptr to next current dir blk
ST R2,KEY Get next current dir block
*
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LST900 Exit with VSAM error
L R4,BLOCK -> next directory block
*
LST160 EQU * v200
MVC 0(NSDIRLN,R5),0(R4) Move directory entry to stg area
LA R4,NSDIRLN(,R4) -> next dir entry
LA R5,NSDIRLN(,R5) -> next stg area slot
BCT R8,LST150 Keep loading v200
*
DROP R4 NSDIR
*
*
LST200 EQU * v200
ENDREQ RPL=(R7) Release the get-for-update
*
MVC NCBAREA,LISTADDR Return list stg addr
MVC NCBAREAL,LISTLEN Return list stg len
MVC NCBRECLN,=Y(NSDIRLN) Return size of each dir entry
SR R15,R15 Set RC to 0
B XITDIR
*
*
LST900 EQU * VSAM Error return
* Error codes in NCB already
LM R0,R1,LISTLEN Get stg area len, addr
LTR R0,R0 Is there an area?
BZ XITDIR No
FREEMAIN RU,LV=(0),A=(1) Else free it
SR R15,R15 Clear for RC
IC R15,NCBRTNCD Reinsert RC
B XITDIR Exit with RC in R15
*
LST910 EQU * ** Here if no files queued
ENDREQ RPL=(R7) Release the get-for-update v130
XC NCBAREA,NCBAREA No directory list obtained v110
MVC NCBRTNCD(2),=X'0C06' Set to 12,6 code
LA R15,12 Set RC
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
B XITDIR Exit with RC in R15
*
*
XITDIR EQU *
LR R5,R15 Any RC value to R5
BAL R14,DEQ000 Release the ENQ
*
ICM R1,15,SPLIDMAP Get spool id bitmap stg addr
BZ XITDIR10 Don't have a map
L R0,SPLIDLEN Size of bitmap
FREEMAIN RU,LV=(0),A=(1) Free the bitmap
XC SPLIDMAP,SPLIDMAP Clear unsed ptr
*
XITDIR10 EQU *
L R13,4(,R13) -> caller's sa NJE00210
*
ST R5,16(,R13) Set RC in R15
LM R14,R12,12(R13) Reload callers's regs NJE00220
BR R14 Return NJE00240
* NJE00290
LTORG
DROP R12
* NJE00290
**** Main work area common NJE00290
**** to all NJExxx CSECTs. NJE00290
* NJE00290
NJEWK DSECT
NJEEYE DS CL4'NSPL' Eyecatcher
NJEWKLEN DS F Getmain size of this area
NSOWN DS A -> TCB of caller
ANJECMN DS A -> NJECNM common csect NJE00320
*
DBLE DS D Work area NJE00310
TWRK DS 2D Work area
*
MACLIST DS XL160 Macro expansion area
*
SV14 DS A R14 save area
SV14GB DS A R14 save area
SV14B0 DS A R14 save area
SVGB DS 4F R1-R4 save area
SPLIDLEN DS F Length of spool id bitmap stg
SPLIDMAP DS A -> Spool file id bitmap
SPLID DS F Last assigned spool id number
LISTLEN DS F Length of contents stg area
LISTADDR DS A -> directory contents stg area
*
BLOCK DS A -> buffer for NETSPOOL VSAM i/o
BLOCKEND DS A -> end of BLOCK (BLOCK+4089)
PTRBUF DS A -> buffer for NJESPOOL ptr use
PTRBUFEN DS A -> end of PTRBUF (PTRBUF+4089)
BUFF DS A -> buffer for NJESPOOL use
BUFFEND DS A -> end of BUFF (BUFF+4089)
*
*
INITBLK DS F Blk # of first block to be written
* for a new file
PTRBLK DS F Blk # of current phys record for
* pointer block (NCBGET/NCTPUT)
NEWBLK DS F Blk # of current phys record for
* logical i/o (NCBGET/NCTPUT)
PUTPOS DS A Current write position in BUFF (next
* available write position)
GETPOS DS A Current read position in BLOCK (next
* available read position)
PTRPOS DS A Current write position in PTRBUF
* (next available write position)
PUTCNT DS F Number of logical records written
GETCNT DS F Number of logical records read
GETLIM DS F Max logical records in GET file
*
KEY DS F Relative block number key
ACBL DS F ACB length
ACB DS A -> ACB
RPLL DS F RPL length
RPL DS A -> RPL
*
NJFL1 DS X Flag bits
NJF1OACB EQU X'80' 1... .... NETSPOOL ACB is open
NJF1ENQ EQU X'40' .1.. .... Exclusive control of NETSPOOL
NJF1WPND EQU X'20' ..1. .... Physical write is pending
NJF1DPND EQU X'10' ...1 .... Directory add is pending
NJF1PUT EQU X'02' .... ..1. Processing PUTs to file
NJF1GET EQU X'01' .... ...1 Processing GETs from file
* .... xx.. Available
*
NJFL2 DS X Flag bits
NJFL3 DS X Flag bits
NJFL4 DS X Flag bits
*
*
*
*
NJESA DS 18F NJESPOOL OS save area NJE00300
NJEDIRSA DS 18F NJEDIR OS save area NJE00300
*
DS 0D Force doubleword size
NJEWKSZ EQU *-NJEWK
* NJE00930
*
BLKONE DSECT ** Maps block #1 in NETSPOOL
DIRBLK DS F Block number of current directry
ALMBLK DS F Block number of allocation map
MAXBLK DS F Highest block number in NETSPOOL
SPLNUM DS F Last assigned spool file #
BLKONESZ EQU *-BLKONE Size of dsect
* NJE00930
*
TYPPRT EQU X'40' PRT dev
TYPPUN EQU X'80' PUN dev
COPY NETSPOOL
COPY TAG
*
IFGACB
IFGRPL
*
END NJESPOOL NJE01000
./ ADD NAME=NJEINIT
*
*
*-- NJE38 - Initialization and start up
*
*
*
* Change log:
*
*
* 03 Mar 22 - Avoid 0C4 if no links in CONFIG, APF check, F NJE. v230
* 10 Dec 20 - Support for registered users and message queuing v220
* 04 Dec 20 - Expanded internal trace table support v212
* 29 Nov 20 - Use text-based configuration; alternate routes v211
* 02 Oct 20 - Use actual length for MGCR SEND cmds v210
* 01 Oct 20 - Put ENQ existence check in common module v210
* 10 Aug 20 - Use single NJESPOOL load for all STC NJE38 modules. v210
* 22 Jul 20 - Make non-swappable to eliminate long-wait delays v200
* 21 Jul 20 - Slightly delay auto-start of links on start-up. v200
* 02 Jul 20 - Default userid to CSA in support of TRANSMIT/RECEOVE v200
* 20 May 20 - Dont pass new file WREs for local node to cmd proc'g v120
* 05 May 20 - Abend SD23 if SVC 34 parmlist >=130 bytes. v102
* 04 May 20 - Show CONFIG assembly date and time on start up. v102
*
*
*
*
*
*
PRINT GEN
REGEQU REGISTER EQUATES
GBLC &VERS
*
* User abend codes
* U0038 - Unsupported/unrecognized CIB
* U0039 - VSAM error on NETSPOOL
*
* MSG numbers used:
*
* 0-34 used
* 35 - 39 available
* 42-79 used
* 163 used
*
*-- Program limits
*
TRACESZ EQU 64 Size in K of trace table v212
RQELIM EQU 256 # of preallocated RQEs
*
*
NJEINIT CSECT
NJEVER
STM R14,R12,12(R13) SAVE CMS REGS
LR R12,R15 BASE
USING NJEINIT,R12 ADDRESS IT
*
GETMAIN RU, Get local stg area X
LV=4096, X
BNDRY=PAGE
LR R10,R1
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the page
*
USING NJEMWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC NJEEYE,=CL4'NJEM' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
*
L R11,=A(NJECOM) -> common csect
USING NJECOM,R11
ST R11,ANJECOM Save in main work area
MVC CMDBLNK,BLANKS Init field
MVC RELAYID,=CL8'RELAY' Set RELAY entity id v220
LA R1,LINKS -> LINKTABL anchor word v211
ST R1,ALINKS Plug it into param list v211
LA R1,ROUTES -> RTE anchor word v211
ST R1,AROUTES Plug it into param list v211
LA R1,AUTHS -> AUTHLIST anchor word v211
ST R1,AAUTHS Plug it into param list v211
LA R1,REGUSER -> REGUSER anchor word v220
ST R1,AREGUSER Plug it into param list v220
*
INIT000 EQU * v200
SR R1,R1 Dont return spool DSN v210
L R15,=V(NJESYS) -> ENQ finder v210
BALR R14,R15 Check if NJE38 already act v210
LTR R15,R15 Look for RC=0=ENQ was found v210
BZ ERR999 Branch if NJE38 active v210
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE000I),NJE000I NJE38 v xx.xx
WTO ,MF=(E,MACLIST)
*
TESTAUTH FCTN=1 Are we authorized on entry? v230
LTR R15,R15 Check result v230
BZ INIT005 Branch if authorized v230
WTO 'NJE034I NJE38 is not APF-authorized' v230
B QUIT000 v230
*
INIT005 EQU * v230
SR R1,R1 v200
SYSEVENT TRANSWAP v200
CLM R1,1,=X'00' SYSEVENT RC=0? v200
BE INIT010 Yes v200
WTO 'NJE032I NJE38 could not enter non-swappable state' v200
B INIT020 v200
*
INIT010 EQU * v200
WTO 'NJE031I NJE38 is non-swappable' v200
*
INIT020 EQU * v200
MVC MACLIST(ESTAEL),ESTAE Move ESTAE parm list
L R6,=A(NJEDMP) Point to local ESTAE rtn
ESTAE (R6), Issue ESTAE X
CT, X
TERM=YES, X
PARAM=(R10), PARAM is work area address X
MF=(E,MACLIST)
*
*-- Scan the configuration and build control blocks
*
MODESET MODE=SUP
SR R0,R0 R0=0 scan entire configuration
LA R1,INITPARM -> parm list to pass to NJESCN
L R15,=V(NJESCN)
BALR R14,R15
LTR R15,R15
BNZ QUIT000
*
L R1,LINKS Get LINKTABL anchor v210
USING LINKTABL,R1
MVC LCLNODE,LINKID Set LCLNODE in param list v210
DROP R1
*
*-- Issue STIMER for keep alive to avoid S 522 abends
*
L R0,=A(NJETMR) -> Timer expiration exit
L R1,=A(INTVL) -> interval
STIMER REAL, Set timer X
(0), X
DINTVL=(1)
*
LOAD EP=NJESPOOL Load spool interface v210
ST R0,ANJESPL Store entry addr v210
*
LOAD EP=NJECMX Load command processor
ST R0,ANJECMX Store entry addr of processor
*
BAL R14,NET000 Check NETSPOOL status
BNZ QUIT000 Exit if NETSPOOL is not ready
*
INIT030 EQU *
MODESET MODE=SUP,KEY=ZERO
L R1,PSATOLD-PSA(0) v230
L R1,TCBJSCB-TCB(,R1) v230
L R1,JSCBCSCB-IEZJSCB(,R1) v230
USING CSCB,R1 v230
MVC CHUNIT(3),=C'NJE' v230
DROP R1 v230
*
STIDP CPUID Get the CPU ID
*
GETMAIN RU, Get CSA communication area x
LV=NJ38CSAZ, x
SP=241
*
ST R1,CSABLK Save addr of CSA stg area
USING NJ38CSA,R1
XC 0(NJ38CSAZ,R1),0(R1) Clear area
MVC NJ38NODE,LCLNODE Local node name to CSA
MVC NJ38DUSR,DEFUSER Default userid to CSA v200
MVC NJ38ASCB,PSAAOLD-PSA(0) Move ASCB addr of this space
LA R2,NJ38ECB -> cross memory ECB
ST R2,CSAECBAD Save address locally
DROP R1 NJ38CSA
*
SPKA X'80' Back to user key
*
MVC NJERNAME(8),NJERCON Set rname constant
MVC NJERNAME+8(4),CSABLK CSA stg addr to Rname
* JFCB DSN should already be here
LA R5,NJERNAME
MVC MACLIST(ENQL),ENQ Move macro model
*
ENQ (NJE38Q,(5),E,56,SYSTEM), x
RET=NONE, x
MF=(E,MACLIST)
OI NJFL1,NJF1ENQ Set NJE38 ENQ active
*
GETMAIN RU, Preallocate RQE storage x
LV=RQESZ*RQELIM
ST R1,ARQESTG Save the address
LR R2,R1 Copy length
LR R1,R0 Copy length
LR R0,R2 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the stg
LA R0,RQELIM Get RQE limit
ST R0,RQENUM Save the value
*
*
*- Build trace table v212
*
GETMAIN RU, Get stg for trace table v212X
LV=TRACESZ*1024, v212X
BNDRY=PAGE v212
ST R1,ATRACE Save ptr to trace table v212
MVC 0(5,R1),=CL5'TRACE' v212
MVI 5(R1),C'T' So eyecatcher TRACETAB v212
MVI 6(R1),C'A' wont show in a dump v212
MVI 7(R1),C'B' in this load module v212
USING TRCCTL,R1 v212
ST R1,TRCSTRT Set start v212
ST R1,TRCCURR Set current v212
AR R0,R1 -> end v212
ST R0,TRCEND Set end v212
L R15,=A(NJETRC) -> Trace CSECT v212
ST R15,TRCRTN Set trace routine EPA v212
DROP R1 v212
*
*
*-- Initialize console processing to allow MVS modify and stop
*-- commands to control this address space
*
INIT040 EQU *
MVC MACLIST(EXTRACTL),EXTRACT Move macro model
LA R3,COMMAREA -> area to place comm area addr
EXTRACT (3), Get ptr to comm area X
FIELDS=COMM, X
MF=(E,MACLIST)
*
L R3,COMMAREA -> ptrs to COMM CIB and ECB
USING IEZCOM,R3 Map the communication area
MVC COMMECBA,COMECBPT Save off addr of COMM ECB
ICM R4,15,COMCIBPT Get addr of CIB ptr
BZ INIT060 No CIB, go get one
USING CIBNEXT,R4 Map the CIB
*
CLI CIBVERB,CIBSTART Is this a START CIB?
BNE INIT060 No, set up CIB count
*
QEDIT ORIGIN=COMCIBPT, Free the CIB from the START cmd X
BLOCK=(4) that started this space
*
INIT060 EQU *
QEDIT ORIGIN=COMCIBPT, Set CIB limit to 1 X
CIBCTR=1
DROP R4 IEZCIB
DROP R3 IEZCOM
*
*
*
*- Initialization Completed
*
INIT090 EQU *
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE001I),NJE001I Move msg text
MVC MACLIST+51(8),LCLNODE
WTO ,MF=(E,MACLIST)
*
*- Start any auto-startable links
*
*
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
ICM R2,15,LNEXT -> first remote link v22x
BZ MAIN000 No auto if no links v22x
*
AUTO000 EQU *
TM LFLAG,LAUTO Is link autostartable?
BZ AUTO010 No
BAL R14,SLNK000 Try to start the link
*
STIMER WAIT,DINTVL=ATTDLY Pause briefly v200
*
AUTO010 EQU *
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ AUTO000 Look for another link
DROP R2 LINKTABL
*
*
*
MAIN000 EQU *
BAL R14,BLDL000 Go build the ECB list
BZ QUIT000 No ECBS in list; terminate
*
SPKA 0 Use key 0 for CSA ECB
WAIT 1,ECBLIST=ECBLIST
*
*-- Identify the ECB that was posted
*
MAIN010 EQU *
LA R1,ECBLIST -> our ECBLIST
*
MAIN050 EQU *
ICM R2,15,0(R1) -> ECB v211
BZ MAIN055 Skip ECB if empty slot v211
TM 0(R2),X'40' Was this ECB posted?
BO MAIN060 Yes
*
MAIN055 EQU * v211
TM 0(R1),X'80' Last ECB addr in list?
BO MAIN000 Nothing to do, go WAIT
LA R1,4(,R1) -> next ECB addr
B MAIN050 Keep looking
*
*
MAIN060 EQU *
CLM R2,7,CSAECBAD+1 Was the WRE work ECB posted?
BE WRK000 Hey! We have something to do
*
SPKA X'80' Back to user key for the rest
CLM R2,7,COMMECBA+1 Was the COMM ECB posted?
BE COMM000 Yes
*
*** L R3,0(,R2) Load the ECB content v211
XC 0(4,R2),0(R2) Clear the ECB
LA R0,LTRMECB-LINKTABL Offset of ECB in LINKTABL v211
SR R2,R0 -> LINKTABL entry v211
USING LINKTABL,R2
*** CLM R3,7,=AL3(255) ECB post code 255? v211
*** BE MAIN080 Yes, LINKTABL entry delete v211
*
DETACH LTCBA Detach the subtask
XC LTCBA,LTCBA Mark task terminated
MVI LFLAG,X'00' Clear status flags
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE010I),NJE010I Line is drained
UNPK DBLE(4),LACTLINE(3) Convert CUU of line
TR DBLE(3),HEXTRAN-240
MVC MACLIST+17(3),DBLE
WTO ,MF=(E,MACLIST) Line xxx is drained
B MAIN010 Look for more work
*
*-- Here to delete a LINKTABL entry (from LINK OFF command) v211
*-- We arrive here from POST code 255. NJESCN LOFF000 does the POSTv211
*
DROP R2 LINKTABL v211
*
*-- Build a new ECBLIST before the wait
*
BLDL000 EQU *
SR R1,R1 Init: no ECBs in list
LA R15,ECBLIST-4 -> 0th ECB list entry
TM NJFL1,NJF1STOP Is main task termination set?
BO BLDL010 Yes, dont add COMM ECBs to list
LA R15,4(,R15) -> next available ECB list slot
L R1,COMMECBA -> COMM ECB
ST R1,0(,R15) Set addr in ECB list
LA R15,4(,R15) -> next available ECB list slot
L R1,CSAECBAD -> WRE work ECB
ST R1,0(,R15) Set addr in ECB list
*
BLDL010 EQU *
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
L R2,LNEXT -> first remote link v211
*
BLDL020 EQU *
CLC LTCBA,=A(0) Is task active for link?
BE BLDL030 Zero, skip this one
LA R15,4(,R15) -> next available ECB list slot
LA R1,LTRMECB -> task's termination ECB
ST R1,0(,R15) Set ECB addr in ECB list
*
BLDL030 EQU *
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ BLDL020 Scan them all
DROP R2 LINKTABL
LTR R1,R1 Any ECB in the list?
BZR R14 No, return with CC=0 set
OI 0(R15),X'80' Mark end of list
BR R14 Return with ECB list built
*
**********************************************************************
* *
* WRE FLOWS *
* *
**********************************************************************
*
* When WREs are created by out-of-address space tasks (such as by
* modules NJE38 by TSO users, or NJ38XMIT by jobs) they are
* created in CSA and chained off the NJE38 CSA block NJ38CSA. The
* WRE ECB is posted via cross memory post. Any WRE posted in this
* manner will first end up here, at WRK000 below.
*
* WRK000 will pull the entire chain of WREs and get it off that queue
* so that these can be processed one at a time while outside tasks may
* continue to add new WREs to the CSA chain.
*
* Each WRE is examined for its destination. If the WRE has a
* destination link id in the LINKs table, or via a route that can be
* forwarded via a destination link, the WRE will be requeued to that
* particular link task at WRK120.
*
* When the link task gets the WRE, it will be processed by NJEDRV
* label COMM000, which will dequeue it and flow continues to
* label WRK000 in that same module. After processing the WRE stg
* is freed.
*
* Back in NJEINIT, if the WRE is destined for the local link (at
* WRK030) flow proceeds to WRK200 where the command processor NJECMD
* is called to examine and process the action. Upon return, the
* WRE storage is freed and the next WRE on the chain is examined,
* if any.
*
* Notes:
* 1. WREs are created in subpool 2 which is shared by other TCBs.
* (Except for out-of-address-space WREs, which are in CSA).
* 2. WREs are sometimes created internally:
* a). in NJEINIT STOP000 to queue a WRE to each active link task
* in order to stop the link.
* b). in NJEINIT CCD000 in order to queue a command that was
* input from the system console to a remote link task.
* 3. Whether the WRE is created from an outside address space or
* internally, they all flow the same way, via the post to the
* ECB in NJ38CSA and being placed on the queue anchor in NJ38CSA.
*
*
*
* Summary:
*
* 1. WRE gets created and posted to CSA anchor
* 2. NJEINIT WRK000 sees the WRE first
* 3. WRE is requeued to a link or handled by NJEINIT/NJECMD
* 4. WRE is freed.
*
*
*
*
*
*
*
*-- WRE work ECB was posted
*
WRK000 EQU *
SPKA 0 This routine must run key=0
XC 0(4,R2),0(R2) Reinit WRE work ECB
L R2,CSABLK -> CSA communications area
USING NJ38CSA,R2
*
LM R6,R7,NJ38SWAP Get WRE anchor, sync count
*
WRK010 EQU *
LTR R6,R6 Was WRE Q empty?
BZ MAIN010 Yes, nothing else to do
SR R14,R14 Zero out the WRE Q anchor
LR R15,R7 Copy same sync count
CDS R6,R14,NJ38SWAP Try to empty the WRE Q
BC 7,WRK010 Can't yet, try again
DROP R2 NJ38CSA
*
*-- Distribute the WREs to the various links
*
*-- R6 -> start of WRE chain we dequeued from WRE Q
*
USING WRE,R6
*
*
WRK030 EQU *
NJETRACE TYPE=TRCIWRE Trace incoming WRE
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* -> here v220
ST R15,4(,R14) Save addr of trace request v220
ST R6,8(,R14) Trace WRE addr v220
MVC 12(4,R14),WRETYPE Trace type code,len,subpool v220
MVC 16(8,R14),WRELINK link dest v220
MVC 24(8,R14),WREUSER userid dest v220
NJETRACE TYPE=TRCIWRE Trace incoming WRE follow on v220
OI 0(R14),X'80' Indicate follow on v220
STCM R10,7,1(R14) Identify trace entry v220
MVC 4(8,R14),WREORIG Originator userid v220
MVC 12(20,R14),WRETXT Trace WRE content v220
*
CLC WRELINK,LCLNODE Is this WRE for the local node?
BE WRK200 Yes, don't queue it to a link
*
WRK040 EQU *
LA R1,WRELINK -> destination link of WRE
BAL R14,FLNK000 Locate the LINKTABL entry
BZ WRK050 No link found, check routes
*
USING LINKTABL,R2
TM LFLAG,LCONNECT Is link connected?
BO WRK120 Yes, post the link task
*
*-- Otherwise, look at routes. R1-> WRELINK
*
WRK050 EQU *
BAL R14,RLNK000 Find matching route
BZ WRK150 No matching routes
BAL R14,FLNK000 Locate the LINKTABL entry
BZ WRK150 No link found for this WRE
TM LFLAG,LCONNECT Is link connected?
BZ WRK150 No, skip this WRE
*
*
*-- Here to requeue the WRE to the link WRE chain
*
WRK120 EQU *
NJETRACE TYPE=TRCOWRE Trace outgoing WRE
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* -> here v220
ST R15,4(,R14) Save addr of trace request v220
ST R6,8(,R14) Trace WRE addr v220
MVC 12(4,R14),WRETYPE Trace type code,len,subpool v220
MVC 16(8,R14),WRELINK link dest v220
MVC 24(8,R14),WREUSER userid dest v220
NJETRACE TYPE=TRCOWRE Trace outgoing WRE follow on v220
OI 0(R14),X'80' Indicate follow on v220
STCM R10,7,1(R14) Identify trace entry v220
MVC 4(8,R14),WREORIG Originator userid v220
MVC 12(20,R14),WRETXT Trace WRE content v220
*
L R8,WRENEXT -> next WRE in CSA chain
*
LM R0,R1,LWRESWAP Get first WRE ptr, sync count
WRK130 EQU *
ST R0,WRENEXT First WRE becomes next
LR R4,R6 -> WRE to be added as first
LA R5,1(,R1) Incr synchronization count
CDS R0,R4,LWRESWAP Update LINK WRE anchor, sync
BC 7,WRK130 Gotta try again
*
LA R1,LECB -> link task notification ECB
POST (1) Tell task
B WRK290 Go get another WRE
*
*-- Release WRE that we cant distribute to a link
*
WRK150 EQU *
B WRK290
DROP R2 LINKTABL
*
*-- Here if WRE is intended for the local node
*
WRK200 EQU *
SR R15,R15 Clear for IC v220
IC R15,WRETYPE Get WRE type code v220
CLM R15,1,=AL1(WRK210HI) Check against highest code v220
BH WRK280 Dispose of invalid WRE v220
B WRK210(R15) Branch into table v220
*
WRK210 EQU * v220
B WRK280 X'00' Invalid; just delete WRE v220
B WRK280 X'04' WRENEW; ignore for LCL nodev220
B WRK215 X'08' WRECMD v220
B WRK220 X'0C' WREMSG v220
B WRK240 X'10' WRESTAR v220
B WRK300 X'14' WREREG v220
B WRK350 X'18' WREDREG v220
B WRK400 X'1C' WREQRM v220
B WRK450 X'20' WREDRM v220
WRK210HI EQU (*-WRK210-4) Highest code supported v220
*
*
WRK215 EQU *
SPKA X'80'
MVC CMDAREA,BLANKS Init receiving area
SR R2,R2 Clear for IC
IC R2,WRETXTLN Get cmd image length
EX R2,MVTXT1 Move cmd image
STC R2,CMNDBLEN IBM length of image to CMDBLOK
MVC CMNDLINK,LCLNODE This node is the issuer
MVC CMNDUSER,WREUSER Copy TSO id of issuer
*
L R15,=A(NJECMD) -> command processor
BALR R14,R15 Go there
SPKA X'00'
B WRK280
*
MVTXT1 MVC CMDAREA(0),WRETXT Executed instr
*
*-- Send the msg response to a local TSO user
*
WRK220 EQU *
CLC WREUSER,=CL8'OP' Message destined for operator?
BE WRK230 Yes
LA R15,WREUSER -> userid to locate
BAL R14,REG000 See if user registered v220
BNZ WRK280 Yes it was; we queued it v220
BAL R14,USR800 See if TSO user logged on
BZ WRK280 Skip msg if not
MVC MACLIST(80),BLANKS Init first part
MVC MACLIST+4(9),=C'SE ''From '
MVC MACLIST+13(8),WREORIG
TRT MACLIST+13(9),BLANK Look for end of orig userid
MVI 0(R1),C':'
LA R1,2(,R1) -> area for msg
MVC 0(104,R1),WRETXT Move msg text v102
LA R2,MACLIST+111 -> last byte from MTEXT area v210
LA R0,32 # char to check backwards v210
*
WRK223 EQU * Only look backwards to col 80 v210
CLI 0(R2),C' ' Try to find last non-blank v210
BNE WRK226 Found it v210
BCTR R2,0 -> prev char v210
BCT R0,WRK223 Keep scanning v210
*
WRK226 EQU * v210
LA R2,1(,R2) -> first blank after last char v210
MVC 0(8,R2),=C''',USER=(' v210
MVC 8(12,R2),BLANKS Ensure trailer initted v210
MVC 8(7,R2),WREUSER Max for TSO userid is 7 v210
LA R1,8+7(,R2) -> max end of trt v210
TRT 8(7,R2),BLANK Look for end of userid v210
MVI 0(R1),C')' Move closing v210
MVI 1(R1),C' ' Plus 1 blank v210
LA R0,MACLIST -> start of msg area v210
SR R1,R0 Compute length of msg v210
LA R1,1(,R1) Account for blank at end v210
XC MACLIST(4),MACLIST Clear len, flags v210
STH R1,MACLIST Insert the msg length v210
*
LA R1,MACLIST
SR R0,R0
SVC 34 Issue MGCR SVC
B WRK280
*
*-- Send the msg response to the system operator
*
WRK230 EQU *
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(4),=C'From'
MVC MACLIST+9(8),WREORIG Move originating userid
TRT MACLIST+9(9),BLANK Look for end of orig userid
MVI 0(R1),C':'
LA R1,2(,R1) -> area for msg
MVC 0(104,R1),WRETXT Move msg text v102
WTO ,MF=(E,MACLIST)
B WRK280
*
*-- Start a link (via a local or remote command)
*
WRK240 EQU *
L R2,WREUSER -> LINKTABL entry of START cmd
BAL R14,SLNK000 Attach the link driver
B WRK280
*
*-- Clean up spent WRE
*
WRK280 EQU *
SPKA 0 In case WRE isin CSA v220
L R8,WRENEXT -> next WRE in chain
SR R15,R15 Clear for IC v220
IC R15,WRESP Get subpool number v220
LA R0,WRESIZE Size of this WRE v220
*
NJETRACE TYPE=TRCFWRE v220
STCM R10,7,1(R14) Identify trace entry v220
LA R2,* v220
STCM R2,7,5(R14) Addr of Freemain to trace v220
ST R0,8(,R14) Len to trace v220
ST R6,12(,R14) addr to trace v220
STC R15,8(,R14) Trace subspool v220
MVI WRESP,X'FF' Mark stg as freed v220
*
FREEMAIN RU, Free the WRE x
LV=(0), x
A=(6), x
SP=(15) v220
SPKA X'80' v220
*
*-- Done processing a WRE; get another
*
WRK290 EQU *
LTR R6,R8 Get next WRE to distribute
BNZ WRK030 Yes have an addr v220
B MAIN010 All done with WREs
*
*
* Registered User Service Support Notes v220
*
* The registered user service allows an outside address space
* operating in the same MVS system as NJE38, to 'register' or
* establish a relationship with NJE38 where messages that would
* ordinarily be sent to a user terminal are instead queued in
* storage and presented to the outside address space upon request.
*
* Users wishing to use this service call the NJERLY interface which
* is responsible for establishing the relationship with NJE38. This
* is done using WREs and cross-memory POST. In this way, a batch,
* TSO, or STC address space can capture message traffic destined
* for it before it would arrive at a terminal, and thereby process
* this message or display it in the manner of their choosing.
*
* WREs created by NJERLY are always in CSA. When they are used to
* request service of NJE38, they place the WRE on the NJ38SWAP
* compare and swap chain just like any other outside requester and
* post NJEINIT's CSA ECB. NJEINIT then acts on the request.
*
* NJEINIT never frees the WRE created by NJERLY. That is NJERLY's
* responsibility.
*
* For some functions of the service, the request is ignored if
* important information is missing (unlikely) such as ASCB address
* of NJERLY, or the WRE address. Ignoring the request is all that
* can be done since without either of those pieces, NJEINIT cannot
* issue CM POST back to the NJERLY space to let it know of the error.
*
* When a user joins the service, he registers. NJEINIT will create
* a REGUSERB control block to establish the registration and hold
* the NJERLY requester'e WRE and ASCB address.
*
* Once a user (userid) has registered, any message traffic inbound
* destined for that user will be queued in NJE38 storage and chained
* from REGUSERB, The user can then request a message be returned
* one per request. A post code of 4 (ERNOMSG) is used to indicate
* no messages are queued.
*
* When the user wants to stop using the service, it 'deregisters',
* causing NJEINIT to freemain any queued messages for the user and
* releasing the REGUSERB. Message traffic destined for that user
* resumes being presented to the terminal as before.
*
* In the comments below, the 'registered user WRE' refers to the
* WRE created by NJERLY in CSA by the user address space.
*
*
*
*- WREREG
*- Register a user for queued message services
*
*- Who requests this service: user address space via NJERLY
*
*- Steps:
* 1. Ensure userid is not already registered on REGUSERB chain.
* 2. Create a new REGUSERB for this user
* 3. Issue CM POST to registered user space, function complete.
*
*
* Notes: - On entry, registered user WRE is in R6.
* - Registered users WREs are not freemained; we are not the
* owner.
* - If the registered user WRE has no ASCB addr, we have no
* choice but to ignore the request.
*
WRK300 EQU *
L R8,WRENEXT -> next WRE v220
XC WRENEXT,WRENEXT Clear next next ptr because v220
* this is a registration WRE v220
* and wont be freemained herev220
CLC WREASCB,=A(0) Is ASCB present? v220
BE WRK810 No, invalid. Can't respond v220
*
ICM R1,15,REGUSER -> first REGUSER v220
BZ WRK320 None, let's start a chain v220
USING REGUSERB,R1 v220
LA R0,ERDUPUSR Assume duplicate user error v220
*
WRK310 EQU * v220
CLC REGUSRID,WREUSER Is this user already reg? v220
BE WRK800 Yes, post the error in R0 v220
ICM R1,15,REGNEXT Keep looking v220
BNZ WRK310 v220
*
WRK320 EQU * v220
GETMAIN RU, Get storage for a REGUSER v220x
LV=REGSIZE, v220x
SP=2 v220
XC 0(REGSIZE,R1),0(R1) Init stg v220
MVC REGEYE,=CL4'REGU' Set eye v220
MVC REGUSRID,WREUSER Userid to be registered v220
ST R6,REGWRE Save ptr to registration WREv220
MVC REGNEXT,REGUSER Chain other REGUSERs to thisv220
ST R1,REGUSER This REGUSER is first v220
DROP R1 REGUSERB v220
SR R0,R0 Set RC=0 success v220
B WRK800 User successfully registeredv220
*
*- WREDREG
*- Deregister a user from queued message services
*
*- Who requests this service: user address space via NJERLY
*
*- Steps:
* 1. Locate the REGUSERB for the userid
* 2. Get the chain anchor for queued message WREs, if any
* 3. Freemain the REGUSERB.
* 4. Freemain each queued message WRE
* 5. Issue CM POST to registered user space, function complete.
*
* Notes: - On entry, registered user WRE is in R6.
* - Registered users WREs are not freemained; we are not the
* owner.
* - If the registered user WRE has no ASCB addr, we have no
* choice but to ignore the request.
*
WRK350 EQU *
L R8,WRENEXT -> next WRE v220
XC WRENEXT,WRENEXT Clear next next ptr because v220
* this is a registration WRE v220
* and wont be freemained herev220
CLC WREASCB,=A(0) Is ASCB present? v220
BE WRK810 No, invalid. Can't respond v220
*
LA R0,ERUSERNF Assume user not found v220
LA R2,REGUSER -> 0th REGUSER entry v220
ICM R1,15,REGUSER -> first REGUSER v220
BZ WRK800 None, user indeed isnt foundv220
USING REGUSERB,R1 v220
*
WRK360 EQU * v220
CLC REGUSRID,WREUSER Is this user we want? v220
BE WRK370 Yes v220
LR R2,R1 Save this REGUSER ptr v220
ICM R1,15,REGNEXT Get next REGUSER and continuv220
BNZ WRK360 v220
B WRK800 Exit with user not found v220
*
WRK370 EQU * v220
MVC REGNEXT-REGUSERB(,R2),REGNEXT unchain R1 REGUSER v220
L R2,REGMSGQ -> MSG WRE chain for user v220
DROP R1 REGUSERB v220
*
FREEMAIN RU, Free storage for a REGUSERB v220x
LV=REGSIZE, v220x
A=(1), v220x
SP=2 v220
*
WRK380 EQU * v220
LTR R1,R2 Were any WREs chained? v220
BZ WRK390 No, we're done v220
L R2,WRENEXT-WRE(,R2) -> next WRE v220
LA R0,WRESIZE Get size of WRE v220
*
NJETRACE TYPE=TRCFWRE v220
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* v220
STCM R15,7,5(R14) Addr of Freemain to trace v220
STM R0,R1,8(R14) Len, stg addr to trace v220
MVI 8(R14),2 Trace subspool v220
MVI WRESP-WRE(R1),X'FF' Mark stg as freed v220
*
FREEMAIN RU, Free storage for a WRE v220x
LV=(0), v220x
A=(1), v220x
SP=2 v220
B WRK380 Free entire chain v220
*
WRK390 EQU * v220
SR R0,R0 Set RC=0 success v220
B WRK800 User successfully deregisterv220
*
*
*- WREQRM
*- Queue a message destined for a registered user
*
*- Who requests this service: Internal by NJEINIT, NJECMX, NJEDRV
* as message traffic arrives and needs to be queued.
*
*- Steps:
* 1. Locate the REGUSERB for the userid
* 2. If REGUSERB is not found, userid is not registered. Exit
* with CC=0 and allow the message to go to the user terminal.
* 3. Get the registration WRE address from REGUSERB, exit if none.
* 4. Add this queued message WRE (in R6) to the queued message
* chain REGMSGQ (in REGUSERB). Do not freemain this WRE!
* 5. Issue CM POST to registered user space that message is avail.
*
* Notes: - On entry, a queued message WRE is in R6.
* - The WREs are added to the start of the chain (REGMSGQ)
* because they come to us in reverse order of issuance.
* This puts them back in the right order
*
WRK400 EQU *
L R8,WRENEXT -> next WRE v220
ICM R3,15,REGUSER -> first REGUSER v220
BZ WRK810 No one registered v220
USING REGUSERB,R3 v220
*
WRK410 EQU * v220
CLC REGUSRID,WREUSER Is this user the one? v220
BE WRK420 Yes v220
ICM R3,15,REGNEXT Keep looking v220
BNZ WRK410 v220
B WRK810 Can't find REGUSER v220
*
WRK420 EQU * v220
ICM R4,15,REGWRE -> user's registration WRE v220
BZ WRK810 Ignore if not there v220
*
MVC WRENEXT,REGMSGQ Add chain to new WRE v220
ST R6,REGMSGQ Add WRE to anchor v220
LR R6,R4 User registration WRE to R6 v220
SR R0,R0 Indicate success v220
B WRK800 Tell user msg pending v220
* v220
* v220
*- WREDRM
*- Dequeue message for a registered user when they request it
*
*- Who requests this service: user address space via NJERLY
*
*- Steps:
* 1. Locate the REGUSERB for the userid
* 2. If REGUSERB is not found, userid is not registered. Issue
* error to requester.
* 3. Get the first queued message WRE from REGUSERB, issue
* ERNOMSG error if nothing queued.
* 4. Copy the message text from the queued message WRE into the
* registered user WRE.
* 5. Issue CM POST to registered user space, function complete.
*
* Notes: - On entry, the registered user WRE is in R6.
*
*
WRK450 EQU *
L R8,WRENEXT -> next WRE v220
XC WRENEXT,WRENEXT Clear next next ptr because v220
* this is a registration WRE v220
* and wont be freemained herev220
ICM R3,15,REGUSER -> first REGUSER v220
BZ WRK810 No one registered v220
USING REGUSERB,R3 v220
*
WRK460 EQU * v220
CLC REGUSRID,WREUSER Is this user the one? v220
BE WRK470 Yes v220
ICM R3,15,REGNEXT Keep looking v220
BNZ WRK460 v220
B WRK810 Can't find REGUSER v220
*
WRK470 EQU * v220
LA R0,ERNOMSG Assume no msgs queued v220
ICM R5,15,REGMSGQ -> first queued msg WRE v220
BZ WRK800 No msgs available v220
*
MVC REGMSGQ,WRENEXT-WRE(R5) Remove 1st queued from chainv220
DROP R3 REGUSERB v220
*
MVC WRETXT,WRETXT-WRE(R5) Copy queued msg text to v220
* registered user WRE v220
*
LA R0,WRESIZE Get size of WRE v220
NJETRACE TYPE=TRCFWRE v220
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* v220
STCM R15,7,5(R14) Addr of Freemain to trace v220
ST R0,8(,R14) Len to trace v220
MVI 8(R14),2 Trace subspool v220
ST R5,12(,R14) Addr to trace v220
MVI WRESP-WRE(R5),X'FF' Mark stg as freed v220
*
FREEMAIN RU, Free Queued msg WRE v220x
LV=(0), v220x
A=(5), v220x
SP=2 v220
*
SR R0,R0 Indicate success v220
B WRK800 Tell user msg pending v220
*
*
WRK800 EQU * USING WRE,R6 v220
L R7,WREASCB -> ASCB of requestor v220
LA R1,WREECB -> WRE's ECB v220
*
MVC MACLIST(POSTL),POST Move macro model v220
POST (1),(0), Post requestor's ECB v220x
ASCB=(7), v220x
ERRET=WRK810, v220x
ECBKEY=0, v220x
MF=(E,MACLIST) v220
*
WRK810 EQU * v220
B WRK290 All done with WRE v220
DROP R6 WRE v220
*
*-- Address space Communications ECB was posted
*
COMM000 EQU *
L R4,COMMAREA -> Communications area
USING IEZCOM,R4
L R5,COMCIBPT -> CIB
USING CIBNEXT,R5
CLI CIBVERB,CIBMODFY Modify cmd?
BE MOD000 Yes
CLI CIBVERB,CIBSTOP Stop cmd?
BE STOP000 Yes, let subtasks know
U0038 ABEND 38,DUMP,STEP Shouldnt happen
*
MOD000 EQU *
MVC CMDAREA,BLANKS Init receiving area
LH R2,CIBDATLN Get cmd image length
BCTR R2,0 Adjust for execute
EX R2,MVMOD1 Move cmd image
STC R2,CMNDBLEN IBM length of image to CMDBLOK
*
QEDIT ORIGIN=COMCIBPT,BLOCK=(5) Purge the CIB
*
MVC CMNDLINK,LCLNODE Console operator
MVC CMNDUSER,=CL8'OP' should get any responses
L R15,=A(NJECMD) -> command processor
BALR R14,R15 Go there
B MAIN010
*
MVMOD1 MVC CMDAREA(0),CIBDATA Executed instr
*
*
*
STOP000 EQU *
QEDIT ORIGIN=COMCIBPT,BLOCK=(5) Purge the CIB
DROP R4 IEZCOM
DROP R5 IEZCIB
*
STOP010 EQU *
OI NJFL1,NJF1STOP Indicate STOP ordered
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
L R2,LNEXT -> first remote link v211
*
STOP020 EQU *
CLC LTCBA,=A(0) Is task active for link?
BE STOP030 Zero, skip this one
*
BAL R14,GTW000 Get a WRE
LR R4,R1 -> WRE
USING WRE,R4
MVI WRECODE,X'81' Code for drain link
DROP R4
BAL R14,PST000 Queue the WRE to link
*
STOP030 EQU *
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ STOP020 Scan them all
DROP R2 LINKTABL
*
B MAIN010
*
*
*-- Open then Close NETSPOOL dataset to determine status
*
* NCBRTNCD/ERRCD after call to NCBOPEN
* 0474 = dataset not closed properly (do verify)
* 0874 = dataset not formatted
*
NET000 EQU *
ST R14,SV14 Save return
*
MVC JFCBDCB(NSPOOLN),NSPOOL Move DCB for RDJFCB use
LA R1,JFCB -> JFCB return area
ST R1,JEXLST Set addr in exit list
MVI JEXLST,X'87' Set exlst for JFCB return
LA R1,JFCBDCB -> DCB
USING IHADCB,R1
LA R0,JEXLST -> exit list
STCM R0,7,DCBEXLSA Store it into DCB
DROP R1
*
MVC MACLIST(RDJFCBL),RDJFCB Move model
RDJFCB JFCBDCB,MF=(E,MACLIST) Get NETSPOOL DSN
*
LA R3,NCB1
USING NCB,R3
*
NSIO TYPE=OPEN, Open NETSPOOL x
NCB=(R3), v210x
ENTRY=ANJESPL v210
LTR R15,R15
BZ NET040
BAL R14,FMT000
*
NET040 EQU *
NSIO TYPE=CLOSE, x
NCB=(R3), v210x
ENTRY=ANJESPL v210
DROP R3
TM NJFL1,NJF1VSER Did VSAM error occur?
BZ NET090 No
CLC LASTRC(2),=X'0474' NETSPOOL needs verify?
BE NET080
CLC LASTRC(2),=X'0874' NETSPOOL not formatted?
BNE NET070
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE007I),NJE007I Not formatted msg
WTO ,MF=(E,MACLIST)
B NET090
*
NET070 EQU *
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE006I),NJE006I Open failed
WTO ,MF=(E,MACLIST)
B NET090
*
NET080 EQU *
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE008I),NJE008I Do verify
WTO ,MF=(E,MACLIST)
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE009I),NJE009I verify complete
WTO ,MF=(E,MACLIST)
*
NET090 EQU *
TM NJFL1,NJF1VSER Set CC: Did VSAM error occur?
L R14,SV14 Reload return
BR R14 Return
*
ERR999 EQU *
WTO 'NJE999I NJE38 is already active'
*
QUIT000 EQU *
ESTAE 0 Turn off ESTAE
*
TTIMER CANCEL Cancel the timer
*
FREEMAIN RU,SP=1 Free all CONFIG related stg
FREEMAIN RU,SP=2 Free all WRE related stg
*
QUIT020 EQU *
DELETE EP=NJECMX Delete command processor
DELETE EP=NJESPOOL Delete spool interface v210
*
ICM R1,15,ARQESTG -> RQE stg area
BZ QUIT030 Skip free if none v212
FREEMAIN RU, Free it x
LV=RQESZ*RQELIM, x
A=(1)
*
QUIT030 EQU * v212
ICM R1,15,ATRACE -> Trace table stg v212
BZ QUIT070 Skip free if none v212
FREEMAIN RU, Free it v212x
LV=TRACESZ*1024, v212x
A=(1) v212
*
QUIT070 EQU *
TM NJFL1,NJF1ENQ Is NJE38 ENQ active?
BZ QUIT080 No
LA R5,NJERNAME -> RNAME
MVC MACLIST(ENQL),ENQ Move macro model
DEQ (NJE38Q,(5),56,SYSTEM), x
RET=NONE, x
MF=(E,MACLIST)
*
QUIT080 EQU *
ICM R5,15,CSABLK -> CSA stg area
BZ QUIT090 Not present
*
SPKA 0
*
FREEMAIN RU,LV=NJ38CSAZ,A=(5),SP=241 Free CSA area
XC CSABLK,CSABLK
*
SPKA X'80'
*
QUIT090 EQU *
LR R1,R10 -> NJEWK main work area page
L R13,4(,R13) -> caller's sa
FREEMAIN RU, x
LV=4096, x
A=(1)
LM R14,R12,12(R13) Reload system's regs
XR R15,R15 RC=0
BR R14 Return
*
U0039 EQU *
STM R0,R1,DBLE Save regs across abend SVC
ABEND 39,DUMP,STEP
*
LTORG
* HHMMSSTH
DS 0D v200
ATTDLY DC CL8'00000050' 1/2 sec
*
EXTRACT EXTRACT MF=L
EXTRACTL EQU *-EXTRACT
ESTAE ESTAE 0,MF=L
ESTAEL EQU *-ESTAE
*
ENQ ENQ (0),MF=L
ENQL EQU *-ENQ
*
DEQ DEQ (0),MF=L
DEQL EQU *-DEQ
*
RDJFCB RDJFCB 0,MF=L
RDJFCBL EQU *-RDJFCB
*
NJE38Q DC CL8'NJE38'
NJERCON DC CL8'NJEINIT'
*
NSPOOL DCB DDNAME=NETSPOOL,DSORG=PS,MACRF=GL,EXLST=0
NSPOOLN EQU *-NSPOOL
*
* 456789012345678901234567890123456789012345678901
NJE000I DC C'NJE000I NJE38 &VERS'
NJE001I DC C'NJE001I Initialization complete for local node'
NJE006I DC C'NJE006I Open failed for DD NETSPOOL'
NJE007I DC C'NJE007I NETSPOOL dataset has not been formatted'
NJE008I DC C'NJE008I The NETSPOOL dataset required verification befx
ore start-up'
NJE009I DC C'NJE009I Verification complete. Please restart NJE38'
NJE010I DC C'NJE010I Line xxx is drained'
*
DROP R12
*
*********************
* N J E C O M * NJECOM hosts small routines and
* * frequently used constants that
* Common routines * are available to all NJExxx csects
* and constants * via base register 11
* *
*********************
*
NJECOM CSECT
DC A(0) No branch around constants
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECOM'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
USING NJECOM,R11
USING NJEMWK,R10
*
* FLNK000 - Locate a link table entry by link name
*
* Entry: R1 -> Link name to find (CL8 field padded with blanks)
* Exit: CC=0 link was not found
* CC<>0 link table entry address is in R2
*
*
*
FLNK000 EQU *
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
L R2,LNEXT -> first remote link v211
*
FLNK010 EQU *
CLC LINKID,0(R1) Find the link entry by name
BE FLNK020 Got it
ICM R2,15,LNEXT -> next LINKTABL entry
BZR R14 Exit CC=0 if not found
B FLNK010 Keep searching
DROP R2 LINKTABL
*
FLNK020 EQU *
LTR R2,R2 Set CC non-zero
BR R14 Return w/LINKTABL entry -> R2
*
* RLNK000 - Locate a name in the route table
*
* Entry: R1 -> Routed name to find (CL8 field padded with blanks)
* Exit: CC=0 link was not found
* CC<>0 Associated link name address is in R1
* CC<>0 Named route address is in R15
*
*-- First determine if the route name we are looking up is actually
*-- a link name.
*
RLNK000 EQU *
ICM R15,15,ROUTES -> RTE list v211
BZR R14 Exit CC=0 if no RTE list v211
USING RTE,R15 v211
*
L R2,LINKS 1st entry (LOCAL entry) v211
USING LINKTABL,R2
ICM R2,15,LNEXT Skip over local entry v211
BZR R14 Fail the request if none v211
SR R0,R0 R0=0 assume name not a link v211
*
RLNK010 EQU * v211
CLC LINKID,0(R1) Find the link entry by name v211
BE RLNK020 Got it v211
ICM R2,15,LNEXT -> next LINKTABL entry v211
BNZ RLNK010 Keep looking v211
B RLNK030 Didn't find a matching link v211
DROP R2 LINKTABL v211
*
*-- Here if route we want is a link name too (dont use wildcards) v211
*
RLNK020 EQU * v211
BCTR R0,0 Indic route is explicit link nm v211
* v211
*-- Search the RTEs for the route name v211
* v211
RLNK030 EQU *
STM R4,R7,12(R13) Save work regs v211
*
RLNK040 EQU * v211
LA R4,ROUTNAME -> name from route list v211
LA R5,8 max length v211
LR R6,R1 -> selected name to locate v211
LR R7,R5 copy length v211
CLCL R4,R6 Did we locate the name? v211
BE RLNK400 Yes, exact match v211
LTR R0,R0 Must be explicit link name? v211
BNZ RLNK050 Yes, no wildcard checking v211
CLI 0(R4),C'*' Wildcard was in the name? v211
BE RLNK400 Then we matched to that point v211
*
RLNK050 EQU *
ICM R15,15,ROUTPTR -> Next route entry v211
BNZ RLNK040 Keep looking v211
LM R4,R7,12(R13) Restore work regs v211
BR R14 No matching route v211
*
*-- Found the RTE with a matching name, now determine what link v211
*-- to route to. v211
*
RLNK400 EQU * v211
LM R4,R7,12(R13) Restore work regs v211
LA R0,4 # possible routed-to names v211
LA R1,ROUTNEXT -> first possible name v211
*
RLNK410 EQU * v211
L R2,LINKS -> first LINKTABL entry v211
USING LINKTABL,R2 v211
ICM R2,15,LNEXT Skip over local entry v211
BZR R14 Fail the request if none v211
*
RLNK420 EQU * v211
CLC 0(8,R1),BLANKS No route-to name? v211
BE RLNK499 Fail the request v211
CLC 0(8,R1),LINKID Look for destination link v211
BE RLNK440 Found it v211
ICM R2,15,LNEXT -> next LINKTABL entry v211
BNZ RLNK420 Keep searching v211
*
RLNK430 EQU * v211
LA R1,8(,R1) Next alternate route-to v211
BCT R0,RLNK410 Rescan for matching link v211
B RLNK499 None found, fail the request v211
*
RLNK440 EQU * v211
TM LFLAG,LCONNECT Is the link active? v211
BZ RLNK430 N, try next route-to link v211
DROP R2,R15 LINKTABL, RTE v211
*
RLNK490 EQU * v211
CLI *,0 Set CC to non-zero v211
BR R14 Return with link name -> R1 v211
*
RLNK499 EQU * v211
CLI *+1,0 Set CC to 0 v211
BR R14 No matching route/act link foundv211
*
* SLNK000 - Start a link
*
* Entry: R2 -> LINKTABL entry to be started
* Exit: CC=0 link was started
* CC<>0 link was already started
*
*
*
USING LINKTABL,R2
SLNK000 EQU *
STM R14,R9,BALRSAVE Save regs used
CLC LTCBA,=A(0) Is link already started?
BNE SLNK090 Exit w/ CC<>0 if addr present
*
XC LTRMECB,LTRMECB Clear from any prior use
LA R1,INITPARM -> INITPARM mapping area
ST R1,LPOINTER Pass addr of area to subtask
L R5,=A(NJEDMP) -> ESTAI exit
LA R9,LTRMECB
LR R1,R2 LINKTABL entry is parameter
*
MVC MACLIST(ATTACHL),ATTACH Move macro model
ATTACH EP=NJEDRV, Attach X
SZERO=YES, Ok to share SP 0 X
SHSPL=SPLIST, Shared subpool list v220X
DPMOD=0, Run task same prty X
SM=SUPV, Run task in Supervisor state X
KEY=PROP, Run task in key 8 X
ECB=(R9), Subtask termination ECB X
ESTAI=((5),(10)), ESTAI exit, work area is param X
SF=(E,MACLIST), Attach macro plist X
MF=(E,(1)) Param plist area
*
ST R1,LTCBA Save attached TCB address
SR R15,R15 Set CC=0
B SLNK090 Exit with task attached
DROP R2 LINKTABL
*
SLNK090 EQU *
LM R14,R9,BALRSAVE Restore caller regs
BR R14 Exit with CC set
*
SPLIST DC X'02' Number of shared subpools v220
DC X'01' Share SP 1 v220
DC X'02' Share SP 2 v220
DS X Reserved v220
*
*-- Get a new command type WRE
*
*-- Entry: None
* Exit: R1 -> WRE
*
*
GTW000 EQU *
ST R14,SV14 Save return addr
GETMAIN RU, Get CSA for WRE TYPE=WRECMD x
LV=WRESIZE, v220x
SP=2 v220
XC 0(WRESIZE,R1),0(R1) Clear stg area v220
USING WRE,R1
MVI WRESP,2 Save subpool v220
MVI WRETYPE,WRECMD CMD/MSG WRE
*
NJETRACE TYPE=TRCGWRE
STCM R10,7,1(R14) Identify trace entry v220
MVC 5(3,R14),SV14+1 Addr of GTW000 caller v220
STM R0,R1,8(R14) Len, stg addr to trace v220
MVI 8(R14),2 Trace subpool # v220
DROP R1
L R14,SV14 Load return addr
BR R14
*
*-- Queue the WRE on the Link and post link's ECB
*-- Caller must be PSW key 0
*
*-- Entry: R2 -> LINKTABL entry
*-- R4 -> WRE
*-- Exit: None
*
PST000 EQU *
USING LINKTABL,R2
USING WRE,R4
ST R14,SV14 Save return addr
LM R0,R1,LWRESWAP Get first WRE ptr, sync count
*
PST020 EQU *
ST R0,WRENEXT First WRE becomes next
LA R5,1(,R1) Incr synchronization count
CDS R0,R4,LWRESWAP Update LINK WRE anchor, sync
BC 7,PST020 Gotta try again
*
LA R1,LECB -> link task notification ECB
POST (1) Tell subtask WRE is queued
L R14,SV14 Load return addr
BR R14
*
DROP R2 LINKTABL
DROP R4 WRE
*
*
*-- Message response to console or local TSO user
*
*=== NOTE ===
*=== At present this routine (RSP000) is not called or used, but
*=== is retained here for possible future use.
*
*
*-- Entry: Area "MACLIST" contains a WTO format msg
* Area CMNDUSER=BLANKS send to console
* Area CMNDUSER=userid send to that userid
*-- Exit: None
*
* Area "CMDAREA" is used by this call.
*
*
RSP000 EQU *
ST R14,SV14 Save return addr
CLC CMNDUSER,BLANKS Is there a userid?
BE RSP010 No, respond to console
CLC CMNDUSER,=CL8'OP' Respond to operator
BE RSP010 Y
*
LA R15,CMNDUSER -> userid to locate
BAL R14,USR800 See if TSO user logged on
BZ RSP090 Skip msg if not
MVC CMDAREA,MACLIST+4 Save message text
MVC MACLIST+4(4),=C'SE '''
MVC MACLIST+8(104),CMDAREA v102
MVC MACLIST+112(8),=C''',USER=(' v102
MVC MACLIST+120(12),BLANKS Ensure trailer initted v102
MVC MACLIST+120(7),CMNDUSER Max for TSO userid is 7 v102
LA R1,MACLIST+127 v102
TRT MACLIST+120(7),BLANK v102
MVI 0(R1),C')'
MVI 1(R1),C' '
MVC MACLIST(4),=AL2(129,0) max len + 4 overhead v102
*
SPKA 0
LA R1,MACLIST
SR R0,R0
SVC 34 Issue MGCR SVC
SPKA X'80'
B RSP090
*
RSP010 EQU *
WTO ,MF=(E,MACLIST)
*
RSP090 EQU *
L R14,SV14 Reload return addr
BR R14
*
*-- Search CSCB chain to see if TSO user is logged on
*-- Entry: R15->8-byte padded field containing TSO userid to find
*-- Exit: CC=0 user was not logged on
*-- CC<>0 user is logged on
*
USR800 EQU *
CLC =CL8'OP',0(R15) Is the userid the operator?
BE USR890 Yes, let it thru
L R1,16 Get CVT ptr
USING CVT,R1
L R1,CVTASCBH -> highest prty ASCB
USING ASCB,R1
*
USR810 EQU *
L R2,ASCBCSCB -> CSCB
USING CSCB,R2
LTR R2,R2 Is there a CSCB?
BZ USR840 No, get next ASCB
*
USR820 EQU *
CLC CHKEY,=XL8'00' Jobname zeroed?
BE USR830 Y, skip this CSCB
CLC CHKEY,=CL8' ' Jobname is blank?
BE USR830 Y, skip this CSCB
CLC CHKEY,0(R15) Is this the userid?
BE USR890 Yes
USR830 EQU *
L R2,CHPTR -> next CSCB
LA R2,0(,R2) Clear high order
LTR R2,R2 Last CSCB?
BNZ USR820 No
BR R14 Return with CC=0 (not found)
*
USR840 EQU *
L R1,ASCBFWDP -> next ASCB
LTR R1,R1 last one?
BNZ USR810 No
BR R14 Return with CC=0 (not found)
*
USR890 EQU *
LTR R14,R14 Set CC=non zero (userid found)
BR R14 Return to caller
*
DROP R1 ASCB
DROP R2 CSCB
*
*-- Special code to intercept messages destined for v220
*-- registered users v220
*
*
REG000 EQU * v220
L R2,AREGUSER -> registered user anchor word v220
ICM R2,15,0(R2) -> registered user queue v220
BZR R14 No registered users v220
*
USING REGUSERB,R2 v220
REG010 EQU * v220
CLC REGUSRID,0(R15) Find a matching registered user v220
BE REG020 Found it v220
ICM R2,15,REGNEXT -> next REGUSER entry v220
BNZ REG010 Keep looking v220
BR R14 Userid was not registered v220
*
REG020 EQU * v220
ST R14,SVR14R Save return addr v220
BAL R14,GTW000 Get a WRE v220
LR R4,R1 v220
USING WRE,R4 v220
MVI WRETYPE,WREQRM Queue registered msg WRE v220
*
MVC WRELINK,LCLNODE Target WRE to local node task v220
MVC WREUSER,REGUSRID Dest= registered user id v220
MVC WREORIG,BLANKS No originating node v220
MVC WRETXT,BLANKS Init first part v220
MVC WRETXT(5),=C'From ' v220
MVC WRETXT+5(8),WREORIG-WRE(R6) From original msg v220
TRT WRETXT+5(9),BLANK Look for end of orig userid v220
MVI 0(R1),C':' v220
LA R1,2(,R1) -> area for msg v220
MVC 0(104,R1),WRETXT-WRE(R6) Copy msg text v220
MVI WRETXTLN,L'WRETXT Set the max possible len v220
*
SPKA 0 v220
L R15,CSABLK -> NJE38 CSA block v220
USING NJ38CSA,R15 v220
LM R0,R1,NJ38SWAP Get first WRE ptr, sync count v220
*
REG030 EQU * v220
ST R0,WRENEXT First WRE becomes next v220
LA R5,1(,R1) Incr synchronization count v220
CDS R0,R4,NJ38SWAP Update LINK WRE anchor, sync v220
BC 7,REG030 Gotta try again v220
*
LA R1,NJ38ECB -> main task notification ECB v220
POST (1) Wake him up v220
*
SPKA X'80' v220
*
DROP R2,R4,R15 REGUSERB,WRE,NJ38CSA v220
* v220
REG090 EQU * v220
L R14,SVR14R Load return addr v220
LTR R14,R14 Set non-zero CC v220
BR R14 Ret w/CC non-zero (msg queued) v220
*
*
*-- Format and display VSAM errors
*
FMT000 EQU *
STM R14,R2,BALRSAVE Save regs used
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE079I),NJE079I Move msg text
MVC MACLIST+55(8),5(R12) Move csect name
TRT MACLIST+55(9),BLANK Look for end of csect name
MVI 0(R1),C'+'
*
LA R15,0(,R14) Clear high, Get addr of call to this rtn
LA R12,0(,R12) Clear high byte
SR R15,R12 Compute offset of call
ST R15,DBLE Save to work area
UNPK TWRK(5),DBLE+2(3) Add zones
TR TWRK(4),HEXTRAN-240 Display hex
MVC 1(4,R1),TWRK Move call offset to msg
*
LA R15,NCB1
UNPK TWRK(5),NCBRTNCD-NCB(3,R15) Add zones
TR TWRK(4),HEXTRAN-240
MVC MACLIST+35(4),TWRK Move rtncd/errcd
*
UNPK TWRK(3),NCBREQ-NCB(2,R15) Add zones
TR TWRK(2),HEXTRAN-240
MVC MACLIST+45(2),TWRK Move req code
*
L R1,NCBMACAD-NCB(,R15) Get failing VSAM macro addr
LA R1,0(,R1) Clear high byte
S R1,ANJESPL offset into NJESPOOL rtn v210
ST R1,DBLE
UNPK TWRK(5),DBLE+2(3) Add zones
TR TWRK(4),HEXTRAN-240 Display hex
MVC MACLIST+50(4),TWRK Move NJESPOOL offset to msg
*
MVC LASTRC(2),NCBRTNCD-NCB(R15) Save off rtncd/errcd
OI NJFL1,NJF1VSER Indicate VSAM error occurred
*
WTO ,MF=(E,MACLIST)
*
FMT090 EQU *
LM R14,R2,BALRSAVE Restore caller regs
BR R14 Exit with CC set
*
*
*
ATTACH ATTACH SF=L
ATTACHL EQU *-ATTACH
POST POST 0,ASCB=0,ERRET=0,MF=L v220
POSTL EQU *-POST v220
WTOMSG WTO ' x
',MF=L
WTOMSGL EQU *-WTOMSG
*
BLANKS DC CL120' '
NONBLANK DC 64X'FF',X'00',191X'FF' TR Table to locate nonblank
BLANK DC 64X'00',X'FF',191X'00' TR Table to locate blanks
ASTER DC 92X'00',X'FF',163X'00' TR Table to locate asteriskv211
HEXTRAN DC CL16'0123456789ABCDEF' Translate table
* 1 2 3 4 5
* 456789012345678901234567890123 45678 90123456789012345
NJE079I DC C'NJE079I NETSPOOL RTNCD/ERRCD=X''0000'',REQ=01,O=1234,Mx
MMMMMMM '
*
LTORG
*
* *
***********************************************************************
** **
** TASK ESTAI EXIT **
** **
** This csect handles all abends trapped by ESTAE during the normal **
** execution of the subtask. This exit does not attempt **
** any recovery other than to terminate processing. **
** An SVC dump is taken on abends. **
** **
** On entry: R0=ESTAE provide entry code **
** R1=SDWA address **
** R2=parameter passed on ESTAE macro **
** **
** **
** On exit: If SDWACLUP is 1, then no retry is allowed and this **
** exit will allow percolation back to system routines **
** to terminate the task. **
** **
** If SDWACLUP is 0, then retry is allowed. **
** **
** Security: N/A. **
** **
** Register usage: **
** **
** R1 = SDWA address **
** R3 = SDWA address **
** R10 = Dynamic storage area base **
** R12 = This program base **
** **
** **
** **
***********************************************************************
*
NJEDMP CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDMP'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
LR R12,R15 SET UP BASE REG
USING NJEDMP,R12 ESTABLISH ADDRESSABILITY
LR R8,R14 SAVE RETURN ADDRESS TO SYSTEM
*
L R10,0(,R1) GET VALUE PASSED TO US (WORKA)
USING NJEMWK,R10
L R11,ANJECOM -> common code and constants
USING NJECOM,R11
*
LR R3,R1 SAVE R1 ENTRY CONTENTS
USING SDWA,R3
LR R5,R0 Save R0 entry code
*
LTR R3,R3 Do we have an SDWA?
BZ NOSDWA Exit if no SDWA
LA R13,MVSSAVE Save area
*
MODESET MODE=SUP, Run this ESTAI exit privileged x
KEY=ZERO to access PSW -> storage
*
MVC MACLIST(WTOMSGL),WTOMSG
L R6,PSATOLD-PSA(0) -> my TCB
L R5,TCBTIO-TCB(,R6) -> TIOT
MVC MACLIST+4(8),0(R5) Plug in job name
MVC MACLIST+14(5),=C'LINK '
MVC LKNAME,=CL8' ' Init receiving field
*
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
ICM R2,15,LNEXT -> 1st non-lcl LINKTABL v211
BZ LNK005 Skip if not there v211
*
LNK000 EQU *
CLM R6,7,LTCBA+1 Look for TCB of failing link
BE LNK010 Found it
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ LNK000 Keep searching
*
LNK005 EQU * v211
MVC MACLIST+14(5),=C'LMOD '
MVC MACLIST+19(8),=CL8'NJEINIT' Else it is main task
OI NJFL1,NJF1INIT This is the NJEINIT task
B LNK020 No TCB/link found
*
LNK010 EQU *
MVC MACLIST+19(8),LINKID Move link name
MVC LKNAME,LINKID Save copy of link name
DROP R2
*
LNK020 EQU *
MVC MACLIST+29(5),=C'ABEND'
L R5,SDWAABCC GET ABEND CODE INFO WORD
N R5,=X'00FFF000' KEEP ONLY THE SYSTEM CODE
BZ USERCDE NONE THERE, MUST BE A USER CODE
C R5,=X'00222000' Operator cancel, no dump?
BE SDUMP040 no
C R5,=X'00013000' 013-OPEN abend? v211
BE SDUMP040 no dump v211
*
MVI MACLIST+35,C'S' INDICATE SYSTEM CODE
UNPK FWORK(5),SDWACMPC(3) GET SYSTEM CMP CODE
TR FWORK(3),HEXTRAN-240
MVC FWORK+3(5),=CL5' ' CLEAR REST OF ABEND CODE
B NOREAS
*
USERCDE EQU *
MVI MACLIST+35,C'U' INDICATE USER ABEND CODE
L R5,SDWAABCC GET ABEND CODE
N R5,=X'00000FFF' KEEP USER ABEND CODE
CVD R5,FSAVE CONVERT CODE TO DECIMAL
UNPK FWORK(4),FSAVE UNPK THE CODE
OI FWORK+3,X'F0' FIX SIGN
MVC FWORK+4(2),=CL2' ' BLANKS AT END OF ABEND CODE
*
NOREAS EQU *
MVC MACLIST+36(6),FWORK MOVE ABEND-REASON TO LINE
MVC ABCODE,MACLIST+36 Save a copy of formatted abcode
*
WTO ,MF=(E,MACLIST)
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(3),=C'PSW'
UNPK FSAVE(9),SDWAEC1(5) Add zones to PSW word 1
TR FSAVE(8),HEXTRAN-240
MVC MACLIST+10(8),FSAVE
UNPK FSAVE(9),SDWAEC1+4(5) Add zones to PSW word 2
TR FSAVE(8),HEXTRAN-240
MVC MACLIST+19(8),FSAVE
*
SR R5,R5 CLEAR FOR IC
IC R5,SDWAILC1 GET THE ILC
CVD R5,FWORK MAKE DECIMAL
MVC MACLIST+29(3),=C'ILC'
UNPK MACLIST+33(2),FWORK UNPK
OI MACLIST+34,X'F0' FIX THE SIGN
*
MVC MACLIST+37(4),=C'INTC'
UNPK FWORK(5),SDWAINC1(3) MAKE INTC DISPLAYABLE
TR FWORK(4),HEXTRAN-240
MVC MACLIST+42(4),FWORK MOVE INTC TO LINE
*
WTO ,MF=(E,MACLIST)
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(13),=C'DATA NEAR PSW'
MVC MACLIST+19(8),=CL8'UNAVAIL' ASSUME WE CANT GET DATA
L R4,SDWAEC1+4 Get PSW IA
LA R4,0(,R4) Clear high bit
C R4,=F'8' 1st 8 bytes of storage?
BH LOC010 No, its higher than that
SR R4,R4 Yes, just use 0
B LOC020
*
LOC010 EQU *
S R4,=F'8' BACK UP BEFORE INTERRUPT ADDR
*
LOC020 EQU *
LRA R0,0(,R4) Do we have access?
BNZ UNAVAIL No translation, better not
LRA R0,14(,R4) Do we have access?
BNZ UNAVAIL No translation, better not
*
ST R4,FWORK SAVE FOR CONVERSION
UNPK FSAVE(9),FWORK(5) ADD ZONES TO ADDRESS
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+19(8),FSAVE MOVE DISPLAYABLE
*
MVC FWORK(4),0(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+29(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),4(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+38(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),8(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+47(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),12(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+56(8),FSAVE MOVE TO LINE
*
UNAVAIL EQU *
WTO ,MF=(E,MACLIST)
*----
LA R4,4 4 ROWS OF REGISTERS
LA R5,SDWAGR00 POINT TO ABEND REGS
LA R6,REGLIST POINT TO REGISTER ID LITERALS
*
GPR000 EQU * v220
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(8),0(R6) MOVE REGISTERS ID
LA R15,MACLIST+13 WHERE 1ST REG GOES ON LINE
LA R14,4 4 REGS PER LINE
*
GPR010 EQU * v220
UNPK FSAVE(9),0(5,R5) UNPK A REGISTER
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC 0(8,R15),FSAVE MOVE TO THE LINE
LA R15,10(,R15) NEXT SPOT ON PRINT LINE
LA R5,4(,R5) NEXT REGISTER
BCT R14,GPR010 KEEP DOING REGS v220
WTO ,MF=(E,MACLIST)
LA R6,8(,R6) NEXT REGISTER ID
BCT R4,GPR000 GO DISPLAY THE NEXT ROW v220
*
*
SDUMP000 EQU *
MVI DHDR,C' '
MVC DHDR+1(29),DHDR
MVI DHDR,29 IBM length of header
L R5,PSATOLD-PSA(0) -> my TCB
L R5,TCBTIO-TCB(,R5) -> TIOT
MVC DHDR+1(8),0(R5) Use jobname in description
MVC DHDR+11(8),LKNAME Use link name
MVC DHDR+21(7),ABCODE
*
MVC MACLIST(SDUMPL),SDUMP MOVE SDUMP LIST TO WORK
LA R1,MACLIST
SDUMP HDRAD=DHDR, ISSUE SDUMP TO RECORD STATUS x
BUFFER=NO, x
QUIESCE=NO, x
SDATA=(RGN,CSA,LPA,SUM), x
MF=(E,(1))
*
*
SDUMP040 EQU *
TM NJFL1,NJF1INIT Is this the NJEINIT task?
BZ SDUMP090 No
ICM R5,15,CSABLK -> CSA stg area
BZ SDUMP090 Not present
*
FREEMAIN RU,LV=16,A=(5),SP=241 Free CSA area
XC CSABLK,CSABLK
*
SDUMP090 EQU *
LR R1,R3 SDWA BACK TO R1
* ** SDWA ADDR MUST BE IN R1 FOR SETRP
SETRP RC=0, No retry X
DUMP=NO Suppress any further dumps
*
NOSDWA EQU * ** NO RETRY AVAILABLE (OR DESIRED)
SR R15,R15 REQUEST PERCOLATION
LR R14,R8 RESTORE RETURN ADDRESS
BR R14 RETURN TO SYSTEM
*
LTORG
*
SDUMP SDUMP MF=L
SDUMPL EQU *-SDUMP
*
REGLIST DC CL8'GR 0-3'
DC CL8'GR 4-7'
DC CL8'GR 8-11'
DC CL8'GR 12-15'
*
LTORG
*
*
*
*********************
* N J E C M D * Commands issued by TSO users via command
* * module NJE38 also arrive here
* MVS Modify cmd *
* processing *
* *
*********************
*
NJECMD CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECMD'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
STM R14,R12,12(R13)
LR R12,R15 Base
USING NJECMD,R12 ADDRESS IT
USING NJECOM,R11
USING NJEMWK,R10
*
ST R13,NJECMDSA+4
LA R13,NJECMDSA
*
CMD000 EQU *
BAL R14,LOC000 Announce command being executed
*
CMD010 EQU *
LA R0,TGTCONS Console gets response
LA R1,CMNDBLOK -> local CMDBLOK area
ST R1,ACMDBLOK Set addr in cmd parm list
LA R1,INITPARM -> parm list
L R15,ANJECMX -> Command processor
BALR R14,R15
B XITCMD00
*
*
LOC000 EQU *
CLC CMNDUSER,=CL8'OP' Command from operator?
BER R14 Yes, skip location msg
*
ST R14,SV14 Save return addr
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE005I),NJE005I
LA R1,MACLIST+4+L'NJE005I -> next byte
MVC 0(8,R1),LCLNODE Local node
TRT 0(9,R1),BLANK Look for end
MVI 0(R1),C'('
MVC 1(8,R1),CMNDUSER Local userid
TRT 1(9,R1),BLANK Look for end
MVC 0(12,R1),=CL12') executing:'
LA R1,13(,R1) -> area for msg
SR R15,R15 Clear for IC
IC R15,CMNDBLEN Len of cmd text
C R15,=F'50' Allow 50 char max
BL *+8 We're ok
LA R15,50 Use 50
EX R15,MVCMTXT1 Move command text to msg
*
WTO ,MF=(E,MACLIST) Issue location executing msg
*
LOC090 EQU *
L R14,SV14 Reload return
BR R14 Return
*
MVCMTXT1 MVC 0(0,R1),CMDAREA executed instr
*
*
*
*
*
XITCMD00 EQU *
L R13,4(,R13) -> NJEREQ save area
LM R14,R12,12(R13) Reload callers regs
SR R15,R15
BR R14 Return to NJEREQ
*
LTORG
*
* 456789012345678901234567890123456789012345678901
NJE005I DC C'NJE005I Location ' Location executing
*
*
*
*
***************
* TIMER * THIS EXIT WILL KEEP THE JOB
* EXPIRATION * ACTIVE EVERY 20 MINUTES, AND
* EXIT * WILL KEEP THE JOB FROM ABENDING
*************** WITH AN S 522 ABEND (WAIT LIMIT)
*
NJETMR CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJETMR'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
STM R14,R12,12(R13)
LR R12,R15
USING NJETMR,R12
*
STIMER REAL, RESET THE TIMER AGAIN X
(12), POINT TO THE EXIT ROUTINE X
DINTVL=INTVL INTERVAL
*
LM R14,R12,12(R13) RELOAD REGS
SR R15,R15
BR R14 RETURN TO SYSTEM
*
DS 0D
* HHMMSSTH
INTVL DC CL8'00200000' 20 MINUTE TIMER
*
DROP R12
LTORG
*
*
*************** v212
* GET * v212
* TRACE * v212
* ENTRY * v212
*************** v212
*
NJETRC CSECT v212
B 28(,R15) BRANCH AROUND EYECATCHERS v212
DC AL1(23) LENGTH OF EYECATCHERS v212
DC CL9'NJETRC' v212
DC CL9'&SYSDATE' v212
DC CL5'&SYSTIME' v212
USING NJETRC,R15 v212
LR R0,R14 Save return addr v212
*
TRC000 EQU * v212
USING TRCCTL,R2 v212
L R1,TRCCURR -> current trace slot v212
LA R14,TRCSZ(,R1) -> next slot v212
C R14,TRCEND At end of table? v212
BL TRC010 No v212
L R14,TRCSTRT Y, wrap to beginning v212
LA R14,TRCSZ(,R14) -> Skip over first slot v212
*
TRC010 EQU * v212
CS R1,R14,TRCCURR Set new current v212
BC 4,TRC000 CC=1; no match; try again v212
*
XC 0(TRCSZ,R14),0(R14) Clear slot v212
DROP R2,R15 v212
*
LR R15,R0 Load return addr to.. R15 !v212
LM R0,R2,20(R13) Reload the rest v212
BR R15 Return via R15; v212
* New trace entry -> R14 v212
*
*
*
**** Main work area common
**** to all NJExxx CSECTs.
*
NJEMWK DSECT
NJEEYE DS CL4'NJEM' Eyecatcher; main task work area
NJEWKLEN DS F Getmain size of this area
*
DEFUSER DS CL8 Default userid from CONFIG v200
RELAYID DS CL8 Relay entity id v220
DBLE DS D Work area
TWRK DS 2D Work area
NCB1 DS XL48 NETSPOOL CB
*
NJEPARMS Define passed parameter list v220
*
MACLIST DS XL160 Macro expansion area
ANJECOM DS A -> NJECOM csect
COMMAREA DS A -> Console communications area
COMMECBA DS A -> Console communications ECB
REGUSER DS A -> REGUSER chain anchor v220
LINKS DS A -> LINKTABL chain anchor v211
ROUTES DS A -> RTE chain anchor v211
AUTHS DS A -> AUTHLIST chain anchor v211
CSAECBAD DS A -> WRE ECB in CSA (same as NJ38ECB)
*
ECBLIST DS 66A ECB list, 64 links + 2 COMM ECBs
*
NJFL1 DS X Flag byte
NJF1STOP EQU X'80' 1... .... Console STOP issued
NJF1ENQ EQU X'40' .1.. .... NJE38 system ENQ issued
NJF1VSER EQU X'02' .... ..1. NETSPOOL VSAM error occurred
NJF1INIT EQU X'01' .... ...1 NJEINIT task in RTM
* ..xx xx.. Available
*
NJFL2 DS X Flag byte
* xxxx xxxx Available
*
LASTRC DS X Last RC from NCBRTNCD
LASTERRC DS X Last errcd from NCBERRCD
*
FSAVE DS 2D
FWORK DS D
DHDR DS CL30
ABCODE DS CL7
FLAGS DS X
LKNAME DS CL8 Name of failing link
*
*
* Command response target
TGTUSER EQU 0 remote user
TGTCONS EQU 4 MVS system console
CMNDBLOK DS 0XL140 CMDBLOK
CMNDBLEN DS AL1 Command image ibm length
CMNDDMY DS XL3 Rest of CMDBLOK (unused here)
CMNDLINK DS CL8 Node of issuer
CMNDUSER DS CL8 yserid of issuer
CMDAREA DS CL120 Modify command image
*
CMDBLNK DS CL120 For TRT overflow, all blanks
*
JFCBDCB DS (NSPOOLN)X Space for DCB
JEXLST DS A DCB EXLST
*
NJERNAME DS CL12 12 ENQ RNAME,+44 for DSN in JFCB
JFCB DS XL176 Space for JFCB
*
SV14 DS A General use R14 save
SVR14R DS A General use R14 save
NJESA DS 18F NJEINIT OS save area
NJECMDSA DS 18F NJECMD OS save area
MVSSAVE DS 18F ESTAE exit OS save
BALRSAVE DS 16F Local register save area
*
DS 0D Force doubleword size
NJEWKSZ EQU *-NJEMWK
*
*
*-- System DSECTs
*
*
IEZCOM DSECT
IEZCOM
IEZCIB IEZCIB
IHAPSA
IHASDWA
IKJTCB
IHAASCB
IEZJSCB
*
CSCB DSECT
IEECHAIN MAP FOR A CSCB
CVT DSECT=YES,LIST=YES
DCBD DEVD=DA,DSORG=PS
*
COPY LINKTABL
COPY RTE
COPY AUTHLIST
COPY NETSPOOL
*
*-- NJE38 DSECTs
*
NJEWRE v220
NJERUSER v220
NJETRACE TYPE=DSECT v220
*
END NJEINIT
./ ADD NAME=NJEFMT
*
*
*-- NJE38 - NETSPOOL Formatter
*
*
* This program formats the NETSPOOL dataset.
*
*
*
*
REGEQU
NJEFMT CSECT
NJEVER
STM R14,R12,12(R13) SAVE CMS REGS
LR R12,R15 BASE
USING NJEFMT,R12 ADDRESS IT
*
GETMAIN RU, GET LOCAL STG AREA X
LV=NJEFSZ
LR R10,R1
LR R1,R0 COPY LENGTH
LR R2,R0 COPY LENGTH
LR R0,R10 -> NEW STG AREA
SR R15,R15 SET PAD
MVCL R0,R14 CLEAR THE PAGE
*
USING NJEFWK,R10
ST R13,NJESA+4 SAVE PRV S.A. ADDR
LA R1,NJESA -> MY SAVE AREA
ST R1,8(,R13) PLUG IT INTO PRIOR SA
LR R13,R1
*
MVC NJEEYE,=CL4'NJEF' Work area eyecatcher
ST R2,NJEWKLEN Save size of area
MVC SYSPRINT(DMYPRTL),DMYPRT Set up DCB
MVC LIST,BLANKS Init print line
*
MVC MACLIST(OPENL),OPEN Move OPEN list
OPEN (SYSPRINT,OUTPUT), Open the print dataset X
MF=(E,MACLIST)
*
MVC LIST(L'MSG001),MSG001
BAL R14,PUT Write the line
BAL R14,PUT Write blank line
*
GETMAIN RU, Get storage for NETSPOOL block x
LV=4089, x
BNDRY=PAGE
ST R1,BLK Save address
LR R8,R1 Keep in R8
*
LR R1,R0 Copy length
LR R0,R8 Copy address
SR R15,R15 Clear pad
MVCL R0,R14 Clear the stg
*
GENCB BLK=ACB, x
DDNAME=NETSPOOL, x
MACRF=(OUT,KEY,SEQ), x
MF=(G,MACLIST)
STM R0,R1,ACBL Save len, addr
*
LA R9,KEY -> block number argument
GENCB BLK=RPL, x
ACB=(*,ACB), x
AREA=(R8), -> block area x
AREALEN=4089, x
RECLEN=4089, x
ARG=(R9), x
OPTCD=(KEY,SEQ,MVE), x
MF=(G,MACLIST)
STM R0,R1,RPLL Save len, addr
*
L R7,ACB -> ACB
MVC MACLIST(OPENL),OPEN Move macro model
OPEN ((R7)), Open NETSPOOL x
MF=(E,MACLIST)
LTR R15,R15 Did open succeed?
BNZ OPENFAIL No
OI FLAGS1,FL1OPEN Indic ACB open
*
LA R5,HIRBA -> SHOWCB receipt fields
SHOWCB ACB=(R7), x
AREA=(R5), x
LENGTH=8, x
FIELDS=(HALCRBA,CINV), Hi alloc RBA + CISZ x
MF=(G,MACLIST)
*
CLC CISZ,=F'4096' Ensure CISZ is 4096
BNE BADCISZ It is not
L R5,HIRBA Get high allocated RBA
SRL R5,12 Divide by 4096
ST R5,BLKS Save number of blocks in d.set
*
L R6,RPL
USING IFGRPL,R6
LA R4,1 Init block counter
*
FMT000 EQU *
PUT RPL=(R6) Write a block
*
LTR R15,R15 Any errors?
BZ FMT010 No
CLI RPLRTNCD,X'08' Logical error?
BNE PUTFAIL No, display error
CLI RPLERRCD,X'08' Duplicate block?
BE FMT100 Cluster is already formatted
B PUTFAIL Display all other errors
*
FMT010 EQU *
LA R4,1(,R4) Count blocks
BCT R5,FMT000 Format exact amount
B FMT200 Now go write images
*
*-- Here if NETSPOOL was previously formatted
*
FMT100 EQU *
WTO 'NJEFMT - NETSPOOL dataset is already formatted'
WTO 'NJEFMT - Reformatting will cause loss of all data'
*
FMT110 EQU *
XC OPECB,OPECB Reinit ECB
LA R2,DBLE -> reply area
LA R3,OPECB -> WTOR ECB
MVC MACLIST(WTORDMYL),WTORDMY Move model WTOR
WTOR ,(R2),6,(R3),MF=(E,MACLIST)
*
WAIT 1,ECB=OPECB
CLC DBLE(6),=C'CANCEL' Was cancel chosen?
BE OPERCAN Yes
CLI DBLE,C'U' Was U chosen
BNE FMT110 Reissue msg
*
*-- Switch to direct processing and rewrite fresh initial images
*-- to the directory and allocation map to be a newly formatted file.
*
FMT200 EQU *
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE ((R7)), Close ACB X
MF=(E,MACLIST)
NI FLAGS1,255-FL1OPEN Indic ACB closed
*
MODCB ACB=(R7), Switch to direct x
MACRF=(KEY,DIR,OUT), x
MF=(G,MACLIST)
*
MODCB RPL=(R6), x
OPTCD=(KEY,DIR,UPD), Switch to direct update x
MF=(G,MACLIST)
*
MVC MACLIST(OPENL),OPEN Move macro model
OPEN ((R7)), Open NETSPOOL x
MF=(E,MACLIST)
LTR R15,R15 Did open succeed?
BNZ OPENFAIL No
OI FLAGS1,FL1OPEN Indic ACB open
*
L R2,BLK -> VSAM area
*
FMT210 EQU *
MVC KEY,=F'1' Set block # argument
GET RPL=(6)
LTR R15,R15 Any errors?
BNZ GETFAIL YES
*
LR R0,R2 -> block area
LA R1,4089 Size of block
LM R14,R15,BLK1 Get block data addr, pad+len
MVCL R0,R14 Init the block, SPL ID=0
MVC 8(4,R2),BLKS Set max # blocks in dataset
*
PUT RPL=(6) Update the block
LTR R15,R15 Any errors?
BNZ PUTFAIL2 YES
*
FMT220 EQU *
MVC KEY,=F'2' Set block # argument
GET RPL=(6)
LTR R15,R15 Any errors?
BNZ GETFAIL YES
*
LR R0,R2 -> block area
LA R1,4089 Size of block
LM R14,R15,BLK2 Get block data addr, pad+len
MVCL R0,R14 Init the block
*
PUT RPL=(6) Update the block
LTR R15,R15 Any errors?
BNZ PUTFAIL2 YES
*
FMT230 EQU *
MVC KEY,=F'3' Set block # argument
GET RPL=(6)
LTR R15,R15 Any errors?
BNZ GETFAIL YES
*
LR R0,R2 -> block area
LA R1,4089 Size of block
LM R14,R15,BLK3 Get block data addr, pad+len
MVCL R0,R14 Init the block
*
PUT RPL=(6) Update the block
LTR R15,R15 Any errors?
BNZ PUTFAIL2 YES
*
*-- Set up allocation map
*
* The allocation map is a bit map, 1 bit for each block in the
* NETSPOOL dataset. A "1" bit means the block is in use. Initially,
* blocks 1-7 will be marked in use as they contain upon formatting:
* block 1 - pointer to directory (A or B) and allocation blocks
* block 2 - initial directory block A
* block 3 - initial directory block B
* blocks 4-7 - allocation bit map
*
* The bitmap contains 4 * 4096 bytes * 8 bits = 130,848 bits. Thus,
* the largest supported NETSPOOL size is about 874 cylinders on a
* 3380 DASD.
*
* The size of the NETSPOOL dataset can of course be smaller and all
* bits past the end of the file should be marked as "in-use" in the
* bitmap so they would never be allocated.
*
* The calculation for this is at FMT250.
* Example: assume 10 cylinder file on 3380 = 150 blocks per cyl,
* or 1500 total blocks in file.
*
* Starting from block 1501 (the first block past the end of the
* dataset) divide by 8 to compute the byte number in the bitmap
* representing block 1501:
*
* 1. 1501 / 8 = 187 remainder 5
* 2. Make a byte image of X'FF' (all records unavail in byte).
* 3. Shift it to the right by the remainder (adding 0's on the left):
* X'FF' shifted right by 5 = X'07'
* 4. Store the X'07' computed value into byte 187 of the bitmap.
* 5. All subsequent bytes 188 through the end of four blocks are X'FF'
* 6. Write the four blocks to disk.
*
FMT240 EQU *
GETMAIN RU,LV=16384 4 blocks of size
LR R4,R1
LR R1,R0 COPY LENGTH
LR R0,R4 -> NEW STG AREA
SR R15,R15 SET PAD
MVCL R0,R14 CLEAR THE PAGES
*
MVC 0(1,R4),DATA4 Set up allocation; blocks 1-7
* are initially in use
FMT250 EQU *
L R7,BLKS Get # blocks in dataset
LA R7,1(,R7) block # of first unavail blk
SR R6,R6 Clear for divide
D R6,=F'8' Get byte offset remainder bits
*
AR R7,R4 -> byte containing bit for
* first record beyond file size
ICM R1,8,=X'FF' Assume all recs in byte unavail
SRL R1,0(R6) Adjust for actual blocks that
* do exist in same byte
STCM R1,8,0(R7) Store it in map
*
LA R0,1(,R7) -> next byte in map
L R1,=F'16384' Stg size
AR R1,R4 Point to end of it
SR R1,R0 Compute length to end
L R15,=X'FF000000' Set all FFs pad char
MVCL R0,R14 All FFs to the end
*
*
LA R3,4 Blk # of allocation map
LA R7,4 # of blocks to process
L R6,RPL -> RPL
*
FMT270 EQU * Write map blocks 4 through 7
ST R3,KEY Set block # argument
GET RPL=(6)
LTR R15,R15 Any errors?
BNZ GETFAIL YES
*
LR R0,R2 -> block area
LA R1,4089 Size of block
LA R5,4089 Size of block
MVCL R0,R4 Init the block
*
PUT RPL=(6) Update the block
LTR R15,R15 Any errors?
BNZ PUTFAIL2 YES
*
LA R3,1(,R3) next blk #
BCT R7,FMT270
B EXIT0 Format success
*
*-- Error routines
*
OPENFAIL EQU *
MVC LIST(L'MSG002),MSG002 Open failed
CVD R15,DBLE Convert RC
UNPK LIST+29(2),DBLE
OI LIST+30,X'F0'
USING IFGACB,R7
UNPK DBLE(3),ACBERFLG(2)
TR DBLE(2),HEXTRAN-240
MVC LIST+43(2),DBLE Move error value to line
DROP R7
BAL R14,PUT Write open fail msg
B EXIT8
*
BADCISZ EQU *
MVC LIST(L'MSG004),MSG004 NETSPOOL dataset definition err
BAL R14,PUT Write msg
MVC LIST(L'MSG005),MSG005 CISZ must be 4096
BAL R14,PUT Write msg
B EXIT8
*
OPERCAN EQU *
MVC LIST(L'MSG006),MSG006 Formatting terminated by oper
BAL R14,PUT Write msg
B EXIT8
*
PUTFAIL EQU *
MVC LIST(L'MSG003),MSG003 PUT failed
CVD R5,DBLE Convert block number
MVC LIST+25(8),=X'4020202020202120' Move edit mask
ED LIST+25(8),DBLE+4 Edit block count
USING IFGRPL,R6
UNPK TWRK(9),RPLFDBWD(5)
TR TWRK(8),HEXTRAN-240
MVC LIST+48(2),TWRK+2 Move RTNCD value to line
MVC LIST+50(2),TWRK+6 Move FDBK value to line
DROP R6
BAL R14,PUT Write open fail msg
B EXIT8
*
GETFAIL EQU *
MVC LIST(L'MSG007),MSG007 Get failed
CVD R3,DBLE Convert block number
MVC LIST+25(8),=X'4020202020202120' Move edit mask
ED LIST+25(8),DBLE+4 Edit block count
USING IFGRPL,R6
UNPK TWRK(9),RPLFDBWD(5)
TR TWRK(8),HEXTRAN-240
MVC LIST+48(2),TWRK+2 Move RTNCD value to line
MVC LIST+50(2),TWRK+6 Move FDBK value to line
DROP R6
BAL R14,PUT Write open fail msg
B EXIT8
*
PUTFAIL2 EQU *
MVC LIST(L'MSG008),MSG008 PUT failed
CVD R5,DBLE Convert block number
MVC LIST+26(8),=X'4020202020202120' Move edit mask
ED LIST+26(8),DBLE+4 Edit block count
USING IFGRPL,R6
UNPK TWRK(9),RPLFDBWD(5)
TR TWRK(8),HEXTRAN-240
MVC LIST+49(2),TWRK+2 Move RTNCD value to line
MVC LIST+51(2),TWRK+6 Move FDBK value to line
DROP R6
BAL R14,PUT Write open fail msg
B EXIT8
*
PUT EQU *
ST R14,SV14 Save return addr
PUT SYSPRINT,LIST
MVC LIST,BLANKS
L R14,SV14 Load return addr
BR R14 Return
*
EXIT8 EQU *
BAL R14,PUT Write blank
MVC LIST(L'MSG999),MSG999 Exited with errors
BAL R14,PUT Write msg
*
LA R15,8
B QUIT000
*
EXIT0 EQU *
BAL R14,PUT Write blank
MVC LIST(L'MSG900),MSG900 Exited with success
BAL R14,PUT Write msg
*
SR R15,R15
*
QUIT000 EQU *
LR R5,R15 Copy exit RC
*
TM FLAGS1,FL1OPEN Is ACB open?
BZ QUIT010 No, skip close
MVC MACLIST(CLOSEL),CLOSE Move close list
L R7,ACB -> ACB
CLOSE ((R7)), Close ACB X
MF=(E,MACLIST)
*
QUIT010 EQU *
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (SYSPRINT), X
MF=(E,MACLIST)
*
LM R0,R1,RPLL
FREEMAIN RU,LV=(0),A=(1)
*
LM R0,R1,ACBL
FREEMAIN RU,LV=(0),A=(1)
*
L R1,BLK
FREEMAIN RU,LV=4089,A=(1)
*
LR R1,R10 -> NJEFWK work area
L R13,4(,R13) -> CALLER'S SA
FREEMAIN RU, Free the work area X
LV=NJEFSZ, X
A=(1)
*
ST R5,16(,R13) Save R15 RC
LM R14,R12,12(R13) RELOAD SYSTEM'S REGS
BR R14 Return
*
LTORG
*
DMYPRT DCB DDNAME=SYSPRINT, X
MACRF=(PM), X
DSORG=PS, X
LRECL=80, X
RECFM=FB, X
BLKSIZE=800
DMYPRTL EQU *-DMYPRT
*
OPEN OPEN 0,MF=L
OPENL EQU *-OPEN
CLOSE CLOSE 0,MF=L
CLOSEL EQU *-CLOSE
*
WTORDMY WTOR 'NJEFMT - Reply U to proceed with format, or CANCEL', x
MF=L
WTORDMYL EQU *-WTORDMY
*
MSG001 DC C'NJEFMT - NJE38 NETSPOOL FORMAT UTILITY'
* 0123456789012345678901234567890123456789012 345 6789
MSG002 DC C'Open failed for NETSPOOL, RC=xx,ACBERFLG=X''xx'''
* 012345678901234567890123456789012345678901234567 8901
MSG003 DC C'PUT failed writing record xxxxxxx, RTNCD-FDBK=X''xxxx'x
''
MSG004 DC C'NETSPOOL dataset definition error:'
MSG005 DC C' CONTROLINTERVALSIZE must be exactly 4096 bytes'
MSG006 DC C'Formatting terminated by system operator'
MSG007 DC C'GET failed reading record xxxxxxx, RTNCD-FDBK=X''xxxx'x
''
MSG008 DC C'PUT failed updating record xxxxxxx, RTNCD-FDBK=X''xxxxX
'''
MSG900 DC C'Format utility completed successfully'
MSG999 DC C'Format utility terminated with errors'
*
BLANKS DC CL80' '
HEXTRAN DC CL16'0123456789ABCDEF'
*
*
*
*
BLK1 DC A(DATA1),A(DATA1L) Addr and length
DATA1 DC F'2' Blk # of current directory
DC F'4' Blk # of allocation map
DC F'0' # blks in dataset
DC F'0' Last assigned spool file id #
DATA1L EQU *-DATA1
*
BLK2 DC A(DATA2),A(DATA2L) Addr and length
DATA2 EQU *
DC AL2(NSDIRLN) LEN Length of record
DC AL2(0) RESV1 reserved
DC F'2' BLK blk # of 1st block of file
DC CL8'NETSPOOL' INLOC
DC CL16' ' LINK/INTOD
DC CL8'DIR' INVM
DC AL4(1) RECNM No. records in the file
* Remainder of block is zeros
*
DATA2L EQU *-DATA2
*
BLK3 DC A(DATA3),A(DATA3L) Addr and length
DATA3 EQU *
DC AL2(NSDIRLN) LEN Length of record
DC AL2(0) RESV1 reserved
DC F'3' BLK blk # of 1st block of file
DC CL8'NETSPOOL' INLOC
DC CL16' ' LINK/INTOD
DC CL8'DIR' INVM
DC AL4(1) RECNM No. records in the file
* Remainder of block is zeros
DATA3L EQU *-DATA3
*
DATA4 DC B'11111110' Blocks initially allocated are
* blocks 1-7
*
* The rest of blocks 4 and 5,6,7 are computed at FMT250 and written
* at FMT270.
*
*
*
NJEFWK DSECT
NJEEYE DS CL4'NJEF' EYECATCHER
NJEWKLEN DS F SIZE OF WORK AREA
*
NJESA DS 18F
DBLE DS D
TWRK DS XL16
MACLIST DS XL128
LIST DS CL80 PRINT LINE
SV14 DS F R14 save area
OPECB DS F Operator reply ECB
BLK DS A -> NETSPOOL block stg area
KEY DS F Relative block number key
ACBL DS F ACB length
ACB DS A -> ACB
RPLL DS F RPL length
RPL DS A -> RPL
HIRBA DS F High allocated RBA
CISZ DS F CI Size
BLKS DS F Number of relative blocks
*
FLAGS1 DS X
FL1OPEN EQU X'80' 1... .... ACB is open
*
SYSPRINT DS (DMYPRTL)X SYSPRINT DCB
DS 0D Force doubleword boundary
NJEFSZ EQU *-NJEFWK Size of work area
*
COPY NETSPOOL
IFGACB
IFGRPL
END
./ ADD NAME=NJESCN
*
*
*-- NJE38 - Configuration scan and create
*
*
* Called by NJEINIT (on start up)
* Called by NJECMX (for commands entered by users and operators)
*
*
* Change log:
*
* 04 Dec 20 - Expanded internal trace table support v212
* 29 Nov 20 - Initial creation v211
*
*
*
* notes for doc:
*
* -keywords must start in col 1
* -keywords and values 1-8 bytes only
* -last keyword or value on line must have a trailing blank (e.g,
* column 80 must be blank)
* -CUU must be 3-digit
* -ROUTE names are not validated for existence, or character makeup
*
*
*
GBLC &VERS
REGEQU
NJESCN CSECT NJE00020
NJEVER
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
LA R11,2048
LA R11,2048(R11,R12) 2nd Base
USING NJESCN,R12,R11 NJE00070
LR R7,R0 Save input code
LR R8,R1 Save input parm list addr
LR R9,R2 Save input parm list addr
*
LA R0,NJEWKSZ Size of work area
GETMAIN RU, Get local stg area X
LV=(0), X
BNDRY=PAGE
LR R10,R1
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the stg
*
USING NJEWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC NJEEYE,=CL4'NJES' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
STM R8,R9,INITPLST Save entry parm list addrs
MVC INITPARM,0(R8) Copy passed parameters
*
INIT000 EQU *
B INIT010(R7) Branch into request table
*
INIT010 EQU *
B SCN000 00 Scan and create configuration
B CMD000 04 Scan a configuration command
*
SCN000 EQU *
MVC CONFIG,DMYDCB Set up DCB
LA R1,JFCBL -> JFCB area
ST R1,EXLST Plug into exit list
MVI EXLST,X'87' Set up for JFCB retrieve
LA R4,CONFIG -> DCB
USING IHADCB,R4
LA R1,EXLST -> exit list
STCM R1,7,DCBEXLST+1 Plug it into DCB
*
MVC MACLIST(RDJFCBL),RDJFCB Move macro model
RDJFCB CONFIG,MF=(E,MACLIST)
*
MVC MACLIST(OPENL),OPEN Move macro model
OPEN (CONFIG,INPUT), Open dataset x
MF=(E,MACLIST)
TM DCBOFLGS,DCBOFOPN Did DCB open ok?
BZ EXIT08 No
DROP R4 IHADCB
OI NJFL1,F1OPEN Indicate DCB is open
*
LA R3,JFCBL
USING JFCB,R3
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE049I),NJE049I Using configuration DSN
MVC WTOTXT+28(44),JFCBDSNM Move DSN
TM JFCBIND1,JFCPDS Using PDS member?
BZ SCN030 No
TRT WTOTXT+28(45),BLANK Look for end of DSN
MVI 0(R1),C'('
MVC 1(8,R1),JFCBELNM Move member name
TRT 0(10,R1),BLANK Look for end of member name
MVI 0(R1),C')'
DROP R3 JFCB
*
SCN030 EQU *
WTO ,MF=(E,WTOMSG) Write the using config msg
SR R9,R9 Init record counter
*
SCN040 EQU *
GET CONFIG,REC Get a record from CONFIG DD
LA R1,REC -> RECORD
LA R9,1(,R9) Bump record count
CLI 0(R1),C'*' Comment line?
BE SCN040 Yes, skip it
CLI 0(R1),C' ' Blank leading off the line?
BE ERR073 Yes, this is invalid
*
OC REC,BLANKS Upper case the record
LA R15,80 Scan length of input line
B CTK000 Join common code
*
SCN100 EQU * End of scan of one record
B SCN040 Scan next
*
*
*
CMD000 EQU *
L R2,ACMDBLOK -> CMDBLOK
USING CMDBLOK,R2
MVC REC,BLANKS Init receiving field
IC R1,CMDBLEN Len of command text
EX R1,OCCMD Move and uppercase cmd image
DROP R2 CMDBLOK
LA R15,120 Max len of command image
LA R1,REC -> Command image
*
CTK000 EQU *
BAL R14,TKN000 Parse and tokenize the cmd
LA R15,TOKENS-L'TOKENS -> 0th length/token in list
BAL R14,GETTKN Get 1st token
*
CLC =CL8'LOCAL',1(R15) Local?
BE LCL000 Yes
CLC =CL8'LINK',1(R15) Link?
BE LNK000 Yes
CLC =CL8'ROUTE',1(R15) Route?
BE RTE000 Yes
CLC =CL8'AUTH',1(R15) Auth?
BE AUTH000 Yes
B ERR076 Unknown configuration statement
*
OCCMD OC REC(0),CMDTEXT-CMDBLOK(R2) Executed instr
*
RETURN EQU * R7 branch table index
B SCN040 00 Read another config record
B EXIT00 04 End of command processing
*
*-- LOCAL
*
LCL000 EQU *
L R1,ALINKS -> LINKS anchor word
NC 0(4,R1),0(R1) Was LOCAL processed?
BNZ ERR052 Y, only one LOCAL allowed
LA R0,LINKLEN Length of LINKTABL entry
BAL R14,GETSTG Get stg for entry
LR R8,R1
XC 0(LINKLEN,R8),0(R8) Initialize entry
USING LINKTABL,R8
*
BAL R14,GETTKN Get next token
BZ ERR075 No local name
MVC LINKID,1(R15) Local node name to entry
TRT LINKID,VALDNAME Valid node name?
BNZ ERR043 No
*
MVC LDEFUSER,DEFUSER Set default userid
BAL R14,GETTKN Get next tkn (should be DEFUSER)
BZ LCL090 No other tokens
CLC =CL8'DEFUSER',1(R15) Was this the DEFUSER keyword?
BNE ERR055 No, error
BAL R14,GETTKN Get next tkn (should be userid)
BZ ERR075 Missing userid
MVC LDEFUSER,1(R15) Set default userid of choice
DROP R8 LINKTABL
*
LCL090 EQU *
L R15,ALINKS -> LINKS anchor word
ST R8,0(,R15) Start LINKS chain
B RETURN(R7) Resume scan
*
*
*-- LINK
*
LNK000 EQU *
L R1,ALINKS -> LINKS anchor word
NC 0(4,R1),0(R1) Was LOCAL processed?
BZ ERR053 No; it is required
LA R8,BLDBUF Temp area to build entry
XC 0(LINKLEN,R8),0(R8) Initialize entry
USING LINKTABL,R8
MVC LBUFF,=H'1012' Set default buffer size
*
BAL R14,GETTKN Get next token
BZ ERR075 No link name
MVC LINKID,1(R15) Link node name to entry
TRT LINKID,VALDNAME Valid node name?
BNZ ERR043 No
*
LNK010 EQU *
BAL R14,GETTKN Get next tkn
BZ LNK050 None
*
CLC =CL8'LINE',1(R15) Was it a LINE keyword?
BE LNE000 Yes
CLC =CL8'BUFF',1(R15) Was it a BUFF keyword?
BE BUF000 Yes
CLC =CL8'AUTO',1(R15) Was it a AUTO keyword?
BE ATO000 Yes
CLC =CL8'OFF',1(R15) Was it the OFF keyword?
BE LOFF000 Yes
B ERR055 Unrecognized keyword
*
LNK050 EQU *
TM NJFL2,F2LINE Was line CUU found?
BZ ERR077 No, its required
*
*-- LINK successfully scanned. Now add the LINKTABL entry to chain.
*
L R2,ALINKS -> LINKS anchor word (0th entry)
L R2,0(,R2) -> First LINKTABL e.g. LOCAL
*
LNK060 EQU *
ICM R3,15,LNEXT-LINKTABL(R2) -> next LINKTABL entry
BZ LNK080 Found the end
CLC LINKID,LINKID-LINKTABL(R3) Match on link name?
BE LNK120 Yes, trying to add duplicate
*
LNK070 EQU *
LR R2,R3 Copy next entry ptr
B LNK060 Keep scanning for end
*
LNK080 EQU *
LA R0,LINKLEN Size of LINKTABL entry
BAL R14,GETSTG Get an actual entry
MVC 0(LINKLEN,R1),0(R8) Make build entry a permanent one
ST R1,LNEXT-LINKTABL(,R2) Add R1 LINKTABL to chain end
*
LNK090 EQU *
LTR R7,R7 Doing CONFIG scan?
BZ SCN100 Yes, Resume scan
*
*--Issue LINK cmd success msg
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE066I),NJE066I
MVC WTOTXT+13(8),LINKID Move link name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(7,R1),=CL7'defined'
LA R0,22(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B SUCCMSG Issue success msg and exit
*
LNK120 EQU * ** Here for duplicate entry
*--Issue LINK cmd duplicate msg
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE048E),NJE048E
MVC WTOTXT+13(8),LINKID Move link name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(20,R1),=CL20'duplicate definition'
LTR R7,R7 Doing CONFIG scan?
BZ LNK130 Yes, issue duplicate msg
MVC 1(20,R1),=CL20'is already defined'
*
LNK130 EQU *
LA R0,34(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B ERRTYPE(R7) Issue dup msg
*
LNE000 EQU *
BAL R14,GETTKN Get next tkn
BZ ERR075 Missing CUU
CLI 0(R15),X'02' Check keyword length
BNE ERR078 Not valid CUU
LR R3,R1 Save R1 across TRT
TRT 1(3,R15),INVALHEX Valid hex chars?
BNZ ERR078 Not valid cuu
*
LR R1,R3 Restore R1
MVC TWRK(3),1(R15) Move the character CUU
TR TWRK(3),TRANHEX-192 Make all A-F chars = xFA-XFF
*
PACK DBLE(3),TWRK(4) Strip the zones
MVC LDEFLINE,DBLE Move to LINKTABL entry
OI NJFL2,F2LINE Indicate valid LINE CUU found
B LNK010 Continue LINK token eval
*
BUF000 EQU *
BAL R14,GETTKN Get next tkn
BZ ERR075 Missing buffersize
SR R3,R3 Clear for IC
IC R3,0(,R15) Length of value characters
EX R3,BFMVC Make a copy of value
EX R3,BFOC Force copy to be numeric
EX R3,BFCLC Was original numeric?
BNE ERR054 Invalid BUFF value
EX R3,BFPACK Pack the value
CVB R0,DBLE Get binary value
CH R0,=H'300' Too small?
BL ERR054 Yes
CH R0,=H'4020' Too large?
BH ERR054 Yes
STH R0,LBUFF Else set specified BUFF size
B LNK010 Continue LINK token eval
*
BFMVC MVC DBLE(0),1(R15) executed instr
BFOC OC DBLE(0),=8C'0' executed instr
BFCLC CLC DBLE(0),1(R15) executed instr
BFPACK PACK DBLE(8),1(0,R15) executed instr
*
ATO000 EQU *
BAL R14,GETTKN Get next tkn
BZ ERR075 Missing YES/NO
CLC =CL8'YES',1(R15) Was it yes?
BE ATO020
CLC =CL8'NO',1(R15) Was it no?
BE LNK010 Line will not be autostartable
B ERR078 Unrecognized value
*
ATO020 EQU *
OI LFLAG,LAUTO Set line auto-startable
B LNK010 Continue LINK token eval
*
LOFF000 EQU *
LTR R7,R7 Doing config scan?
BZ ERR055 OFF not recognized in CONFIG
L R2,ALINKS -> LINKS anchor word
L R2,0(,R2) -> 1st entry (LOCAL entry)
*
LOFF010 EQU *
ICM R3,15,LNEXT-LINKTABL(R2) -> next link entry
BZ LOFF050 Found the end, linkid not fnd
CLC LINKID,LINKID-LINKTABL(R3) Match on name?
BNE LOFF020 No, next
*
TM LFLAG-LINKTABL(R3),LCONNECT+LACTIVE+LDRAIN Link busy?
BNZ ERR046 Yes, can't remove it
CLC LTCBA-LINKTABL(,R3),=A(0) Task active on link?
BNE ERR046 Nonzero, can't remove it
*
* Remove the matching entry from the LINKTABL chain:
MVC LNEXT-LINKTABL(,R2),LNEXT-LINKTABL(R3)
*
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE046I),NJE046I
MVC WTOTXT+13(8),LINKID-LINKTABL(R3) Move link name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(7,R1),=CL7'deleted'
LA R2,13+8(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R2,R1 Compute length to display
FREEMAIN RU, Free entry that was removed v211x
LV=LINKLEN, v211x
A=(3), v211x
SP=1 v211
*
*** LA R3,LTRMECB-LINKTABL(,R3) -> task termination ECB
*** POST (3),255 Signal NJEINIT to delete link
*
LR R0,R2 Msg length to R0
B SUCCMSG Issue success msg
*
LOFF020 EQU *
LR R2,R3 Copy next entry
B LOFF010 Keep scanning for end
*
LOFF050 EQU *
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE045I),NJE045I
MVC WTOTXT+13(8),LINKID Move name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(14,R1),=CL14'is not defined'
LA R0,13+15(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B SUCCMSG Issue success msg
DROP R8 LINKTABL
*
*-- ROUTE
*
RTE000 EQU *
L R1,ALINKS -> LINKS anchor word
NC 0(4,R1),0(R1) Was LOCAL processed?
BZ ERR053 No; it is required
LA R8,BLDBUF Temp area to build entry
XC 0(ROUTSIZE,R8),0(R8) Initialize entry
USING RTE,R8
MVC ROUTALT1,BLANKS Init
MVC ROUTALT2,BLANKS Init
MVC ROUTALT3,BLANKS Init
*
BAL R14,GETTKN Get next token
BZ ERR075 No link name
MVC ROUTNAME,1(R15) Route node name destination
TRT ROUTNAME,VALDNAME Valid node name?
BZ RTE010 Yes
CLM R2,1,=C'*' Was wildcard in use?
BNE ERR043 No. The name contains inv char
*
RTE010 EQU *
BAL R14,GETTKN Get next tkn
BZ RTE050 None
*
CLC =CL8'TO',1(R15) Was it the TO keyword?
BE TO000 Yes
CLC =CL8'ALT',1(R15) Was it a ALT keyword?
BE ALT000 Yes
CLC =CL8'OFF',1(R15) Was it the OFF keyword?
BE ROFF000 Yes
B ERR055 Unrecognized keyword
*
RTE050 EQU *
TM NJFL2,F2RTO Was ROUTE TO processed?
BZ ERR051 No, its required
*
*-- ROUTE successfully scanned.
*
* 1. first check for existing name; if so, update existing.
* 2. else add new route in collating sequence, except that the
* wildcard character (if present) is treated as a X'FF' character
* in order to force wildcard routes after all explicity named
* routes.
*
L R2,AROUTES -> ROUTES anchor word (0th RTE)
*
RTE060 EQU *
ICM R3,15,ROUTPTR-RTE(R2) -> next RTE entry
BZ RTE080 Found the end
CLC ROUTNAME,ROUTNAME-RTE(R3) Match on name?
BE RTE070 Yes, update duplicate
LR R2,R3 Copy next entry
B RTE060 Keep scanning for end
*
*-- Update existing route
RTE070 EQU *
L R0,ROUTPTR-RTE(,R3) Save RTE next ptr
MVC 0(ROUTSIZE,R3),0(R8) Update&replace existing route
ST R0,ROUTPTR-RTE(,R3) Restore the next ptr
B RTE200 Issue success msg
*
*-- Add new route to chain in collating seq based on route name
RTE080 EQU *
L R2,AROUTES -> ROUTES anchor word (0th RTE)
MVC DBLE,ROUTNAME Copy name we want to add
TR DBLE,ASTER Set any * char high
*
RTE090 EQU *
ICM R3,15,ROUTPTR-RTE(R2) -> next RTE entry
BZ RTE100 Found the end; add to end
MVC TWRK,ROUTNAME-RTE(R3) Copy name in chained RTE
TR TWRK,ASTER Set any * char high
CLC DBLE,TWRK Locate place to insert RTE
BL RTE100
LR R2,R3 Copy next entry
B RTE090 Keep scanning for end
*
RTE100 EQU *
LA R0,ROUTSIZE Length of RTE entry
BAL R14,GETSTG Get stg for entry
MVC 0(ROUTSIZE,R1),0(R8) Make build entry a permanent one
ST R1,ROUTPTR-RTE(,R2) Insert R1 RTE into chain
ST R3,ROUTPTR-RTE(,R1) R1 RTE now points to next RTE
*
RTE200 EQU *
LTR R7,R7 Doing CONFIG scan?
BZ SCN100 Yes, Resume scan
*
*--Issue ROUTE cmd success msg
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE065I),NJE065I
MVC WTOTXT+13(8),ROUTNAME Move route name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(19,R1),=CL19'routed through link'
MVC 21(8,R1),ROUTNEXT Move link name to msg
LA R0,21+8(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B SUCCMSG Issue success msg and exit
*
TO000 EQU *
BAL R14,GETTKN Get next tkn
BZ ERR075 Missing node id
MVC ROUTNEXT,1(R15) Move the route-to link id
TRT ROUTNEXT,VALDNAME Valid node name?
BNZ ERR043 Invalid node name if not
OI NJFL2,F2RTO Indicate ROUTE TO processed
B RTE010 Continue route scan
*
ALT000 EQU *
LA R3,ROUTALT1 -> first alternate node id slot
LA R4,3 Max number of alternates
*
ALT010 EQU *
BAL R14,GETTKN Get next tkn
BZ RTE050 Done with route scan
MVC 0(8,R3),1(R15) Move the route alternate id
LA R3,8(,R3) -> next alternate slot
BCT R4,ALT010 Continue route scan
B RTE050 Done with route scan
*
ROFF000 EQU *
LTR R7,R7 Doing config scan?
BZ ERR055 OFF not recognized in CONFIG
L R2,AROUTES -> ROUTES anchor (0th entry)
*
ROFF010 EQU *
ICM R3,15,ROUTPTR-RTE(R2) -> next RTE entry
BZ ROFF050 Found the end, user/node not fnd
CLC ROUTNAME,ROUTNAME-RTE(R3) Match on name?
BNE ROFF020 No, next
*
* Remove the matching entry from the RTE chain:
MVC ROUTPTR-RTE(,R2),ROUTPTR-RTE(R3)
*
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE064I),NJE064I
MVC WTOTXT+23(8),ROUTNAME-RTE(R3) Move route name to msg
TRT WTOTXT+23(9),BLANK Look for end
MVC 1(7,R1),=CL7'deleted'
LA R2,23+8(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R2,R1 Compute length to display
FREEMAIN RU, Free entry that was removed x
LV=ROUTSIZE, x
A=(3), x
SP=1
LR R0,R2 Msg length to R0
B SUCCMSG Issue success msg
*
ROFF020 EQU *
LR R2,R3 Copy next entry
B ROFF010 Keep scanning for end
*
ROFF050 EQU *
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE063I),NJE063I
MVC WTOTXT+13(8),ROUTNAME Move name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(13,R1),=CL13'is not routed'
LA R0,13+14(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B SUCCMSG Issue success msg
DROP R8 RTE
*
*-- AUTH
*
AUTH000 EQU *
L R1,ALINKS -> LINKS anchor word
NC 0(4,R1),0(R1) Was LOCAL processed?
BZ ERR053 No; it is required
LA R8,BLDBUF Temp area to build entry
XC 0(AUTHSIZE,R8),0(R8) Initialize entry
USING AUTHLIST,R8
*
BAL R14,GETTKN Get next token
BZ ERR075 No userid
MVC AUTHUSER,1(R15) Authorized userid
*
AUTH010 EQU *
BAL R14,GETTKN Get next tkn
BZ AUTH050 None
*
CLC =CL8'AT',1(R15) Was it the AT keyword?
BE AT000 Yes
CLC =CL8'OFF',1(R15) Was it the OFF keyword?
BE AOFF000 Yes
B ERR055 Unrecognized keyword
*
AUTH050 EQU *
TM NJFL2,F2AAT Was AUTH AT processed?
BZ ERR050 No, its required
*
*-- AUTH successfully scanned. Now add the AUTH entry to chain.
*
L R2,AAUTHS -> AUTHS anchor word (0th entry)
*
AUTH060 EQU *
ICM R3,15,AUTHPTR-AUTHLIST(R2) -> next AUTHLIST entry
BZ AUTH080 Found the end
CLC AUTHUSER,AUTHUSER-AUTHLIST(R3) Match on userid?
BNE AUTH070 No, next
CLC AUTHNODE,AUTHNODE-AUTHLIST(R3) Match on node?
BE AUTH120 Yes, trying to add duplicate
*
AUTH070 EQU *
LR R2,R3 Copy next entry ptr
B AUTH060 Keep scanning for end
*
AUTH080 EQU *
LA R0,AUTHSIZE Size of AUTHLIST entry
BAL R14,GETSTG Get an actual entry
MVC 0(AUTHSIZE,R1),0(R8) Make build entry a permanent one
ST R1,AUTHPTR-AUTHLIST(,R2) Add R1 AUTHLIST to chain end
*
AUTH090 EQU *
LTR R7,R7 Doing CONFIG scan?
BZ SCN100 Yes, Resume scan
*
*--Issue AUTH cmd success msg
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE068I),NJE068I
MVC WTOTXT+13(8),AUTHUSER Move auth name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(2,R1),=CL2'at'
MVC 4(8,R1),AUTHNODE Move link name to msg
TRT 4(9,R1),BLANK Look for end
MVC 1(17,R1),=CL17'is now authorized'
LA R0,18(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B SUCCMSG Issue success msg and exit
*
AUTH120 EQU * ** Here for duplicate entry
LTR R7,R7 Doing CONFIG scan?
BZ SCN100 Yes, skip duplicate msg
*--Issue AUTH cmd duplicate msg
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE067I),NJE067I
MVC WTOTXT+13(8),AUTHUSER Move auth name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(2,R1),=CL2'at'
MVC 4(8,R1),AUTHNODE Move link name to msg
TRT 4(9,R1),BLANK Look for end
MVC 1(21,R1),=CL21'is already authorized'
LA R0,22(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B ERRMSG Issue dup msg to cmd issuer
*
AT000 EQU *
BAL R14,GETTKN Get next tkn
BZ ERR075 Missing node id
MVC AUTHNODE,1(R15) Move the auth node id to list
TRT AUTHNODE,VALDNAME Valid node name?
BNZ ERR043 No
OI NJFL2,F2AAT Indicate AUTH AT processed
B AUTH010 Continue AUTH scan
*
AOFF000 EQU *
LTR R7,R7 Doing config scan?
BZ ERR055 OFF not recognized in CONFIG
L R2,AAUTHS -> AUTHS anchor word (0th entry)
*
AOFF010 EQU *
ICM R3,15,AUTHPTR-AUTHLIST(R2) -> next AUTHLIST entry
BZ AOFF050 Found the end, user/node not fnd
CLC AUTHUSER,AUTHUSER-AUTHLIST(R3) Match on userid?
BNE AOFF020 No, next
CLC AUTHNODE,AUTHNODE-AUTHLIST(R3) Match on node?
BNE AOFF020 No, next
*
* Remove the matching entry from the AUTHLIST chain:
MVC AUTHPTR-AUTHLIST(,R2),AUTHPTR-AUTHLIST(R3)
*
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE070I),NJE070I
MVC WTOTXT+13(8),AUTHUSER-AUTHLIST(R3) Move auth name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(2,R1),=CL2'at'
MVC 4(8,R1),AUTHNODE-AUTHLIST(R3) Move node name to msg
TRT 4(9,R1),BLANK Look for end
MVC 1(23,R1),=CL23'is no longer authorized'
LA R2,24(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R2,R1 Compute length to display
FREEMAIN RU, Free entry that was removed x
LV=AUTHSIZE, x
A=(3), x
SP=1
LR R0,R2 Msg length to R0
B SUCCMSG Issue success msg
*
AOFF020 EQU *
LR R2,R3 Copy next entry
B AOFF010 Keep scanning for end
*
AOFF050 EQU *
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE069I),NJE069I
MVC WTOTXT+13(8),AUTHUSER Move auth name to msg
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(2,R1),=CL2'at'
MVC 4(8,R1),AUTHNODE Move link name to msg
TRT 4(9,R1),BLANK Look for end
MVC 1(36,R1),=CL36'was not found in authorization table'
LA R0,37(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
DROP R8 AUTHLIST
B SUCCMSG Issue success msg
*
*
*-- Get next tokenized length/value pair
* Entry: R15 -> Current pair
* Exit: CC =0, R15 unchanged, no more tokens
* CC ¬=0, R15 -> next pair
*
GETTKN EQU *
LA R15,L'TOKENS(,R15) -> next length/token pair
CLI 0(R15),X'FF' No length available?
BNER R14 Exit with pair -> R15
S R15,=A(L'TOKENS) Back to previous token
CLI *+1,0 Set CC=0
BR R14 Exit with tkn ptr not changed
*
*-- Get a storage area
* Entry: R0 = length to obtain
* Exit: R1 -> new stg area
*
GETSTG EQU *
STM R14,R15,SV14GT Save regs
GETMAIN RU, Get requested stg for block x
LV=(0), x
SP=1 All configuration elements SP=1
LM R14,R15,SV14GT Reload regs
BR R14 Return with stg addr in R1
*
TKN000 EQU *
MVI NJFL2,0 Clear tokenization ctl flags
LR R5,R1 Save start of parse position
LR R3,R1 Start position to R3
BCTR R15,0 Make scan length IBM length
MVC TOKENS(12*8),TKNINIT Init receiving fields
LA R6,TOKENS -> token area
*
TKN040 EQU *
EX R15,SCANBL Look for blank at end of token
*SCANBL TRT 0(0,R3),BLANK
BZ ERR074 Syntax error
SR R1,R3 Compute token length
C R1,=F'8' Max length of token is 8
BH ERR074 Syntax error
BCTR R1,0
EX R1,MVTKN Save the token
*MVTKN MVC 1(0,R6),0(R3)
STC R1,0(,R6) Save its length
LA R6,9(,R6) -> next token area
LA R1,1(,R1) Restore length relative to 1
AR R3,R1 -> next byte in line
SR R15,R1 Reduce remaining length
BNPR R14 Done with line
*
EX R15,SCANNBL Look for next token
*SCANNBL TRT 0(0,R3),NONBLANK
BZR R14 Nothing else on line
SR R1,R3 Compute length to that token
AR R3,R1 -> next byte in line
SR R15,R1 Reduce remaining length
BNPR R14 Done with line
*
TKN090 EQU *
B TKN040 Continue scanning
*
SCANBL TRT 0(0,R3),BLANK executed instr
SCANNBL TRT 0(0,R3),NONBLANK executed instr
MVTKN MVC 1(0,R6),0(R3) executed instr
*
EOD000 EQU *
B EXIT00
*
*
ERR043 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE042E),NJE042E Node name invalid chars
LA R0,L'NJE042E Length of msg
B ERRTYPE(R7)
*
ERR046 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE044E),NJE044E LINK is not inactive
MVC WTOTXT+13(8),LINKID-LINKTABL(R8) LINK name
TRT WTOTXT+13(9),BLANK Look for end
MVC 1(15,R1),=CL15'is still active'
LA R0,13+16(,R1) -> end of msg
LA R1,WTOTXT -> start of msg
SR R0,R1 Compute length to display
B ERRTYPE(R7)
*
ERR050 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE050E),NJE050E AUTH AT required
LA R0,L'NJE050E Length of msg
B ERRTYPE(R7)
*
ERR051 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE051E),NJE051E ROUTE TO required
LA R0,L'NJE051E Length of msg
B ERRTYPE(R7)
*
ERR052 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE052E),NJE052E More than one LOCAL stmt
LA R0,L'NJE052E Length of msg
B ERRTYPE(R7)
*
ERR053 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE053E),NJE053E No LOCAL stmt
LA R0,L'NJE053E Length of msg
B ERRTYPE(R7)
*
ERR054 EQU *
S R15,=A(L'TOKENS) Back to previous token
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE054E),NJE054E invalid BUFF value
LA R0,L'NJE054E Length of msg
B ERRTYPE(R7)
*
ERR055 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE055E),NJE055E invalid value after keywd
MVC WTOTXT+29(8),0(R3) Show failed keyword
LA R0,L'NJE055E Length of msg
B ERRTYPE(R7)
*
ERR073 EQU *
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE073E),NJE073E keywd not in col 1
LA R0,L'NJE073E Length of msg
B ERRTYPE(R7)
*
ERR074 EQU *
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE074E),NJE074E syntax error
SR R3,R5 Compute column number
LA R3,1(,R3) Make rel to 1
CVD R3,DBLE
UNPK WTOTXT+53(2),DBLE
OI WTOTXT+54,X'F0' Fix sign
LA R0,L'NJE074E Length of msg
B ERRTYPE(R7)
*
ERR075 EQU *
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE075E),NJE075E syntax error
MVC WTOTXT+36(8),0(R3) Show failed keyword
LA R0,L'NJE075E Length of msg
B ERRTYPE(R7)
*
ERR076 EQU *
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE076E),NJE076E unknown config stmt type
LA R0,L'NJE076E Length of msg
B ERRTYPE(R7)
*
ERR077 EQU *
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE077E),NJE077E line addr required
LA R0,L'NJE077E Length of msg
B ERRTYPE(R7)
*
ERR078 EQU *
S R15,=A(L'TOKENS) Back to previous token
LA R3,1(,R15) -> failing keyword token
BAL R14,CFGERR Show failing stmt
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE078E),NJE078E invalid value after keywd
MVC WTOTXT+46(8),0(R3) Show failed keyword
LA R0,L'NJE078E+8 Length of msg
B ERRTYPE(R7)
*
ERRTYPE EQU * R7 branch table index
B ERRWTO 00 Issue WTO to console
B ERRMSG 04 Return msg len/text to caller
*
ERRWTO EQU *
WTO ,MF=(E,WTOMSG)
B EXIT08
*
ERRMSG EQU *
L R1,AMTEXT -> callers MTEXT area
MVC 0(120,R1),WTOTXT Pass back the msg text
B EXIT08 and exit to caller with error
*
SUCCMSG EQU *
L R1,AMTEXT -> callers MTEXT area
MVC 0(120,R1),WTOTXT Pass back the msg text
B EXIT00 and exit to caller with success
*
CFGERR EQU *
LTR R7,R7 Processing CONFIG member?
BNZR R14 No; skip config msgs
ST R14,SV14CF Save return
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(L'NJE072E),NJE072E
CVD R9,DBLE convert record #
MVC WTOTXT+45(3),=X'202120' Move edit mask
ED WTOTXT+44(4),DBLE+6 Edit record number
WTO ,MF=(E,WTOMSG)
MVC WTOMSG,WTO Move WTO model
MVC WTOTXT(7),NJE072E Move just msg number
MVI WTOTXT+8,C'''' Move apost
MVC WTOTXT+09(52),REC Move first part of record image
MVI WTOTXT+61,C'''' Move apost
WTO ,MF=(E,WTOMSG)
L R14,SV14CF Load return
BR R14
*
EXIT08 EQU *
LR R6,R0 Msg length to R6 for now
LA R5,8 RC=8
B XIT000
*
EXIT00 EQU *
LR R6,R0 Possible msg len to R6 for now
SR R5,R5 RC=0
* NJE00200
XIT000 EQU * NJE00210
TM NJFL1,F1OPEN Is DCB open?
BZ XIT010 No
MVC MACLIST(CLOSEL),CLOSE Move macro model
CLOSE (CONFIG), x
MF=(E,MACLIST)
FREEPOOL CONFIG
*
XIT010 EQU *
*
XIT090 EQU *
LR R1,R10 -> NJEWK main work area page
L R13,4(,R13) -> caller's sa NJE00210
STM R5,R6,16(R13) Set RC, msg len in SA R15, R0
*
FREEMAIN RU, x
LV=NJEWKSZ, x
A=(1)
LM R14,R12,12(R13) Reload system's regs NJE00220
BR R14 Return NJE00240
DROP R12
LTORG ,
*
DMYDCB DCB DDNAME=CONFIG, x
MACRF=GM, x
DSORG=PS, x
LRECL=80, x
RECFM=FB, x
EODAD=EOD000
DMYDCBL EQU *-DMYDCB
*
* 1234567890123456789012345678901234567890123456789012345
WTO WTO ' x
x
',MF=L
* 67890123456789012345678901234567890123456789012345678901
WTOL EQU *-WTO
*
*
DS 0D
BLANKS DC CL120' '
NONBLANK DC 64X'FF',X'00' TR Table to locate nonblank
INVALHEX DC 193X'FF' TR table to locate invalid hex
DC 6X'00' A-F
DC 41X'FF'
DC 10X'00' 0-9
DC 6X'FF'
BLANK DC 64X'00',X'FF',191X'00' TR Table to locate blanks
*
ASTER DC 256AL1(*-ASTER) TR table to set asterisk high
ORG ASTER+C'*' Set * high, only
DC X'FF'
ORG ,
*
HEXTRAN DC CL16'0123456789ABCDEF' Translate table
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
TRANHEX DC X'00FAFBFCFDFEFF000000000000000000' C
DC X'00000000000000000000000000000000' D
DC X'00000000000000000000000000000000' E
DC X'F0F1F2F3F4F5F6F7F8F9000000000000' F
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
VALDNAME DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 0 Invalid node name
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 1 characters
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 2
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 3
DC X'00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 4 Blank=ok/delim
DC X'FFFFFFFFFFFFFFFFFFFFFFFF5CFFFFFF' 5 * indicator
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 6
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 7
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 8
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 9
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' A
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' B valid =
DC X'FF000000000000000000FFFFFFFFFFFF' C C1-C9
DC X'FF000000000000000000FFFFFFFFFFFF' D D1-D9
DC X'FFFF0000000000000000FFFFFFFFFFFF' E E2-E9
DC X'00000000000000000000FFFFFFFFFFFF' F F0-F9
*
OPEN OPEN 0,MF=L
OPENL EQU *-OPEN
CLOSE CLOSE 0,MF=L
CLOSEL EQU *-CLOSE
RDJFCB RDJFCB 0,MF=L
RDJFCBL EQU *-RDJFCB
*
DEFUSER DC CL8'HERC01' Default userid for LOCAL
*
TKNINIT DC 12X'FF4040404040404040' byte 0=IBM len, bytes 1-8 blank
* 1 2 3 4 5 NJE00250
* 01234567890123456789012345678901234567890123456789012
NJE042E DC C'NJE042E Node names must contain A-Z, 0-9 only'
NJE044E DC C'NJE044E Link ' is not inactive'
NJE045I DC C'NJE045I Link ' is not defined
NJE046I DC C'NJE046I Link ' xxx deleted
NJE048E DC C'NJE048I Link ' xxx duplicate definition
NJE049I DC C'NJE049I Using configuration '
NJE050E DC C'NJE050E ''AT'' keyword is required with AUTH'
NJE051E DC C'NJE051E ''TO'' keyword is required with ROUTE'
NJE052E DC C'NJE052E Only one LOCAL statement allowed'
NJE053E DC C'NJE053E LOCAL statement must preceed LINK, ROUTE, or A*
UTH'
NJE054E DC C'NJE054E Invalid BUFF value; range is 300 to 4020'
NJE055E DC C'NJE055E Unrecognized keyword x'
NJE063I DC C'NJE063I Node xxxxxxxx ' is not routed
NJE064I DC C'NJE064I Route for node ' xxxxxxxx deleted
NJE065I DC C'NJE065I Node xxxxxxxx ' routed through link xxxx
NJE066I DC C'NJE066I Link ' xxx defined'
NJE067I DC C'NJE067I User ' xxx at yyy is already authorized'
NJE068I DC C'NJE068I User ' xxx at yyy is now authorized
NJE069I DC C'NJE069I User ' xxx at yyy not in authorization lst
NJE070I DC C'NJE070I User ' xxx at yyy removed from auth list
NJE072E DC C'NJE072E Configuration syntax error in record xxx'
NJE073E DC C'NJE073E Keyword is not in column 1'
NJE074E DC C'NJE074E Syntax, keyword, or value error after column x*
x'
NJE075E DC C'NJE075E Missing value after keyword x'
NJE076E DC C'NJE076E Unrecognized configuration statement type'
NJE077E DC C'NJE077E LINE address required on LINK statement'
NJE078E DC C'NJE078E Invalid/incorrect value after keyword x'
* NJE00930
* NJE043E NJE00930
* NJE047E NJE00930
* NJE056I NJE00930
* NJE057I NJE00930
* NJE058I NJE00930
* NJE059I all NJECMX msgs NJE00930
* NJE060I NJE00930
* NJE061I NJE00930
* NJE062I NJE00930
* NJE071I NJE00930
* NJE00930
COPY LINKTABL NJE00940
COPY RTE NJE00940
COPY AUTHLIST NJE00940
COPY NETSPOOL NJE00940
*
**** Main work area NJE00290
* NJE00290
NJEWK DSECT
NJEEYE DS CL4'NJES' Eyecatcher
NJEWKLEN DS F Getmain size of this area
*
DBLE DS D Work area NJE00310
TWRK DS 2D Work area
MACLIST DS XL64 Macro expansion area
REC DS CL120 Input record or command area
TOKENS DS 12CL9 Parsed keyword tokens (1 len,8 tkn)
*
NJEPARMS Passed parameter list v220
*
*
INITPLST DS A -> entry parm list in R1
AMTEXT DS A -> MTEXT field in NJECMX
SV14CF DS A R14 save
SV14GT DS A,A R14-15 save
*
NJFL1 DS X Flag bits
F1OPEN EQU X'80' 1... .... CONFIG DCB is open
*
NJFL2 DS X token scan and ctl flags
F2LINE EQU X'80' 1... .... LINE keyword found
F2RTO EQU X'40' .1.. .... ROUTE TO keyword found
F2AAT EQU X'20' ..1. .... AUTH AT keyword found
*
DS 0F
EXLST DS A X'87'+AL3(JFCBL)
JFCBL DS XL176
CONFIG DS XL(DMYDCBL) CONFIG DCB
WTOMSG DS 0XL(WTOL) WTO header
DS F Header area
WTOTXT DS XL(WTOL-4) WTO text area
*
BLDBUF DS XL(LINKLEN) Build area for LINK,RTE,AUTH entries
*
NJESA DS 18F NJESCN OS save area NJE00300
BALRSAVE DS 16F Local rtns register save NJE00300
*
DS 0D Force doubleword size
NJEWKSZ EQU *-NJEWK
*
DCBD DSORG=PS,DEVD=DA
JFCB DSECT
IEFJFCBN LIST=YES
*
END NJESCN NJE01000
./ ADD NAME=NJESYS
*
*
*-- NJE38 - Locate NJE38 information from an ENQ resource
*
*
* Called by NJEINIT,NJERCV,NJETRN,NJE38,NJ38XMIT,NJ38RECV
*
*
* Change log:
*
* 01 Oct 20 - Initial creation v210
*
*
GBLC &VERS
REGEQU
NJESYS CSECT
NJEVER
STM R14,R12,12(R13) Save regs
LR R12,R15
USING NJESYS,R12
*
*-- Determine if NJE38 is already active in another address space
*
CHK000 EQU *
L R2,16 Get CVT ptr
USING CVT,R2
LA R2,CVTFQCB -> ENQ QCB chain anchor
USING QCB,R2
*
CHK010 EQU *
ICM R2,15,MAJNMAJ -> next major QCB
BZ CHK080 Our guy not found
CLC MAJNAME,NJE38Q Look for our QNAME "NJE38"
BNE CHK010 Nope, go to next QCB
*
L R3,MAJFMIN -> first minor QCB
USING MIN,R3
*
CHK020 EQU *
LA R4,MINNAME -> minor name
CLC NJERCON,0(R4) Does minor name match?
BE CHK030 Yes. NJE38 is active
C R3,MAJLMIN Is this the last minor QCB?
BE CHK080 Yes, we're done. NJE38 is not active
ICM R3,15,MINNMIN -> next minor name
BZR R14 Just in case no address
B CHK020 Spin through the minor QCBs
*
CHK030 EQU *
LTR R1,R1 Store spool DSN?
BZ CHK040 No
MVC 0(44,R1),12(R4) Save off NETSPOOL dsname
*
CHK040 EQU *
L R1,8(,R4) Get CSABLK ptr from QCB minor
SR R15,R15 RC=0, ENQ data was found
B CHK090
*
CHK080 EQU *
LA R15,4 RC=4, no ENQ located
*
CHK090 EQU *
ST R1,24(,R13) Return R1 value
ST R15,16(,R13) Return R15 RC
*
LM R14,R12,12(R13) Reload regs
BR R14 Return
*
DS 0D
NJE38Q DC CL8'NJE38'
NJERCON DC CL8'NJEINIT'
*
LTORG ,
*
CVT DSECT=YES,PREFIX=NO
IHAQCB
*
END
./ ADD NAME=NJETRN
*
*-- NJE38 - TSO TRANSMIT
*
* Command line format:
*
* TRANSMIT node.userid
* DATASET( )
* OUTDATASET( )
* VOLSER( )
* UNIT( )
* PDS | SEQUENTIAL
* QUIET
*
* where:
*
* node.userid - specifies the destination of the transmission
*
* DATASET( ) - specifies the dsname of the dataset to be
* transmitted. May optionally specify a member.
*
* OUTDATASET( ) - optional. Specifies the encoded file is to be
* written to this dataset instead of being
* transmitted. 'node.userid' may be omitted if
* OUTDATASET is specified, but if it is present
* then the specified node and userid will be part
* of the encoded data instead of meaningless
* defaults. If OUTDATASET is specified, the
* named dataset will be used if it exists, other-
* wise it will be created.
* The contents of OUTDATASET can be input to a
* RECEIVE command by the use of RECEIVE INDATASET.
*
* VOLSER( ) - optional. Specifies a volume where OUTDATASET
* should be created. If not specified, a PUBLIC
* volume will be selected.
*
* UNIT( ) - optional. Specifies a unit name where OUTDATASET
* should be created. If not specified, SYSDA is
* the default unit name.
*
* PDS - If specified, indicates that the member name
* specified with DATASET is to be transmitted
* with IEBCOPY unload, thereby preserving the
* user directory data in the source PDS.
*
* SEQUENTIAL - DEFAULT. Indicates that any member name specified
* with DATASET is to be transmitted as a sequential
* file; no directory information is part of the
* transmission. SEQL must be specified or defaulted
* if the destination host is a VM system.
*
* QUIET - If specified, indicates that all informational
* messages from TRANSMIT are suppressed. Error
* messages will always be displayed.
*
*
* Examples (a user is logged on to TSO with userid FRED:
*
* 1. Send member COBSRC from FRED.MY.PDS to user HERC01 at
* node MVSA. The directory information associated with COBSRC
* is to be part of the transmission:
*
* TRANSMIT mvsa.herc01 da(my.pds(cobsrc)) pds
*
* 2. Encode dataset HERC02.COBOL.LISTING into FRED.NETLIB:
*
* TRANSMIT da('herc02.cobol.listing') out(netlib)
*
* 3. Send macro GETQ from FRED.MACLIB to CMSUSER at VMSYS1.
*
* TRANSMIT vmsys1.cmsuser da(maclib(getq))
*
*
* Change log:
*
* 24 Apr 21 - Use TSO userid as default user if no security and v222
* NJE38 is not active. v222
* 15 Feb 21 - Not picking up jobname when run as an STC. v221
* 10 Dec 20 - Support for registered users and message queuing v220
* 01 Oct 20 - Put ENQ existence check in common module v210
* 09 Aug 20 - Improve TSO attention key handling v201
* 24 Jul 20 - Fix S013-18 if DATASET member not found v200
* 15 Jul 20 - Don't display final record count. v200
* 12 Jul 20 - Add support for the UNIT parameter. v200
* 21 Jun 20 - Initial creation
*
*
GBLC &VERS
REGEQU
NJETRN CSECT NJE00020
NJEVER
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJETRN,R12 NJE00070
LR R8,R1 Copy input parm addr
*
GETMAIN RU, Get local stg area X
LV=4096, X
BNDRY=PAGE
LR R10,R1
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the page
*
USING NJEWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC NJEEYE,=CL4'NJET' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
L R11,=A(NJECOM) -> common csect
USING NJECOM,R11
ST R8,CPARMS Save ptr to input parms
MVC LCLNODE,=CL8'ORIGNODE' Set default local node
MVC DESTNODE,=CL8'DESTNODE' Set default
MVC DESTUSER,=CL8'DESTUSER' Set default
MVC PBREM,=F'80' Initialize
LA R1,REC -> output record area
ST R1,PBRPS Initialize
*
INIT000 EQU *
MVC MACLIST(ESTAEL),ESTAE Move ESTAE parm list
L R6,=A(NJEDMP) Point to local ESTAE rtn
ESTAE (R6), Issue ESTAE X
CT, X
TERM=YES, X
PARAM=(R10), PARAM is work area address X
MF=(E,MACLIST)
*
*-- Establish TSO userid issuing this command
*
TESTAUTH FCTN=1 Are we authorized on entry?
LTR R15,R15 Check result
BNZ INIT010 Branch if not authorized
OI FLAGS1,F1APF Indicate authorized on entry
*
INIT010 EQU *
L R2,PSATOLD-PSA(0) -> my TCB
L R2,TCBTIO-TCB(R2) -> my TIOT
LA R4,TIOCNJOB-IEFTIOT(R2) -> TIOT jobname v222
LR R3,R4 Assume will use jobname v222
*
L R2,PSAAOLD-PSA(0) -> my ASCB
L R6,ASCBTSB-ASCB(,R2) -> TSB (or 0)
L R2,ASCBASXB-ASCB(,R2) -> my ASXB
ICM R2,15,ASXBSENV-ASXB(R2) -> my ACEE
BZ INIT015 Exit if no ACEE
*
USING ACEE,R2
CLI ACEEUSRL,X'00' No userid available?
BE INIT015 Exit if unavail
CLI ACEEUSR,X'00' Userid not formed correctly?
BE INIT015 Exit if unavail
LA R3,ACEEUSR -> Userid
OI FLAGS1,F1ACEE Valid ACEE found
CLC ACEEUSR,=CL8'STC' Is this a started task? v221
BNE INIT015 No, use ACEEUSR id v221
LR R3,R4 Make the TIOT jobname the idv221
DROP R2 ACEE
*
INIT015 EQU *
MVC USERID,0(R3) Set the userid
TM FLAGS1,F1APF Authorized at entry?
BO INIT040 yes.
CLC USERID,=CL8'HERC01' Special access id?
BE INIT020 Yes
CLC USERID,=CL8'HERC02' Special access id?
BNE INIT030 No
*
INIT020 EQU *
OI FLAGS1,F1AUSR Indicate special authorized user
SR 0,0 Use authorization SVC
LA 1,1 For TK4- HERC01/HERC02 only
SVC 244 Get authorized
B INIT040
*
INIT030 EQU *
TM FLAGS1,F1APF Authorized at entry?
BZ ERR006 No, issue error
*
INIT040 EQU *
LA R6,0(,R6) Clear high order byte
LTR R6,R6 Was there a TSB address
BNZ INIT050 There was. Running in TSO userid
OI FLAGS1,F1BATCH Indicate batch TSO
TM FLAGS1,F1ACEE Valid ACEE found?
BO INIT050 Yes, go with ACEE userid
BAL R2,CHK000 See if NJE38 is active v210
BNZ INIT050 NJE38 not act; use jobname v222
MVC USERID,DEFUSER Use default userid
*
INIT050 EQU *
L R2,4(,R8) -> UPT from input parms
USING UPT,R2
MVC PREFIX,BLANKS Init receiving field
SR R1,R1 Clear for IC
ICM R1,1,UPTPREFL Get prefix length
BZ INIT060 No prefix value in use
BCT R1,*+10 Adjust for execute
MVC PREFIX(0),UPTPREFX executed instr
EX R1,*-6 Copy the prefix value
DROP R2 UPT
*
INIT060 EQU *
MVC STAXLIST(STAXL),STAX Move STAX parm list
LA R5,LIST -> input buffer from attn
LA R6,STAXXIT Point to local exit
STAX (R6), Set exit for attention X
OBUF=(ATTNMSG,L'ATTNMSG), x
IBUF=((5),80), x
USADDR=(10), Parameter is our work area x
MF=(E,MACLIST)
*
*-- Parse command line
*
SR R0,R0 Code 0: parse command line
L R15,=A(NJEPAR) -> parse routine
BALR R14,R15
*
TM FLAGS1,F1ATTN Was ATTN pressed? v201
BO EXIT08 Y, immediate exit v201
*
B INIT070(R15) Branch into table on RC
INIT070 B INIT080 Continue
B ERR004 No parameters entered
B ERR005 Invalid node.user entered
B ERR001 Display IJKPARS RC
*
INIT080 EQU *
LA R2,MSG000 Issue hello msg
BAL R14,PUTLINE
LA R2,MSGBLNK Issue blank line
BAL R14,PUTLINE
*
*-- Check if we have the required parameters:
*
*-- 1. DATASET is required. No exceptions.
*-- 2. Either one of:
*-- a. OUTDATASET, or,
*-- b. node.userid
*-- 3. If node.user specified, we need NJE38 to be active.
*
TM FLAGS3,F3INDS Was DATASET specified?
BZ ERR002 N, it is required
TM FLAGS3,F3OUTDS Was OUTDATASET specified?
BO INIT090 Y, we don't need NJE38
TM FLAGS3,F3DEST Do we have a node.user?
BZ ERR011 No, bail out.
*
BAL R2,CHK000 Determine NJE38 status v210
BNZ ERR013 NJE38 is not active v210
*
*-- Set up user selected input dataset
*
*-- 1. Dynamically allocate it (also return DSORG and VOLSER).
*-- 2. OBTAIN the DSCB for the dataset to get DCB attributes.
*-- 3. Use DEVTYPE and TRKCALC along with the DSCB last used TTR to
*-- determine how many blocks were used in the dataset.
*-- 4. If it was a PDS, count the number of directory blocks.
*
INIT090 EQU *
MVC TDSNAME,INPUTDS Set DSNAME of user dataset
MVC TMEMBER,INMEM Set member name (or null)
*
LA R0,DYNINDS 24 allocate input dataset
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15 Any errors?
BNZ EXIT08 Exit if allocation error
TM TDSORG,X'42' Is it DSORG=PO/PS ?
BZ ERR003 No, can't support it
*
MVC DDSYSUT1,TDDNAME Save off the DDNAME returned
TM FLAGS3,F3PDS Was PDS forced?
BO INIT100 Y, use IEBCOPY instead of PS mbr
TM FLAGS3,F3INMEM Was a member name specified?
BZ INIT100 No, DSORG is what it is
MVC TDSORG,=X'4000' Member makes it DSORG=PS
*
INIT100 EQU *
XC CAMWORK,CAMWORK Init CAMLST work area
MVC CAMLST,DMYLST Move dummy CAMLST to area
LA R1,CAMLST -> CAMLST
LA R4,TDSNAME -> DATASET NAME
ST R4,4(,R1) Put in CAMLST
LA R4,TVOLSER -> VOLSER
ST R4,8(,R1) Put in CAMLST
LA R4,CAMWORK -> AT WORK AREA
ST R4,12(,R1) Put in CAMLST
*
OBTAIN (1) Get the format 1 DSCB
LA R4,CAMWORK-44 -> DSCB we obtained (less DSN)
USING DSCBF1,R4
LTR R15,R15 SUCCESSFUL?
BNZ ABEND101 No
*
INIT110 EQU *
LA R7,INMF02A -> first INMR02 data items
USING INMFIELD,R7
MVC DSORG,TDSORG Set DSORG
SR R0,R0 Clear for IC
ICM R0,3,DS1BLKL
ST R0,BLKSIZE Set BLKSIZE
ICM R0,3,DS1LRECL
ST R0,LRECL Set LRECL
MVC RECFM,DS1RECFM Set RECFM
MVC DSNAME,INPUTDS Set DSNAME
MVC UTLNAME,=CL8'INMCOPY' Assume utility is sequential cpy
TM DSORG,X'40' Is DSORG=PS?
BO INIT120 Yes
MVC UTLNAME,=CL8'IEBCOPY' Utility is for partitioned
*
*
INIT120 EQU *
DEVTYPE TDDNAME,DEVINFO,DEVTAB Get device info
LTR R15,R15 Success?
BNZ ABEND102 No
*
INIT130 EQU *
MVC MACLIST(TRKCALCL),TRKCALC Move macro model
TRKCALC FUNCTN=TRKCAP, Calc track capacity for this blkszX
REGSAVE=YES, Save all regs X
TYPE=DEVUCBTY+3, Point to device type byte X
R=1, Record 1 = calc for entire track X
K=0, No Keys X
DD=DS1BLKL, Use the BLKSIZE from DSCB X
MF=(E,MACLIST) R0 = # blks per track on exit
*
*
SR R1,R1 Clear
L R3,BLKSIZE Get current block size
MR R2,R0 Compute bytes per track
SR R1,R1 Clear
ICM R1,3,DS1LSTAR Get TT of last used TTR
LA R1,1(,R1) One extra for partial last track
MR R2,R1 Compute approx bytes in file
ST R3,FILESIZE Set approx file size in bytes
DROP R4 DSCBF1
*
*-- If input dataset is a PDS, count the number of directory blocks.
*-- Then, use IEBCOPY to unload the PDS into a sequential file.
*
TM DSORG,X'40' Is DSORG=PS?
BO OUT000 Y, done with input dataset
*
OI FLAGS1,F1INPDS INDS is a PDS dataset
MVC INDS(DMYINDSL),DMYINDS Set up DCB
LA R6,INDS -> DCB
USING IHADCB,R6
MVC DCBDDNAM,DDSYSUT1 Set DCB DDNAME
MVC DCBBLKSI,=Y(256) Set up to read dir blocks
MVC DCBLRECL,=Y(256) Set up to read dir blocks
MVI DCBRECFM,DCBRECF RECFM=F
LA R1,INIT150 -> temporary EOF addr
ST R1,DCBEODAD Set it
DROP R6
*
MVC MACLIST(OPENL),OPEN Move OPEN list
OPEN (INDS,INPUT), Open the input dataset X
MF=(E,MACLIST)
OI FLAGS2,F2INOPN Indicate DCB is open
SR R2,R2 Init directory blocks counter
*
INIT140 EQU *
GET INDS Get a dir block
LA R2,1(,R2) Count it
B INIT140
*
INIT150 EQU *
ST R2,DIRBLKS Set DIRBLKS value
TM FLAGS2,F2INOPN Is INDS DCB open?
BZ UNLD000 No
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (INDS), Close it X
MF=(E,MACLIST)
NI FLAGS2,255-F2INOPN Indicate DCB is closed
*
*-- If DATASET is a PDS, prepare to call IEBCOPY to unload it.
*
*-- 1. Create sequential dataset for IEBCOPY to unload into.
*-- 2. Allocate other required IEBCOPY datasets.
*-- 3. If user specified a member name in DATASET, build IEBCOPY
*-- control statements.
*-- 4. Invoke IEBCOPY to unload the entire PDS or single member.
*
UNLD000 EQU *
LA R6,INMF02A -> 1st INMR02 record
LA R7,INMF02B -> 2nd INMR02 record
USING INMFIELD,R7
*
*-- Filling dynamic allocation text units for unload PS dataset
*
LA R1,3120 Use 3120 for IEBCOPY SYSUT2
STH R1,TBLKSIZE Set dynalloc block size
STCM R1,7,TBLKLEN Set dynalloc space blk len
*
L R3,FILESIZE-INMFIELD(R6) Get INDS size
ST R3,FILESIZE Use as temporary DS size
SR R2,R2 Clear for divide
DR R2,R1 Compute # blocks needed
LA R3,1(,R3) Always round up
LR R1,R3 Return primary blocks in R1
SRL R3,2 Compute 1/4th of needed amt
LA R2,1(,R3) Round up = secondary blks needed
*
STCM R1,7,TPRIME Set primary space in blocks
STCM R2,7,TSECND Set secondary space in blocks
*
MVC TDSORG,=X'4000' Always PS
*
*
*-- Call NJEDYN to allocate the unload output dataset as "SYSUT2"
*
LA R0,DYNUNLD 10 allocate unload dataset
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
*
B UNLD020(R15) Branch on RC
UNLD020 B UNLD040 00 Normal, proceed
B EXIT08 04 Dataset exists, shouldnt happen
B EXIT08 08 All other errors
*
*-- Prepare to launch IEBCOPY
*
UNLD040 EQU *
MVC DDSYSUT2,TDDNAME Set replacement SYSUT2 DD
*
*-- Call NJEDYN to allocate the SYSIN dataset needed by IEBCOPY
*
LA R0,DYNSYSIN 08 allocate SYSIN for IEBCOPY
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
MVC DDSYSIN,TDDNAME Save generated DDNAME
*
*-- Call NJEDYN to allocate the SYSPRINT dataset needed by IEBCOPY
*
LA R0,DYNSYSPR 12 allocate SYSPRINT for IEBCOPY
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
MVC DDSYSPR,TDDNAME Save generated DDNAME
*
*-- Call NJEDYN to allocate the SYSUT4 dataset needed by IEBCOPY
*
LA R0,DYNSYSU4 14 allocate SYSUT4 temporary
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
MVC DDSYSUT4,TDDNAME Set replacement SYSUT4 DD
*
TM FLAGS3,F3INMEM Was a member name specified?
BZ UNLD080 No, skip ctl card build
BAL R14,CTL000 Build IEBCOPY control statements
*
*-- Invoke IEBCOPY
*
UNLD080 EQU *
MVC CPYPLIST,COPYPARM Move IEBCOPY parms to 24-bit stg
MVC DDLISTL,=AL2(DDLISTSZ) Set IEBCOPY DD list length
LA R2,CPYPLIST
LA R3,DDLISTL
MVC MACLIST(LINKL),LINK Move macro model
LINK EP=IEBCOPY, x
PARAM=((R2),(R3)), x
VL=1, x
MF=(E,MACLIST)
LTR R5,R15 Copy RC to R5
BNZ ERR018 Exit on error
*
*-- Find out what we can about the IEBCOPY unloaded dataset
*
*-- 1. OBTAIN the DSCB for the dataset to get DCB attributes.
*-- 2. Use DEVTYPE and TRKCALC along with the DSCB last used TTR to
*-- determine how many blocks were used in the dataset.
*
UNLD100 EQU *
XC CAMWORK,CAMWORK Init CAMLST work area
MVC CAMLST,DMYLST Move dummy CAMLST to area
LA R1,CAMLST -> CAMLST
LA R4,TDSNAME -> DATASET NAME
ST R4,4(,R1) Put in CAMLST
LA R4,TVOLSER -> VOLSER
ST R4,8(,R1) Put in CAMLST
LA R4,CAMWORK -> AT WORK AREA
ST R4,12(,R1) Put in CAMLST
*
OBTAIN (1) Get the format 1 DSCB
LA R4,CAMWORK-44 -> DSCB we obtained (less DSN)
USING DSCBF1,R4
LTR R15,R15 SUCCESSFUL?
BNZ ABEND103 No
*
UNLD110 EQU *
LA R7,INMF02B -> 2nd INMR02 data items
USING INMFIELD,R7
MVC DSORG,TDSORG Set DSORG
SR R0,R0 Clear for IC
ICM R0,3,DS1BLKL
ST R0,BLKSIZE Set BLKSIZE
ICM R0,3,DS1LRECL
ST R0,LRECL Set LRECL
MVC RECFM(1),DS1RECFM Set RECFM
MVI RECFM+1,X'02' Indicate shortened variable fmt
XC DSNAME,DSNAME No DSNAME in INMR02B
MVC UTLNAME,=CL8'INMCOPY' Utility is sequential cpy
*
*
UNLD120 EQU *
DEVTYPE TDDNAME,DEVINFO,DEVTAB Get device info
LTR R15,R15 Success?
BNZ ABEND104 No
*
UNLD130 EQU *
MVC MACLIST(TRKCALCL),TRKCALC Move macro model
TRKCALC FUNCTN=TRKCAP, Calc track capacity for this blkszX
REGSAVE=YES, Save all regs X
TYPE=DEVUCBTY+3, Point to device type byte X
R=1, Record 1 = calc for entire track X
K=0, No Keys X
DD=DS1BLKL, Use the BLKSIZE from DSCB X
MF=(E,MACLIST) R0 = # blks per track on exit
*
*
SR R1,R1 Clear
L R3,BLKSIZE Get current block size
MR R2,R0 Compute bytes per track
SR R1,R1 Clear
ICM R1,3,DS1LSTAR Get TT of last used TTR
LA R1,1(,R1) One extra for partial last track
MR R2,R1 Compute approx bytes in file
ST R3,FILESIZE Set approx file size in bytes
DROP R4 DSCBF1
*
*-- Prep OUTDATASET if specified
*
*-- Determine if it exists,
*-- If yes, DSORG must be PS unless OUTDS member coded.
*-- If no, create it, 3120/80/FB,
*-- and create as PDS if user specified a OUTDS member, else SEQL,
*-- using estimated file size from input dataset.
*
OUT000 EQU *
TM FLAGS3,F3OUTDS Did user specify OUTDATASET?
BZ OPN000 No, transmit to NETSPOOL
*
OUT200 EQU *
MVC CAMLST,LOCATLST Move modem CAMLST
XC BUFF,BUFF Clear sufficient camlst workarea
XC REC,REC Clear more
LA R1,CAMLST -> CAMLST
LA R2,OUTPUTDS -> DATASET name
ST R2,4(,R1) Place in CAMLST
LA R2,CAMWORK -> CAMLST work area
ST R2,12(,R1) Place in CAMLST
*
LOCATE (1) Does dataset exist?
LTR R15,R15 Any errors?
BNZ OUT240 Yes, dataset doesn't exist
OI FLAGS2,F2EXIST Indicate OUTDATASET exists
*
*-- Find out about this existing OUTDATASET
*
OUT210 EQU *
LA R4,CAMWORK -> CAMLST work area
USING VOLLIST,R4 Address the volume list
MVC TVOLSER,VOLSER Save off the volume
DROP R4 VOLLIST
*
XC CAMWORK,CAMWORK Init CAMLST work area
MVC CAMLST,DMYLST Move dummy CAMLST to area
LA R1,CAMLST -> CAMLST
LA R4,OUTPUTDS -> DATASET NAME
ST R4,4(,R1) Put in CAMLST
LA R4,TVOLSER -> VOLSER
ST R4,8(,R1) Put in CAMLST
LA R4,CAMWORK -> AT WORK AREA
ST R4,12(,R1) Put in CAMLST
*
OBTAIN (1) Get the format 1 DSCB
LA R4,CAMWORK-44 -> DSCB we obtained (less DSN)
USING DSCBF1,R4
LTR R15,R15 SUCCESSFUL?
BNZ ABEND105 No
*
OUT220 EQU *
TM DS1DSORG,X'40' Is it a Seql dataset?
BO OUT230 Yes
TM DS1DSORG,X'02' Is it a PDS dataset?
BZ ERR007 No, error; must be PS or PO
TM FLAGS3,F3OUTMEM Did user also code member name?
BZ ERR008 N, mem req'd if PO
B OUT250 Y, proceed with allocation
*
*-- Whether OUTDATASET existed or not, ignore any member name
*-- coded on OUTDATASET if the dataset is PS.
*
OUT230 EQU *
NI FLAGS3,255-F3OUTMEM Ignore any user member name
B OUT250 And go allocate it
*
*-- OUTDATASET didn't exist, prepare to create it
*
OUT240 EQU *
LA R2,3120 3120 = NETDATA output blksize
STH R2,TBLKSIZE Set per NETDATA std
STCM R2,7,TBLKLEN Set per NETDATA std
MVC TLRECL,=H'80' Set per NETDATA std
MVI TRECFM,X'90' Set FB per NETDATA std
MVC TDSORG,=X'4000' Set PS per NETDATA std
SR R0,R0 Clear for divide
L R1,FILESIZE Get # bytes in input file
DR R0,R2 Compute # of 3120 blks needed
*
LR R2,R1 Copy # blks needed
SRA R1,3 div by 8 Compute 12% for NETDATA overhead
AR R1,R2 Get # blks + 12%
STCM R1,7,TPRIME Set # primary space blocks
SRA R2,2 div by 4 Compute 25% for secondary
STCM R2,7,TSECND Set # secondary space blocks
*
OUT250 EQU *
MVC TDSNAME,OUTPUTDS Set DSNAME for allocation
MVC TMEMBER,OUTMEM Set possible member name
MVC TVOLSER,OUTVOL Set possible volser override
*
LA R0,DYNOUTDS 32 allocate OUTDATASET
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15 Any errors?
BNZ EXIT08 Exit if allocation error
*
MVC DDOUTDS,TDDNAME Save DD returned
MVC OUTDS(DMYOUTDL),DMYOUTDS Set up DCB
LA R6,OUTDS -> DCB
USING IHADCB,R6
MVC DCBDDNAM,DDOUTDS Set DCB DDNAME
DROP R6 IHADCB
*
MVC MACLIST(OPENL),OPEN Move OPEN list
OPEN (OUTDS,OUTPUT), Open the OUTDATASET X
MF=(E,MACLIST)
OI FLAGS2,F2OUTOPN Indicate DCB is open
B TRN000 Start transmitting to OUTDATASET
*
*-- Open NETSPOOL if not using OUTDATASET
*
OPN000 EQU *
BAL R2,CHK000 Determine NJE38 status v210
BNZ ERR013 NJE38 is not active v210
*
MVC DDNETSPL,=CL8'NETSPOOL' Set NETSPOOL DDN (for unalloc)
MVC TDDNAME,DDNETSPL NETSPOOL DD
MVC TDSNAME,SPLDSN Set spool DSN
LA R0,DYNETSPL 28 allocate NETSPOOL
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
*
LA R8,NCB1 -> NCB
USING NCB,R8
MVI NCBFL1,TYPPUN Only outputting punch type recs
*
NSIO TYPE=OPEN, x
NCB=(R8)
C R15,=F'4' NETSPOOL needs verify?
BE ERR025 Yes
BL OPN010 Everything is good
BAL R14,FMT000 Display Open error
CLC NCBRTNCD(2),=AL1(8,152) X'0898' Security denied access?
BE ERR014 Yes, special message
B EXIT08 Exit on VSAM error
*
OPN010 EQU *
OI FLAGS2,F2NCBOPN Indicate NETSPOOL is open
*
*-- Create the NETDATA and transmit the results to the destination
*-- node, or store it in the OUTDATASET.
*
*-- DDNAME setup below at TRN000 may look confusing. To explain:
*-- The NETDATA is always built from a sequential dataset. So the
*-- INDS DCB here represents either the original user specified
*-- input DATASET -or - the IEBCOPY unloaded sequential dataset from
*-- the original PDS.
*
*-- If the original was sequential, it is already allocated at the
*-- DDSYSUT1 ddname.
*-- If the original was a PDS, then the IEBCOPY unload dataset is
*-- allocated at the DDSYSUT2 ddname.
*
*
TRN000 EQU *
MVC INDS(DMYINDSL),DMYINDS Set up DCB
LA R6,INDS -> DCB
USING IHADCB,R6
MVC DCBDDNAM,DDSYSUT2 PDS: Set DCB DDNAME (iebcopy UNLD DD)
*
TM FLAGS1,F1INPDS Is input dataset a PDS?
BO TRN210 Yes
MVC DCBDDNAM,DDSYSUT1 SEQ: Set DCB DDNAME (input DS DD)
*
TRN210 EQU *
MVC MACLIST(OPENL),OPEN Move OPEN list
OPEN (INDS,INPUT), Open the input dataset X
MF=(E,MACLIST)
OI FLAGS2,F2INOPN Indicate DCB is open
DROP R6 IHADCB
*
TRN220 EQU *
L R15,=A(NJENET) -> NETDATA build and write
BALR R14,R15 Go write NETDATA
LTR R15,R15 Any errors?
BNZ ERR010 Write i/o error
*
TRN300 EQU *
TM FLAGS2,F2NCBOPN Was spool open?
BZ TRN350 No
*
L R5,16 -> CVT
L R5,CVTSMCA-CVT(,R5) -> SMCA
LA R5,SMCASID-SMCABASE(,R5) -> system id
*
*-- Fill in the tag data to satisfy the DMTXJE RSCS line driver used
*-- by NJE38.
*
TRN310 EQU *
LA R6,TAGDATA -> tag data area
USING TAG,R6
*
STCK TAGINTOD Time of spool file creation
*
MVC TAGDEV,=X'000C' Pseudo card rdr CUU
MVC TAGINLOC,LCLNODE Local node name of origin
MVC TAGINVM,USERID Userid of origin
MVC TAGRECNM,OUTRECS # of records written
MVC TAGRECLN,=Y(80) Move record length
MVI TAGINDEV,TYPPUN data type (PRT/PUN)
MVC TAGCLASS,=C'A' Spool class
MVC TAGCOPY,=H'1' # copies
MVC TAGNAME,BLANKS Init receiving field
MVC TAGNAME(8),USERID Insert userid
MVC TAGTYPE,=CL12'OUTPUT'
MVC TAGDIST,BLANKS Init receiving field
MVC TAGDIST(4),0(R5) Insert system id
MVC TAGTOLOC,DESTNODE destination node
MVC TAGTOVM,DESTUSER destination userid
MVC TAGPRIOR,=H'1' priority
DROP R6 TAG
*
TRN320 EQU *
NSIO TYPE=CLOSE, Close NETSPOOL x
NCB=(R8), x
TAG=(R6) Pass TAG data
NI FLAGS2,255-F2NCBOPN Indicate NETSPOOL is closed
*
*-- Let NJE38 know that a new file was just placed into the spool so
*-- it can be queued for transmission.
*
BAL R2,CHK000 Determine NJE38 status v210
BNZ TRN350 NJE38 is not active v210
CLC DESTNODE,LCLNODE Trying to send file locally?
BE TRN350 Y, but skip the POST
*
LR R7,R1 -> NJE38 CSA ptr to R7 v210
USING NJ38CSA,R7
*
MODESET MODE=SUP,KEY=ZERO
*
GETMAIN RU, Get CSA for WRE TYPE=WRENEW x
LV=WRESIZE, v220x
SP=241
XC 0(WRESIZE,R1),0(R1) Clear stg area v220
USING WRE,R1
MVI WRESP,241 Save subpool v220
MVI WRETYPE,WRENEW "New file in spool" WRE
MVC WRELINK,DESTNODE Set destination node
MVC WREUSER,DESTUSER Set destination userid
*
LM R2,R3,NJ38SWAP Get first WRE ptr, sync count
TRN340 EQU *
ST R2,WRENEXT First WRE becomes next
LR R4,R1 -> WRE to be added as first
LA R5,1(,R3) Incr synchronization count
CDS R2,R4,NJ38SWAP Update CSA WRE anchor, sync
BC 7,TRN340 Gotta try again
*
LA R6,NJ38ECB -> NJE38 external WRE ECB
L R7,NJ38ASCB -> NJE38 ASCB
DROP R7 NJ38CSA
*
MVC MACLIST(POSTL),POST Move macro model
POST (6), Wake up NJE38 to new spool file x
ASCB=(7), x
ERRET=TRN350, Exit if can't do the post x
ECBKEY=0, x
MF=(E,MACLIST)
*
MODESET MODE=PROB,KEY=NZERO
*
TRN350 EQU *
*
*
*-- Transmission complete. Issue # records sent and terminate.
*
*
TRN900 EQU *
LA R2,MSGBLNK
BAL R14,PUTLINE Write blank line
*
MVC LIST,BLANKS
*
*-- Record count not displayed until discrepancy with NJE counts v200
*-- can be resolved. v200
* v200
* L R15,OUTRECS # of output records written v200
* CVD R15,DBLE unpk count v200
* MVC LIST+4(11),=X'2020206B2020206B202120' v200
* LA R1,LIST+14 In case no significance v200
* EDMK LIST+3(12),DBLE+3 Edit result v200
* MVC LIST+4(12),0(R1) left justify displayed digitv200
* TRT LIST+4(12),BLANK Look for end v200
* LA R1,1(,R1) Skip the blank v200
MVC LIST+4(L'MSG009T),MSG009T Move 'file successfully' v200
LA R1,LIST+L'MSG009T+4 -> next available byte v200
*
TM FLAGS3,F3OUTDS Using OUTDATASET?
BO TRN910
MVC 0(10,R1),=C'queued to '
MVC 10(8,R1),DESTNODE
TRT 10(9,R1),BLANK Look for end of node id
MVI 0(R1),C'.' Set dot
MVC 1(8,R1),DESTUSER Move userid
LA R1,9(,R1) -> next available byte
B TRN920
*
TRN910 EQU *
MVC 0(12,R1),=C'written to '''
MVC 12(44,R1),OUTPUTDS Move OUTDATASET name
TRT 12(45,R1),BLANK Look for end of DSN
MVI 0(R1),C'''' Set dot
LA R1,1(,R1) -> next available byte
*
TRN920 EQU *
LA R2,LIST -> msg
MVC 0(4,R2),MSG009 Move RDW and flags
SR R1,R2
STH R1,LIST Set updated RDW
BAL R14,PUTLINE
B EXIT00
*
*
*--Error routines
*
ERR001 EQU *
MVC LIST(4+L'MSG001T),MSG001 Move msg to work area
CVD R15,DBLE unpk IKJPARS RC
UNPK LIST+57(2),DBLE
OI LIST+58,X'F0' Fix sign
LA R2,LIST -> msg
B ERRPUT
*
ERR002 EQU *
LA R2,MSG002 Input dataset is required
B ERRPUT Write it
*
ERR003 EQU *
LA R2,MSG003 Input dataset not PS or PO
B ERRPUT Write it
*
ERR004 EQU *
LA R2,MSG004 No parameters entered on cmd lin
B ERRPUT Write it
*
ERR005 EQU *
LA R2,MSG005 Invalid node.user specified
B ERRPUT Write it
*
ERR006 EQU *
LA R2,MSG006 Not APF authorized
B ERRPUT
*
ERR007 EQU *
LA R2,MSG008 OUTDATASET not SEQ or PDS
B ERRPUT
*
ERR008 EQU *
LA R2,MSG008 OUTDATASET is PDS but no mem
B ERRPUT
*
ERR010 EQU *
MVC LIST(4+L'MSG010T),MSG010 Move msg text
LA R1,=CL10'OUTDATASET' Assume writing to OUTDATASET
TM FLAGS3,F3OUTDS Using OUTDATASET?
BO *+8 We are
LA R1,=CL10'NETSPOOL' NO, its NETSPOOL
MVC LIST+4+L'MSG010T(9),0(R1) Move source of error
LH R1,LIST Get current msg length
LA R1,10(,R1) Add on the source length
STH R1,LIST Put back
LA R2,LIST Write i/o error on OUTDS/SPOOL
B ERRPUT
*
ERR011 EQU *
LA R2,MSG011 No destination node.user
B ERRPUT
*
ERR013 EQU *
LA R2,MSG013 NJE38 is not active
B ERRPUT
*
ERR014 EQU *
LA R2,MSG014 Security denied NETSPOOL access
B ERRPUT
*
*-- Member not found in DATASET (come here from ESTAE 013-18) v200
*
ERR015 EQU * v200
LA R13,NJESA Ensure using proper SA sincev200
* we came here from ESTAE v200
*
MVC LIST(4+L'MSG015T),MSG015 Member not found msg v200
MVC LIST+11(8),INMEM Plug missing member name v200
* v200
LA R2,LIST -> start of msg v200
B ERRPUT v200
*
*-- TRANSMIT ended because IEBCOPY failed
*
ERR018 EQU *
LA R2,MSGBLNK -> blank line msg
BAL R14,PUTLINE
*
MVC LIST(4+L'MSG018T),MSG018 IEBCOPY fail msg
CVD R5,DBLE Convert IEBCOPY RC
UNPK LIST+38(2),DBLE
OI LIST+39,X'F0' Fix sign
*
LA R2,LIST -> start of msg
B ERRPUT Display failure
*
ERR025 EQU *
LA R2,MSG025 Need to run VERIFY
B ERRPUT
*
ERRPUT EQU *
BAL R14,PUTLINE
B EXIT08
*
*****************
* EXIT FROM *
* TRANSMIT *
*****************
*
*
*
EXIT00 EQU *
SR R15,R15 Set RC=0
B XIT000 Clean up and exit
*
EXIT08 EQU *
LA R15,8 Set RC=8
B XIT000 Clean up and exit
*
XIT000 EQU *
LA R13,NJESA Ensure using proper SA in case
* we've come here due to ESTAE
LR R5,R15 Save RC across shutdown
ESTAE 0 Disable ESTAE
*
TM FLAGS2,F2INOPN Is input dataset open?
BZ XIT010 No
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (INDS), Close it X
MF=(E,MACLIST)
*
XIT010 EQU *
TM FLAGS2,F2OUTOPN Is OUTDATASET open?
BZ XIT020 No
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (OUTDS), Close it X
MF=(E,MACLIST)
*
XIT020 EQU *
TM FLAGS2,F2NCBOPN Is NETSPOOL open?
BZ XIT030 No
SR R6,R6 Ensure no tag data
LA R1,NCB1 -> NCB
NSIO TYPE=CLOSE, Close the spool x
NCB=(R1),TAG=(R6)
*
XIT030 EQU *
* NJE00200
XIT040 EQU * NJE00210
LA R3,DDLIST -> list of DD's we allocated
LA R4,UNLISTSZ/8 # of DD list entries
*
XIT050 EQU *
CLC =XL8'00',0(R3) Unassigned DD?
BE XIT060 Skip to next
*
MVC UDDNAME,0(R3)
LA R0,UNDYN 00 unalloc
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
*
XIT060 EQU * NJE00210
LA R3,8(,R3) -> next DD entry
BCT R4,XIT050 Continue unallocation scan
*
XIT070 EQU * NJE00210
TM FLAGS1,F1AUSR Special authorized user?
BZ XIT080 Y, Don't need Auth SVC
SR 0,0 Use authorization SVC
SR 1,1 For HERC01/HERC02 only
SVC 244 Get un-authorized
*
XIT080 EQU * NJE00210
*
QUIT EQU * NJE00210
LR R1,R10 -> NJEWK main work area page
L R13,4(,R13) -> caller's sa NJE00210
ST R5,16(,R13) Set exit RC
FREEMAIN RU, x
LV=4096, x
A=(1)
LM R14,R12,12(R13) Reload system's regs NJE00220
BR R14 Return NJE00240
*
*-- User ABENDs issued
*
ABEND101 EQU *
LA R1,101 OBTAIN failed for input DATASET
B ABEND
*
ABEND102 EQU *
LA R1,102 DEVTYPE failed for input DATASET
B ABEND
*
ABEND103 EQU *
LA R1,103 OBTAIN failed for IEBCOPY UNLD
B ABEND
*
ABEND104 EQU *
LA R1,104 DEVTYPE failed for IEBCOPY UNLD
B ABEND
*
ABEND105 EQU *
LA R1,105 OBTAIN failed for OUTDATASET
B ABEND
*
*ABEND106 EQU * DSNAME build failure, See
* label B2DSN020 in CSECT NJENET
*
ABEND ABEND (1),DUMP,STEP
DROP R12
*
*-- STAX attention exit
*
*-- Doesn't do anything, but allows us to deallocate and get un-
*-- authorized rather than a native TSO abort.
*
STAXXIT EQU *
STM R14,R12,12(R13) Save
LR R12,R15 Get base
USING STAXXIT,R12
L R10,8(,R1) -> NJEWK area
USING NJEWK,R10
OI FLAGS1,F1ATTN Indicate ATTN pressed v201
LM R14,R12,12(R13) Load
DROP R12
BR R14 Return
*
LTORG ,
*
DMYINDS DCB DDNAME=INDS, X
MACRF=(GL), X
DSORG=PS, X
BFTEK=A, X
EODAD=EOD000
DMYINDSL EQU *-DMYINDS
*
DMYOUTDS DCB DDNAME=OUTDS, X
MACRF=(PM), X
DSORG=PS, X
BLKSIZE=3120, X
LRECL=80, X
RECFM=FB
DMYOUTDL EQU *-DMYOUTDS
*
*
*
OPEN OPEN 0,MF=L
OPENL EQU *-OPEN
CLOSE CLOSE 0,MF=L
CLOSEL EQU *-CLOSE
LINK LINK EP=0,SF=L
LINKL EQU *-LINK
ESTAE ESTAE 0,MF=L
ESTAEL EQU *-ESTAE
STAX STAX 0,OBUF=(0,0),IBUF=(0,0),USADDR=0,MF=L
STAXL EQU *-STAX
DMYLST CAMLST SEARCH,0,0,0
DMYLSTL EQU *-DMYLST
LOCATLST CAMLST NAME,0,,0
TRKCALC TRKCALC MF=L
TRKCALCL EQU *-TRKCALC
POST POST 0,ASCB=0,ERRET=0,MF=L
POSTL EQU *-POST
*
COPYPARM DC AL2(L'COPYOPT)
COPYOPT DC C'WORK=0512K'
COPYPRML EQU *-COPYPARM TOTAL LENGTH OF PARM OPTION
*
ATTNMSG DC C'COMMAND TERMINATED DUE TO ATTENTION; PRESS ENTER TWICE'
* v201
*********************
* N J E C O M * NJECOM hosts small routines and
* * frequently used constants that
* Common routines * are available to all NJERxx csects
* and constants * via base register 11
* *
*********************
*
NJECOM CSECT
DC A(0) No branch around constants
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECOM'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
USING NJECOM,R11
*
*-- Write a record to the NJE38 spool, or to OUTDATASET
*
*-- Entry: None
*-- Exit: RC=0 if write ok, RC=8 if write error.
*
PUT000 EQU *
ST R14,SV14PUT Save return reg
*
TM FLAGS3,F3OUTDS Did user specify OUTDATASET?
BZ PUT050 No, transmit to NETSPOOL
*
PUT OUTDS,REC Write the record
SR R15,R15 Set RC=0
B PUT090
*
PUT050 EQU *
LA R1,NCB1
NSIO TYPE=PUT, Write the record to spool x
NCB=(R1), x
AREA=REC, x
RECLEN=80
LTR R15,R15 Any errors?
BZ PUT090 No
BAL R14,FMT000 Display error
LA R15,8 Set RC=8
*
PUT090 EQU *
LA R1,1 Get 1
A R1,OUTRECS Bump record count
ST R1,OUTRECS Update output counter
L R14,SV14PUT Load return reg
BR R14 Return with RC in R15
*
*-- Build IEBCOPY control statements
*
*-- Used if a member name was specified on DATASET and the PDS option
*-- was specified.
*
*-- Entry: None
*-- Exit: None; card images written to the SYSIN dataset.
*
CTL000 EQU *
ST R14,SV14SI Save return reg
*
L R15,=A(DMYOUTDS) -> DCB to use as model
MVC SYSINDS(DMYOUTDL),0(R15) Set up DCB model
LA R6,SYSINDS -> DCB
USING IHADCB,R6
MVC DCBDDNAM,DDSYSIN Set DCB DDNAME
DROP R6 IHADCB
*
L R15,=A(OPEN) -> model list
MVC MACLIST(OPENL),0(R15) Move OPEN list
OPEN (SYSINDS,OUTPUT), Open the SYSIN dataset X
MF=(E,MACLIST)
OI FLAGS2,F2SYSOPN Indicate DCB is open
*
*-- Build IEBCOPY control statements to select one member
*
MVC REC,BLANKS Init record image
MVC REC+1(10),=C'COPY INDD='
MVC REC+11(8),DDSYSUT1 Set SYSUT1 DD name
TRT REC+11(9),BLANK Look for end
MVC 0(7,R1),=C',OUTDD='
MVC 7(8,R1),DDSYSUT2 Set SYSUT2 DD name
PUT SYSINDS,REC Write the COPY ctrl stmt
*
MVC REC,BLANKS Init image
MVC REC+1(5),=C'S M=('
MVC REC+6(8),INMEM User specified member name
TRT REC+6(9),BLANK Look for end
MVI 0(R1),C')' End selection list
PUT SYSINDS,REC
*
TM FLAGS2,F2SYSOPN Is SYSINDS open?
BZ CTL090 No
L R15,=A(CLOSE) -> model list
MVC MACLIST(CLOSEL),0(R15) Move close list
CLOSE (SYSINDS), Close it X
MF=(E,MACLIST)
*
CTL090 EQU *
L R14,SV14SI Load return reg
BR R14 Return
*
*
*-- Format VSAM NETSPOOL errors
*
*
FMT000 EQU *
STM R14,R2,PARSA+12 Borrow NJEPAR save area
LA R15,0(,R14) Clear high, Get addr of call to this rtn
L R2,NJESA+4 -> system provided FSA
L R2,16(,R2) Get R15's entry point addr
LA R2,0(,R2) Ensure high byte clear
SR R15,R2 Compute offset of call
MVC LIST+0(4+L'MSG024T),MSG024 Move msg text
MVC LIST+55(8),5(R2) Move csect name
TRT LIST+55(9),BLANK Look for end of csect name
MVI 0(R1),C'+'
*
ST R15,DBLE Save call offset to work area
UNPK TWRK(5),DBLE+2(3) Add zones
TR TWRK(4),HEXTRAN-240 Display hex
MVC 1(4,R1),TWRK Move call offset to msg
*
LA R15,NCB1
UNPK TWRK(5),NCBRTNCD-NCB(3,R15) Add zones
TR TWRK(4),HEXTRAN-240
MVC LIST+35(4),TWRK Move rtncd/errcd
*
UNPK TWRK(3),NCBREQ-NCB(2,R15) Add zones
TR TWRK(2),HEXTRAN-240
MVC LIST+45(2),TWRK Move req code
*
L R1,NCBMACAD-NCB(,R15) Get failing VSAM macro addr
LA R1,0(,R1) Clear high byte
S R1,=V(NJESPOOL) Compute offset into NJESPOOL rtn
ST R1,DBLE
UNPK TWRK(5),DBLE+2(3) Add zones
TR TWRK(4),HEXTRAN-240 Display hex
MVC LIST+50(4),TWRK Move NJESPOOL offset to msg
*
LA R2,LIST
BAL R14,PUTLINE
*
FMT090 EQU *
LM R14,R2,PARSA+12 Restore caller regs
BR R14 Return
*
*-- Write a single line to terminal
*
*-- Entry: R2 -> output msg (RDW+msg text)
*-- Exit: R15 = RC from PUTLINE
*
PUTLINE EQU *
TM FLAGS3,F3QUIET QUIET mode enabled?
BZ PUT010 No, proceed
CLI 3(R2),1 Suppress this msg in QUIET mode?
BER R14 Yes
*
PUT010 EQU *
ST R14,SV14LN Save return
XC PUTECB,PUTECB Clear PUTLINE ECB
L R15,CPARMS -> command input CPPL
USING CPPL,R15
LA R1,IOPLAREA -> IOPL
USING IOPL,R1
MVC IOPLUPT,CPPLUPT Set UPT ptr
MVC IOPLECT,CPPLECT Set ECT ptr
DROP R15 CPPL
*
MVC TWRK(PBL),PB Move macro model
PUTLINE PARM=TWRK, Write a line x
ECB=PUTECB, x
OUTPUT=((R2),TERM,SINGLE,DATA), x
MF=(E,(1))
DROP R1 IOPL
L R14,SV14LN Load return
BR R14
*
*-- Get status of NJE38
*
*-- Entry: R1=0 (no spool dsn needed), or, R1-> 44-char spool DSN area
*-- Exit: RC=0 NJE38 is active; R1-> NJE38 CSA block
*-- RC<>0 NJE is not active.
*
*
CHK000 EQU *
LA R1,SPLDSN => where to place spool DSN v210
L R15,=V(NJESYS) -> ENQ finder v210
BALR R14,R15 Check if NJE38 already act v210
LTR R15,R15 Set CC (RC=0 NJE38 active) v210
BNZR R2 Return if NJE38 inactive v210
MVC LCLNODE,NJ38NODE-NJ38CSA(R1) Save off lcl node namev210
MVC DEFUSER,NJ38DUSR-NJ38CSA(R1) Save off default user v210
BR R2 Return; NJE38 active v210
*
LTORG
*
PB PUTLINE MF=L
PBL EQU *-PB
*
NJE38Q DC CL8'NJE38' QNAME
NJERCON DC CL8'NJEINIT' RNAME (first 8 bytes)
*
*
*
BLANKS DC CL120' '
NONBLANK DC 64X'FF',X'00',191X'FF' TR Table to locate nonblank
BLANK DC 64X'00',X'FF',191X'00' TR Table to locate blanks
DOTS DC 75X'00',X'FF',180X'00' TR Table to locate '.' char
HEXTRAN DC CL16'0123456789ABCDEF' Translate table
*
NONALNUM EQU * 0 1 2 3 4 5 6 7 8 9 A B C D E F
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 0
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 1 Allow alpha-
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 2 numeric only
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 3 and '.'
DC X'FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF' 4
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 5
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 6
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' 7
DC X'FF000000000000000000FFFFFFFFFFFF' 8
DC X'FF000000000000000000FFFFFFFFFFFF' 9
DC X'FFFF0000000000000000FFFFFFFFFFFF' A
DC X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' B
DC X'FF000000000000000000FFFFFFFFFFFF' C
DC X'FF000000000000000000FFFFFFFFFFFF' D
DC X'FFFF0000000000000000FFFFFFFFFFFF' E
DC X'00000000000000000000FFFFFFFFFFFF' F
*
*-- TRANSMIT messages
*
*-- Note: a '1' after the length indicates suppress this msg if QUIET
*
MSGBLNK DC Y(4+L'MSGBLNKT,1)
MSGBLNKT DC C' '
*
MSG000 DC Y(4+L'MSG000T,1)
MSG000T DC C'NJE38 TRANSMIT &VERS'
*
MSG001 DC Y(4+L'MSG001T,0)
MSG001T DC C'Error parsing TRANSMIT command parameters. IKJPARS RC=x
yy (dec)'
* 456789012345678901234567890123456789012345678901234567
*
MSG002 DC Y(4+L'MSG002T,0)
MSG002T DC C'DATASET(dsname) parameter is missing; it is required'
*
MSG003 DC Y(4+L'MSG003T,0)
MSG003T DC C'Input dataset must be sequential or partitioned (DSORGx
=PS/PO)'
* NJE00250
*
MSG004 DC Y(4+L'MSG004T,0)
MSG004T DC C'No transmit parameters were specified'
*
MSG005 DC Y(4+L'MSG005T,0)
MSG005T DC C'Invalid node.user specification'
*
MSG006 DC Y(4+L'MSG006T,0)
MSG006T DC C'The TRANSMIT command is not APF-authorized'
*
MSG007 DC Y(4+L'MSG007T,0)
MSG007T DC C'OUTDATASET must specify a sequential dataset or PDS wix
th a member name'
*
MSG008 DC Y(4+L'MSG008T,0)
MSG008T DC C'OUTDATASET specifies a PDS; a member name is required'
*
MSG009 DC Y(4+L'MSG009T,1)
MSG009T DC C'File successfully ' queued to/written to v200
*
MSG010 DC Y(4+L'MSG010T,0)
MSG010T DC C'I/O error writing '
*
*
MSG011 DC Y(4+L'MSG011T,0)
MSG011T DC C'A destination node.userid was not specified'
*
MSG012 DC Y(4+44+L'MSG012T,0)
MSG012T DC C'Allocation error xxxxxxxx, DSN='
*
MSG013 DC Y(4+L'MSG013T,0)
MSG013T DC C'NJE38 is not active'
*
*
MSG014 DC Y(4+L'MSG014T,0)
MSG014T DC C'Access to the NETSPOOL dataset denied due to security x
settings'
*
MSG015 DC Y(4+L'MSG015T,0) v200
MSG015T DC C'Member xxxxxxxx was not found' v200
*
MSG018 DC Y(4+L'MSG018T,0)
MSG018T DC C'Transmit failed due to IEBCOPY RC=xx'
* 456789012345678901234567890123456789012345678901234567
*
MSG024 DC Y(4+L'MSG024T,0)
MSG024T DC C'ERROR: NETSPOOL RTNCD/ERRCD=X''0000'',REQ=01,O=1234,Mx
MMMMMMM '
*
MSG025 DC Y(4+L'MSG025T,0)
MSG025T DC C'Unable to open NETSPOOL. Run IDCAMS VERIFY against thex
NETSPOOL dataset'
*
MSG027 DC Y(4+L'MSG027T,0)
MSG027T DC C' exists'
*
MSG031 DC Y(4+L'MSG031T,0)
MSG031T DC C' does not exist'
*
* NJE00250
* NJE00250
*********************
* N J E D Y N * NJEDYN handles the various
* * dynamic allocations required
* Handle DYNALLOC * and their unallocations as well.
* *
*********************
*
* USING INMFIELD,R7 -> R7 at entry
*
NJEDYN CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDYN'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJEDYN,R12 NJE00070
USING NJEWK,R10
ST R13,DYNSA+4 SAVE prv S.A. ADDR NJE00080
LA R1,DYNSA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC LS99RB,CPS99RB init THE S99RB
LA R1,LS99RB -> S99RB
USING S99RB,R1
ST R1,LS99PTR Set parameter word
OI LS99PTR,X'80' Set VL
LA R6,TXTPTRS -> start of text unit list
ST R6,S99TXTPP Put in S99RB
DROP R1 S99RB
*
UNDYN EQU 0 00 unallocate DDNAME
DYNUNDEF EQU 4 04 unused, undefined
DYNSYSIN EQU 8 08 Allocate SYSIN for IEBCOPY
DYNSYSPR EQU 12 0C Allocate SYSPRINT for IEBCOPY
DYNUNLD EQU 16 10 Allocate unload dataset IEBCOPY
DYNSYSU4 EQU 20 14 Allocate SYSUT4 IEBCOPY
DYNINDS EQU 24 18 Allocate user input dataset
DYNETSPL EQU 28 1C Allocate NETSPOOL
DYNOUTDS EQU 32 20 Allocate OUTDATASET
*
LR R5,R0 Copy action code
B DYN000(R5) Branch into table
*
DYN000 B DYN010 00 Perform DDNAME Unallocation
DC AL4(0) 04 undefined
B DYN200 08 Allocate SYSIN for IEBCOPY
B DYN300 0C Allocate SYSPRINT for IEBCOPY
B DYN400 10 Allocate unload dataset IEBCOPY
B DYN500 14 Allocate SYSUT4 IEBCOPY
B DYN600 18 Allocate user input dataset
B DYN700 1C Allocate NETSPOOL
B DYN800 20 Allocate OUTDATASET
*
DYN010 EQU *
MVC UTXT,UTXTD Init text unit
LA R1,LS99RB -> S99RB
USING S99RB,R1
MVI S99VERB,S99VRBUN Set verb code to unallocation
DROP R1 S99RB
*
LA R0,UTXT -> UNALLOC DD text unit
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Deallocate the DD
*
*-- SYSIN for IEBCOPY
*
* Equivalent JCL (if command line SEQL specified or defaulted):
* //SYS00000 DD DUMMY
*
*
* Equivalent JCL (if command line PDS specified and a member name
* was coded in DATASET):
* //SYS00000 DD DISP=(NEW,DELETE),UNIT=SYSDA,
* // SPACE=(CYL,1)
*
*
DYN200 EQU *
TM FLAGS3,F3PDS PDS copy forced?
BO DYN220 Y, we need to set up for
* IEBCOPY control statements
*
MVC TXT01,TXT01D Init from the models
MVC TXT16,TXT16D
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT16 -> DUMMY
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
DYN220 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT03,TXT03D DISP 1
MVC TXT04,TXT04D DISP 2
MVC TXT06,TXT06D PRIME
MVC TXT10,TXT10D UNIT
MVC TXT19,TXT19D CYL
*
MVI TXT04+6,X'04' Adjust to DISP=,DELETE
MVC TXT06+6(3),=XL3'01' 1 cylinders
*
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=NEW
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP=,DELETE
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> Primary space
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT10 -> UNIT
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT19 -> SPACE CYL
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- SYSPRINT for IEBCOPY
*
* Equivalent JCL:
* //SYS00000 DD SYSOUT=*,TERM=TS
*
DYN300 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT16,TXT16D
MVC TXT17,TXT17D
MVC TXT18,TXT18D
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
*
TM FLAGS3,F3QUIET QUIET mode enabled?
BO DYN310 Yes, use DUMMY
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT17 -> SYSOUT=*
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT18 -> TERM=TS
ST R0,0(,R6) Plug into ptr list
B DYN320
*
DYN310 EQU *
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT16 -> DUMMY
ST R0,0(,R6) Plug into ptr list
*
DYN320 EQU *
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Temporary dataset that IEBCOPY will unload into
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,DELETE),UNIT=SYSDA,
* // SPACE=(4096,(pri,sec)),
* // DCB=(BLKSIZE=4096,DSORG=PS)
*
DYN400 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D DSN
MVC TXT03,TXT03D DISP1
MVC TXT04,TXT04D DISP2
MVC TXT05,TXT05D Blklen
MVC TXT06,TXT06D Prime
MVC TXT07,TXT07D Second
MVC TXT09,TXT09D volume
MVC TXT10,TXT10D unit
MVC TXT12,TXT12D BLKSIZE
MVC TXT13,TXT13D DSORG
*
LA R0,TXT01 -> Return DDNAME text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP text unit 1
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP text unit 2
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT05 -> BLKLEN text unit 2
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> PRIMARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT07 -> SECONDARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT12 -> BLKSIZE text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT13 -> DSORG text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT09 -> VOLSER text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT10 -> UNIT text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSN text unit
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
*
MVI TXT04+6,X'04' Set DISP=,DELETE
MVC TXT09(2),=Y(DALRTVOL) Set to return VOLSER
MVC TXT02(2),=Y(DALRTDSN) Set to return DSN
B DYN900 Go allocate
*
*-- SYSUT4 for IEBCOPY
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,DELETE),UNIT=SYSDA,
* // SPACE=(CYL,5)
*
DYN500 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT03,TXT03D DISP 1
MVC TXT04,TXT04D DISP 2
MVC TXT06,TXT06D PRIME
MVC TXT10,TXT10D UNIT
MVC TXT19,TXT19D CYL
*
MVI TXT04+6,X'04' Adjust to DISP=,DELETE
MVC TXT06+6(3),=XL3'05' 5 cylinders
*
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=NEW
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP=,DELETE
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> Primary space
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT10 -> UNIT
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT19 -> SPACE CYL
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Dataset user.input.dataset from command line
*
* Equivalent JCL:
* //SYS00000 DD DISP=SHR,DSNAME=user.input.dataset(mem)
*
DYN600 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
MVC TXT09,TXT09D
MVC TXT13,TXT13D
MVC TXT21,TXT21D
*
MVI TXT03+6,X'08' set DISP=SHR
MVC TXT09(2),=Y(DALRTVOL) Set to return VOLSER
MVC TXT13(2),=Y(DALRTORG) Set to return DSORG
*
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=SHR
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT09 -> RETURN VOLSER
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT13 -> RETURN DSORG
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSNAME
ST R0,0(,R6) Plug into ptr list
*
TM FLAGS3,F3PDS Was PDS specified?
BO DYN610 Yes, we'll use IEBCOPY, no mbr
TM FLAGS3,F3INMEM Was a member specified?
BZ DYN610 No
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT21 -> MEMBER
ST R0,0(,R6) Plug into ptr list
*
DYN610 EQU *
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Dataset NETSPOOL
*
* Equivalent JCL:
* //NETSPOOL DD DISP=SHR,DSNAME=NJE38.NETSPOOL
*
*
DYN700 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
*
MVC TXT01(2),=Y(DALDDNAM) Use fixed DD
MVI TXT03+6,X'08' set DISP=SHR
*
LA R0,TXT01 -> DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=SHR
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSNAME
ST R0,0(,R6) Plug into ptr list
*
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Dataset created for OUTDATASET
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,CATLG),UNIT=unitname,
* // SPACE=(3120,(pri,sec)),
* // DCB=(BLKSIZE=3120,LRECL=80,RECFM=FB,DSORG=PS),
* // DSN=dsname,VOL=SER=volser
*
DYN800 EQU *
TM FLAGS2,F2EXIST Does OUTDATASET exist?
BO DYN850 Yes, don't create it
*
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
MVC TXT04,TXT04D
MVC TXT05,TXT05D
MVC TXT06,TXT06D
MVC TXT07,TXT07D
MVC TXT08,TXT08D
MVC TXT09,TXT09D
MVC TXT10,TXT10D
MVC TXT12,TXT12D
MVC TXT13,TXT13D
MVC TXT14,TXT14D
MVC TXT15,TXT15D
MVC TXT21,TXT21D
*
LA R0,TXT01 -> Return DDNAME text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP text unit 1
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP text unit 2
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT12 -> BLKSIZE text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT05 -> BLKLEN text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT14 -> LRECL text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT15 -> RECFM text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> PRIMARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT07 -> SECONDARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT13 -> DSORG text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT10 -> UNIT text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSN text unit
ST R0,0(,R6) Plug into ptr list
TM FLAGS3,F3VOLSER Was there a volser?
BZ DYN810 No
*
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT09 -> VOLSER text unit
ST R0,0(,R6) Plug into ptr list
*
DYN810 EQU *
TM FLAGS3,F3OUTMEM Was a member specified?
BZ DYN820 No
MVC TDSORG,=X'0200' Force DSORG to PO if member
MVC TDIRBLKS,=AL3(5) Set 5 directory blocks
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT08 -> DIRBLKS
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT21 -> MEMBER
ST R0,0(,R6) Plug into ptr list
*
DYN820 EQU *
TM FLAGS2,F2UNIT User specified unit? v200
BZ DYN890 No v200
MVC TUNIT,OUTUNIT Use user specified unit namev200
*
DYN890 EQU * v200
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Allocate existing OUTDATASET (with optional member)
*
* Equivalent JCL:
* //SYS00000 DD DISP=SHR,DSNAME=out.data.set(mem)
*
DYN850 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
MVC TXT21,TXT21D
*
MVI TXT03+6,X'08' set DISP=SHR
*
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=SHR
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSNAME
ST R0,0(,R6) Plug into ptr list
*
TM FLAGS3,F3OUTMEM Was a member specified?
BZ DYN860 No
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT21 -> MEMBER
ST R0,0(,R6) Plug into ptr list
*
DYN860 EQU *
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Allocate the dataset
*
DYN900 EQU *
LA R1,LS99RB -> S99RB
USING S99RB,R1
OI S99FLAG1,S99NOCNV FORCE NEW ALLOCATION
DROP R1
LA R1,LS99PTR POINTER TO S99 PTR
SVC 99 ISSUE DYNALLOC
LTR R15,R15 Any errors?
BZ XITDYN00 No
*
LA R1,LS99RB
USING S99RB,R1
UNPK TWRK(9),S99ERROR(5) Add zones to error code
DROP R1
TR TWRK(8),HEXTRAN-240
*
CLI TWRK+1,C'7' Class 7 error code?
BNE ERR012 No
LA R1,DYNINDS Code for the input dataset?
CR R1,R5 Was alloc for DYNINDS?
BE ERR031 Yes, dataset does not exist
*
ERR012 EQU *
MVC LIST(4+L'MSG012T),MSG012 Dyn alloc failure msg
MVC LIST+21(8),TWRK Error codes to line
MVC LIST+35(44),TDSNAME Move DSNAME
LA R2,LIST -> msg
BAL R14,PUTLINE Display it
B XITDYN08
*
ERR031 EQU *
MVC LIST,BLANKS
MVC LIST+4(9),=C'Dataset '''
MVC LIST+13(44),TDSNAME Move name
TRT LIST+13(45),BLANK Look for end of name
MVI 0(R1),C'''' Close apost
LA R1,1(,R1) Skip apost
MVC 0(L'MSG031T,R1),MSG031T Move rest of msg
LA R1,L'MSG031T(,R1) point to end
XC LIST(4),LIST Clear RDW area
LA R2,LIST -> start of RDW+msg
SR R1,R2 Compute total length
STH R1,LIST Plug RDW
BAL R14,PUTLINE Inform user
B XITDYN04 And exit with dataset doesnt exist
*
*
*-- Exit
*
XITDYN00 EQU *
SR R15,R15 Set RC=0; alloc/dealloc ok
B XITDYN
*
XITDYN04 EQU *
LA R15,4 Set RC=4; Exit for special action
B XITDYN
*
XITDYN08 EQU *
LA R15,8 Set RC=8; allocation error
*
XITDYN EQU *
L R13,4(,R13) -> prev s.a.
ST R15,16(,R13) Set RC
LM R14,R12,12(R13) Reload callers regs
BR R14 Return with RC
*
LTORG
* DROP R7 INMFIELD
*
*
*
*-- Text unit skeletons
*
*-- Note: EXPDT is included for completeness but is not used.
*
*
*
TXT01D DC Y(DALRTDDN),AL2(1),AL2(8) RETURN DDNAME
TXT02D DC Y(DALDSNAM),AL2(1),AL2(44) DSNAME
TXT03D DC Y(DALSTATS),AL2(1),AL2(1),X'04' DISP=(NEW,)
TXT04D DC Y(DALNDISP),AL2(1),AL2(1),X'02' DISP=(,CATLG)
TXT05D DC Y(DALBLKLN),AL2(1),AL2(3) BLK TEXT KEY, BLKLEN
TXT06D DC Y(DALPRIME),AL2(1),AL2(3) PRIMARY SPACE UNITS
TXT07D DC Y(DALSECND),AL2(1),AL2(3) SECONDARY SPACE UNITS
TXT08D DC Y(DALDIR),AL2(1),AL2(3) DIRECTORY BLOCKS
TXT09D DC Y(DALVLSER),AL2(1),AL2(6) VOLSER
TXT10D DC Y(DALUNIT),AL2(1),AL2(8),CL8'SYSDA' UNIT default v200
TXT11D DC Y(DALEXPDT),AL2(1),AL2(5) EXPDT C'YYDDD'
TXT12D DC Y(DALBLKSZ),AL2(1),AL2(2) BLKSIZE
TXT13D DC Y(DALDSORG),AL2(1),AL2(2) DSORG
TXT14D DC Y(DALLRECL),AL2(1),AL2(2) LRECL
TXT15D DC Y(DALRECFM),AL2(1),AL2(1) RECFM
TXT16D DC Y(DALDUMMY),AL2(0) DUMMY
TXT17D DC Y(DALSYSOU),AL2(0) SYSOUT
TXT18D DC Y(DALTERM),AL2(0) TERM
TXT19D DC Y(DALCYL),AL2(0) CYLINDER
TXT20D DC Y(DALCLOSE),AL2(0) FREE=CLOSE
TXT21D DC Y(DALMEMBR),AL2(1),AL2(8) MEMBER
*
UTXTD DC Y(DUNDDNAM),AL2(1),AL2(8) DD for deallocation
*
DS 0F
CPS99RB DS 0XL20 DEFINE INITIAL S99RB
DC AL1(20) LENGTH OF REQ BLOCK
DC AL1(1) VERB CODE: ALLOCATION
DC X'20' FLAGS: NO MOUNTS,OFFLINE VOLS
DC X'00' FLAGS
DC AL2(0) ERROR REASON CODE
DC AL2(0) INFO REASON CODE
DC A(0) ADDR OF TEXT PTRS
DC A(0) ADDR OF RBX
DC AL4(0) MORE FLAGS
* NJE00250
*
*
*********************
* N J E N E T * NJENET converts the incoming
* * files into NETDATA format and
* Output NETDATA * writes 80-byte records to the spool
* * or OUTDATASET destination.
*********************
*
NJENET CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJENET'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs
LR R12,R15 Base
USING NJENET,R12
USING NJEWK,R10
ST R13,NETSA+4 SAVE prv S.A. ADDR
LA R1,NETSA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
*
****************
* BUILD INMR01 *
****************
*
USING INMFIELD,R7
LA R7,INMF01 -> INMR01 fields
LA R3,BUFF -> build buffer
MVI 0(R3),0 Init control record length
MVI 1(R3),X'E0' Indicate 1 segment, ctl record
MVC 2(6,R3),INMR01 Create INMR01
LA R3,8(,R3) -> next available byte
*
BAL R14,B1LRECL Build the LRECL
BAL R14,B1FNODE Build the FNODE
BAL R14,B1FUID Build the FUID
BAL R14,B1TNODE Build the TNODE
BAL R14,B1TUID Build the TUID
BAL R14,B1FTIME Build the time stamp
BAL R14,B1NUMF Build the number of files
*
LA R1,BUFF -> start of build buffer
SR R3,R1 Compute INMR01 total length
STC R3,0(,R1) Plug into length byte
*
LR R0,R3 Length to R0
BAL R14,PUTBYTES Write the entire segment
*
****************
* BUILD INMR02 *
****************
*
LA R7,INMF02A -> 1st INMR02 fields
LA R3,BUFF -> build buffer
MVI 0(R3),0 Init control record length
MVI 1(R3),X'E0' Indicate 1 segment, ctl record
MVC 2(6,R3),INMR02 Create INMR02
MVC 8(4,R3),=F'1' Set file number to 1
LA R3,12(,R3) -> next available byte
*
BAL R14,B2UTIL Build the Utility name
BAL R14,B2FSIZE Build the file size
BAL R14,B2DIRBLK Build the dir blocks
BAL R14,B2LRECL Build the LRECL
BAL R14,B2DSORG Build the DSORG
BAL R14,B2BLKSI Build the BLKSIZE
BAL R14,B2RECFM Build the RECFM
BAL R14,B2DSN Build the DSNAME
*
LA R1,BUFF -> start of build buffer
SR R3,R1 Compute INMR02 total length
STC R3,0(,R1) Plug into length byte
*
LR R0,R3 Length to R0
BAL R14,PUTBYTES Write the entire segment
*
****************
* BUILD INMR02 * Second INMR02 is build if input DS was a PDS
****************
*
TM FLAGS1,F1INPDS Was input DS a PDS?
BZ INM3 No, dont need 2nd INMR02
LA R7,INMF02B -> 2nd INMR02 fields
LA R3,BUFF -> build buffer
MVI 0(R3),0 Init control record length
MVI 1(R3),X'E0' Indicate 1 segment, ctl record
MVC 2(6,R3),INMR02 Create INMR02
MVC 8(4,R3),=F'1' Set file number to 1
LA R3,12(,R3) -> next available byte
*
BAL R14,B2UTIL Build the Utility name
BAL R14,B2FSIZE Build the file size
BAL R14,B2LRECL Build the LRECL
BAL R14,B2DSORG Build the DSORG
BAL R14,B2BLKSI Build the BLKSIZE
BAL R14,B2RECFM Build the RECFM
*
LA R1,BUFF -> start of build buffer
SR R3,R1 Compute INMR02 total length
STC R3,0(,R1) Plug into length byte
*
LR R0,R3 Length to R0
BAL R14,PUTBYTES Write the entire segment
*
****************
* BUILD INMR03 *
****************
*
INM3 EQU *
LA R7,INMF02A -> 1st INMR02 fields
L R0,FILESIZE Get size from prev INMR02 buffer
LA R7,INMF03 -> INMR03 fields
ST R0,FILESIZE Plug it into INMR03 buffer
LA R3,BUFF -> build buffer
MVI 0(R3),0 Init control record length
MVI 1(R3),X'E0' Indicate 1 segment, ctl record
MVC 2(6,R3),INMR03 Create INMR02
LA R3,8(,R3) -> next available byte
*
BAL R14,B3FSIZE Build the file size
BAL R14,B3LRECL Build the LRECL
BAL R14,B3DSORG Build the DSORG
BAL R14,B3RECFM Build the RECFM
*
LA R1,BUFF -> start of build buffer
SR R3,R1 Compute INMR03 total length
STC R3,0(,R1) Plug into length byte
*
LR R0,R3 Length to R0
BAL R14,PUTBYTES Write the entire segment
DROP R7 INMFIELD
*
****************
* PERFORM *
* "INMCOPY" *
* FUNCTION *
****************
*
CPY000 EQU *
LA R4,INDS -> INDS DCB
USING IHADCB,R4
LA R9,253 Segment size (less len,ctl bytes
*
CPY020 EQU *
GET INDS Get input record
LR R2,R1 -> record to R2
LH R3,DCBLRECL Get record length
MVI CTL,X'80' Assume starting new segment
*
TM DCBRECFM,DCBRECF RECFM=F (or U) records?
BO CPY060 Handle them same way
LH R3,0(,R2) Get length from RDW
S R3,=F'4' Remove length of RDW
LA R2,4(,R1) Skip over RDW
*
CPY060 EQU *
LR R5,R3 Working length to R5
CR R3,R9 LRECL <= max segment size?
BNH CPY070 Yes
LR R5,R9 Else limit to max segment
*
CPY070 EQU *
SR R3,R5 Compute remaining length
BCTR R5,0 Adjust working len for execute
EX R5,MVCREC Move record to build buffer
LA R2,1(R5,R2) -> next avail byte in record
LA R0,3(,R5) Account for ex, len & ctl bytes
STC R0,BUFF Set the segment length
LTR R3,R3 Is length remaining?
BNZ CPY080 Yes
OI CTL,X'40' Indicate this is last segment
*
CPY080 EQU *
MVC BUFF+1(1),CTL Set segment control
BAL R14,PUTBYTES Write the netdata
TM CTL,X'40' Did we process the final seg?
BO CPY020 Yes, time for a new record
MVI CTL,X'00' Clear segment ctl
B CPY060 Go get another
*
MVCREC MVC BUFF+2(0),0(R2) executed instr
*
EOD000 EQU *
LA R3,BUFF -> build buffer
MVI 0(R3),8 Init control record length
MVI 1(R3),X'E0' Indicate 1 segment, ctl record
MVC 2(6,R3),INMR06 Create INMR06
*
LA R0,8 Write the INMR06 record
BAL R14,PUTBYTES
*
XC BUFF,BUFF
L R1,PBREM Get # bytes remaining in REC
LA R0,1(,R1) +1 more to force record write
BAL R14,PUTBYTES Write a last full record
DROP R4 IHADCB
B XITNET00 NETDATA build complete
*
*
*
*-- NETDATA text unit key build routines
*
*
USING INMFIELD,R7
B1LRECL EQU *
MVC 0(2,R3),INMLRECL Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(4) Set length
MVC 6(4,R3),=A(80) LRECL always 80 for INMR01
LA R3,10(,R3) -> next available byte
BR R14 Return
*
B1FNODE EQU *
MVC 0(2,R3),INMFNODE Set key
MVC 2(2,R3),=Y(1) Set #
MVC 6(8,R3),LCLNODE Use local node name
LA R1,6+8(,R3) If TRT fails
TRT 6(8,R3),BLANK Look for end of name
LA R2,6(,R3) -> start of name
SR R1,R2 Compute length of name
STCM R1,3,4(R3) Set length of name
LA R3,6(R1,R3) -> next available byte
BR R14 Return
*
B1FUID EQU *
MVC 0(2,R3),INMFUID Set key
MVC 2(2,R3),=Y(1) Set #
MVC 6(8,R3),USERID Use userid
LA R1,6+8(,R3) If TRT fails
TRT 6(8,R3),BLANK Look for end of name
LA R2,6(,R3) -> start of name
SR R1,R2 Compute length of name
STCM R1,3,4(R3) Set length of name
LA R3,6(R1,R3) -> next available byte
BR R14 Return
*
B1TNODE EQU *
MVC 0(2,R3),INMTNODE Set key
MVC 2(2,R3),=Y(1) Set #
MVC 6(8,R3),DESTNODE Use destination node name
LA R1,6+8(,R3) If TRT fails
TRT 6(8,R3),BLANK Look for end of name
LA R2,6(,R3) -> start of name
SR R1,R2 Compute length of name
STCM R1,3,4(R3) Set length of name
LA R3,6(R1,R3) -> next available byte
BR R14 Return
*
B1TUID EQU *
MVC 0(2,R3),INMTUID Set key
MVC 2(2,R3),=Y(1) Set #
MVC 6(8,R3),DESTUSER Use destination userid
LA R1,6+8(,R3) If TRT fails
TRT 6(8,R3),BLANK Look for end of name
LA R2,6(,R3) -> start of name
SR R1,R2 Compute length of name
STCM R1,3,4(R3) Set length of name
LA R3,6(R1,R3) -> next available byte
BR R14 Return
*
B1FTIME EQU *
MVC 0(2,R3),INMFTIME Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(16) Set length
TIME DEC Get the date and time
* R1 = 0yyydddF
* R0 = hhmmssth
LR R2,R1 Copy the date info
SRL R2,12 Put year here: 0000yyyx
ST R2,DBLE Plug into work area
OI DBLE+3,X'0F' Insert sign
AP DBLE(4),=P'1900' Add base century
UNPK 6(4,R3),DBLE(4) Unpk the year
OI 9(R3),X'F0' Fix sign
DP DBLE(4),=P'4' Check for leap year
LA R15,LEAP Assume leap year
CP DBLE+3(1),=P'0' Did it divide evenly?
BE B1FTME10 Yes, it is a leap year
LA R15,NONLEAP Use non leap year table
*
B1FTME10 EQU *
N R1,=X'0000FFFF' Keep only the day and sign
ST R1,DBLE Save into work area
LA R2,1 Init month counter
*
B1FTME20 EQU *
CP DBLE(4),0(2,R15) Check against days table
BNH B1FTME30 Found the right month
LA R15,2(,R15) -> next days entry
LA R2,1(,R2) Next month number
B B1FTME20 Continue
*
B1FTME30 EQU *
C R2,=F'1' Was it found in month 1?
BE B1FTME40 Yes, use day as is
BCTR R15,0 Back up
BCTR R15,0 to prior month's entry
SP DBLE(4),0(2,R15) Compute the day number
*
B1FTME40 EQU *
UNPK 12(2,R3),DBLE(4) unpk day number
OI 13(R3),X'F0' Fix sign
CVD R2,DBLE Convert month number
UNPK 10(2,R3),DBLE unpk month number
OI 11(R3),X'F0' Fix sign
*
ST R0,DBLE Save the time value
UNPK TWRK(9),DBLE(5) Add zones
MVC 14(8,R3),TWRK Mov the time HHMMSSTH
*
LA R3,22(,R3) -> next available byte
BR R14 Return
*
B1NUMF EQU *
MVC 0(2,R3),INMNUMF Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(1) Set length
MVI 6(R3),1 Only 1 file supported
LA R3,7(,R3) -> next available byte
BR R14 Return
*
B2UTIL EQU *
MVC 0(2,R3),INMUTILN Set key
MVC 2(2,R3),=Y(1) Set #
MVC 6(8,R3),UTLNAME Use utility name
LA R1,6+8(,R3) If TRT fails
TRT 6(8,R3),BLANK Look for end of name
LA R2,6(,R3) -> start of name
SR R1,R2 Compute length of name
STCM R1,3,4(R3) Set length of name
LA R3,6(R1,R3) -> next available byte
BR R14 Return
*
B2FSIZE EQU *
MVC 0(2,R3),INMSIZE Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(4) Set length
MVC 6(4,R3),FILESIZE File size in bytes
LA R3,10(,R3) -> next available byte
BR R14 Return
*
B2DIRBLK EQU *
ICM R0,15,DIRBLKS Get # of dir blocks needed
BZR R14 This key is not needed
MVC 0(2,R3),INMDIR Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(3) Set length
STCM R0,7,6(R3) Set directory blocks
LA R3,9(,R3) -> next available byte
BR R14 Return
*
B2LRECL EQU *
MVC 0(2,R3),INMLRECL Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(4) Set length
MVC 6(4,R3),LRECL Set LRECL
LA R3,10(,R3) -> next available byte
BR R14 Return
*
B2DSORG EQU *
MVC 0(2,R3),INMDSORG Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(2) Set length
MVC 6(2,R3),DSORG Set DSORG
LA R3,8(,R3) -> next available byte
BR R14 Return
*
B2BLKSI EQU *
ICM R0,15,BLKSIZE Get block size
BZR R14 This key is not needed
MVC 0(2,R3),INMBLKSZ Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(4) Set length
STCM R0,15,6(R3) Set blocksize
LA R3,10(,R3) -> next available byte
BR R14 Return
*
B2RECFM EQU *
TM RECFM,X'40' Variable (or U) records?
BZ *+8 No
MVI RECFM+1,X'02' Y, indicate varying w/o RDW fmt
*
MVC 0(2,R3),INMRECFM Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(2) Set length
MVC 6(2,R3),RECFM Set RECFM
LA R3,8(,R3) -> next available byte
BR R14 Return
*
B2DSN EQU *
CLI DSNAME,X'00' DSNAME field filled?
BER R14 Exit if no DSNAME avail
MVC 0(2,R3),INMDSNAM Set key
LA R1,DSNAME+44 In case TRT fails
TRT DSNAME,BLANK Find end of DSNAME
LA R2,DSNAME -> start
SR R1,R2 Compute DSN length
LR R0,R1 Keep length in R0
LA R1,1 Set # qualifiers to start
LA R4,4(,R3) -> where 1st length fld goes
*
B2DSN010 EQU *
LA R5,2(,R4) -> DSN qualifier goes
SR R6,R6 Init qualifier length
*
B2DSN020 EQU *
CLI 0(R2),C'.' Look for qualification delim
BNE B2DSN040 No, just a regular character
STCM R6,3,0(R4) Fill in length field
LA R4,2(R6,R4) -> next length field area
LA R1,1(,R1) Bump qualifier count
LA R2,1(,R2) -> next DSN character (skip '.')
BCT R0,B2DSN010 Keep building
ABEND106 ABEND 106,DUMP Shouldn't happen
*
B2DSN040 EQU *
MVC 0(1,R5),0(R2) Move a DSN char
LA R5,1(,R5) Next available byte in BUFF
LA R6,1(,R6) Count qualifier length
LA R2,1(,R2) -> next DSN character
BCT R0,B2DSN020 Keep building
*
STCM R1,3,2(R3) Set the # field (# qualifiers)
STCM R6,3,0(R4) Fill in length field
LA R3,2(R6,R4) -> next length field area
BR R14 Return
*
B3FSIZE EQU *
MVC 0(2,R3),INMSIZE Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(4) Set length
MVC 6(4,R3),FILESIZE File size in bytes
LA R3,10(,R3) -> next available byte
BR R14 Return
*
B3DSORG EQU *
MVC 0(2,R3),INMDSORG Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(2) Set length
MVC 6(2,R3),=X'4000' Set DSORG to PS in INMR03
LA R3,8(,R3) -> next available byte
BR R14 Return
*
B3LRECL EQU *
MVC 0(2,R3),INMLRECL Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(4) Set length
MVC 6(4,R3),=A(80) LRECL always 80 for INMR03
LA R3,10(,R3) -> next available byte
BR R14 Return
*
B3RECFM EQU *
MVC 0(2,R3),INMRECFM Set key
MVC 2(2,R3),=Y(1) Set #
MVC 4(2,R3),=Y(2) Set length
MVC 6(2,R3),=X'0001' Shortened transmission var fmt
LA R3,8(,R3) -> next available byte
BR R14 Return
*
*
*-- Request some more bytes of NETDATA formatted data
*
*-- Entry: R0 = # of bytes to write (1-255)
*-- BUFF contains the data
*
*-- Exit: None
*
*-- Uses R0-R1,R5-R8,R14-R15; the caller's values in these
*-- registers are not preserved across this call.
*
PUTBYTES EQU *
ST R14,SV14PB Save return addr
L R5,PBREM Get # bytes remaining in rec buf
LA R1,BUFF Point to putbytes (PB) buffer
ST R1,PBPOS Set starting position
*
LR R8,R0 Requested amount to R8
*
*
PB010 EQU *
LTR R5,R5 Any bytes left in phys record?
BP PB040 Yes, use them first
*
BAL R14,PUT000 Write the record
LTR R15,R15 Any errors?
BNZ XITNET08 Exit if yes
*
LA R5,80 Reset record to 80 remaining
LA R1,REC -> physical record
ST R1,PBRPS Reset start of record position
*
PB040 EQU *
LR R7,R8 Assume requested amt avail
LR R15,R8 Same
*
CR R5,R8 Have more than we need?
BH PB050 Yes, just move requested
LR R7,R5 Else move only what we have avai
LR R15,R5 Same
*
PB050 EQU *
LR R0,R7 Save copy of length to move
L R14,PBPOS -> PB buffer position
L R6,PBRPS -> output record curr position
MVCL R6,R14 Move
*
ST R14,PBPOS New PB position
ST R6,PBRPS New phys record curr position
*
SR R5,R0 Reduce bytes left in phy record
SR R8,R0 Reduce requested amt
BP PB010 We need more, go get it
*
ST R5,PBREM Remember whats left in phy rec
*
L R14,SV14PB Load return addr
BR R14 Return from getbytes
*
*
*
*-- Exits from NJENET
*
XITNET00 EQU *
SR R15,R15
B XITNET
*
XITNET08 EQU *
LA R15,8 I/O writing records
B XITNET
*
XITNET EQU *
L R13,4(,R13) -> prev s.a.
ST R15,16(,R13) Set RC
LM R14,R12,12(R13) Reload callers regs
BR R14 Return with RC
*
*
LTORG
*
NONLEAP DC PL2'31,59,90,120,151,181,212,243,273,304,334,365'
LEAP DC PL2'31,60,91,121,152,182,213,244,274,305,335,366'
*
*-- Find INMR01 record
* NET02190
* NET02190
*- Control records that we look for and process (others ignored). NET02190
INMR01 DC C'INMR01' Header Control record NET02200
INMR02 DC C'INMR02' File Utility Control record NET02210
INMR03 DC C'INMR03' Data Control record NET02210
INMR06 DC C'INMR06' Trailer Control record NET02210
* NET02220
*- Keys we are supporting NET02230
INMKEYS DS 0H
INMBLKSZ DC X'0030' Block size
INMDIR DC X'000C' Number of directory blocks
INMDSNAM DC X'0002' Name of the file
INMDSORG DC X'003C' File organization
INMFNODE DC X'1011' Origin node name or node number
INMFTIME DC X'1024' Origin timestamp
INMFUID DC X'1012' Origin user ID
INMLRECL DC X'0042' Logical record length
INMRECFM DC X'0049' Record format
INMSIZE DC X'102C' File size in bytes
INMTNODE DC X'1001' Target node name or node number
INMTUID DC X'1002' Target user ID
INMUTILN DC X'1028' Name of utility program
INMNUMF DC X'102F' Number of files transmitted = 1
DC X'FFFF' End of table
* NET02220
*- Keys we are NOT supporting; for reference NET02230
INMCREAT EQU X'1022' Creation date
INMDDNAM EQU X'0001' DDNAME for the file
INMEATTR EQU X'8028' Extended attribute status
INMERRCD EQU X'1027' RECEIVE command error code
INMEXPDT EQU X'0022' Expiration date
INMFACK EQU X'1026' Originator requested notificat'n
INMFFM EQU X'102D' Filemode number
INMFVERS EQU X'1023' Origin version num of the data
INMLCHG EQU X'1021' Date last changed
INMLREF EQU X'1020' Date last referenced
INMLSIZE EQU X'8018' Data set size in megabytes.
INMMEMBR EQU X'0003' Member name list
INMRECCT EQU X'102A' Transmitted record count
INMSECND EQU X'000B' Secondary space quantity
INMTERM EQU X'0028' Data transmitted as a message
INMTYPE EQU X'8012' Data set type
INMTTIME EQU X'1025' Destination timestamp
INMUSERP EQU X'1029' User parameter string
*
*-- Target fields from INMRxx control records that we issue:
*
*
* INMR0x R=required to be sent
* 1 2 3 6 X=may optionally be sent
INMFIELD DSECT - - - -
UTLNAME DS CL8 R Utility name NET02490
FNODE DS CL8 R Origin node NET02580
FUSER DS CL8 R Origin userid NET02580
TNODE DS CL8 R Dest node NET02580
TUSER DS CL8 R Dest userid NET02580
FILESIZE DS XL4 R R File size in bytes NET02500
DIRBLKS DS XL4 X #directory blocks NET02500
BLKSIZE DS XL4 X BLKSIZE NET02510
LRECL DS XL4 R R R LRECL NET02520
DSORG DS XL2 R R DSORG NET02540
RECFM DS XL2 R R RECFM NET02530
DSNAME DS CL44 X DSNAME NET02580
FTIME DS CL20 R Origin time stamp NET02580
DS 0F Force to halfword size
INMFSZ EQU *-INMFIELD Size of DSECT
*
* NJE00250
*********************
* N J E P A R * NJEPAR calls IKJPARS to parse
* * the TSO command line parameters.
* TSO Command Line *
* Parse *
* *
*********************
*
* Entry: None.
*
*
* Exit: R15 = IKJPARS RC
*
NJEPAR CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEPAR'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJEPAR,R12 NJE00070
USING NJEWK,R10
ST R13,PARSA+4 SAVE prv S.A. ADDR NJE00080
LA R2,PARSA -> my save area
ST R2,8(,R13) Plug it into prior SA
LR R13,R2
*
*
LR R7,R0 Copy entry action code
LR R6,R1 Copy any passed ptr
*
*-- Identify and parse out the nodeid.userid if present
*
NOD000 EQU *
L R1,CPARMS -> CPPL entry parms
L R2,0(,R1) -> Command buffer
LH R3,0(,R2) Get length of command buffer
C R3,=F'257' Is buffer length within 256?
BL NOD010 Yes
LA R3,256 Set to max of 256
*
NOD010 EQU *
LR R4,R3 Copy final length
ICM R3,8,BLANKS Set pad character
LA R0,BUFF -> internal 256 byte work buffer
LA R1,256 Max length
MVCL R0,R2 Move CBUF to our stg area
*
STH R4,BUFF Set adjusted buffer length
MVC REC,BLANKS Use as temporary TRT over-
MVC LIST,BLANKS flow areas
*
NOD020 EQU *
SR R1,R1 Clear
LA R3,BUFF+4 -> copy of cmd buffer (past RDW)
AH R3,BUFF+2 -> first parameter
SH R4,BUFF+2 Reduce remaining length
S R4,=F'4' Back out length of buffer RDW
BZ XITPAR04 No parameters were entered
*
EX R4,TRTBLK Look for end of first param
BZ PARS000 Something wrong, give to parse
LR R5,R1 Save end of param addr
SR R1,R3 Compute length we traversed
LR R6,R1 Save copy of length to R6
C R1,=F'3' Length < 3?
BL PARS000 Can't be node.user
C R1,=F'17' Length > 17?
BH PARS000 Can't be node.user
*
BCTR R1,0 Adjust for execute
EX R1,TRTNAN Look for any non-alphanumeric
BNZ PARS000 Found something, not node.user
*
EX R6,TRTDLM Look for '.' delimiter
BZ PARS000 Didn't find it, not node.user
LA R4,1(,R1) Save addr of userid start
SR R1,R3 Compute length from start to dot
BZ PARS000 Not valid node name
C R1,=F'8' More than 8 char in node name?
BH XITPAR08 Not valid node name
MVC DESTNODE,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,OCNODE Save off node name and uppercase
LA R1,1(,R1) Restore length
SR R6,R1 Reduce length by node name size
BCTR R6,0 Reduce length of '.'
LTR R6,R6 is len=0? (. in last character)
BZ XITPAR08 Not valid node.user combo
C R6,=F'8' Userid > 8?
BH XITPAR08 Not valid user name
MVC DESTUSER,BLANKS Init receiving field
BCTR R6,0 Adjust for execute
EX R6,OCUSER Save off user name and uppercase
*
SR R5,R3 Compute area size of node.user
BCTR R5,0 Adjust for execute
EX R5,MVCREM Remove node.user from cmd buffer
OI FLAGS3,F3DEST Valid node.user specified
B PARS000 Turn the rest over to parser
*
MVCREM MVC 0(0,R3),BLANKS executed instr
OCNODE OC DESTNODE(0),0(R3) executed instr
OCUSER OC DESTUSER(0),0(R4) executed instr
TRTBLK TRT 0(0,R3),BLANK executed instr
TRTDLM TRT 0(0,R3),DOTS executed instr
TRTNAN TRT 0(0,R3),NONALNUM executed instr
*
*
PARS000 EQU *
L R1,CPARMS -> CPPL entry parms
LM R2,R5,0(R1) Get TSO command entry parameters
* R2 -> Command buffer
* R3 -> UPT
* R4 -> PSCB
* R5 -> ECT
*
LA R8,PPLSTG -> PPL
USING PPL,R8
ST R3,PPLUPT Set UPT addr
ST R5,PPLECT Set ECT addr
LA R3,PARSECB -> parse ECB
ST R3,PPLECB Set it
LA R3,ANSWER -> IKJPARS "answer area"
ST R3,PPLANS Set it
ST R10,PPLUWA Set user work area addr
*
* ** Process command line
LA R2,BUFF -> local copy of TSO cmd buff
ST R2,PPLCBUF Set TSO command buffer addr
L R3,=A(PCLDEFS) -> command parms definitions
ST R3,PPLPCL Set it
B PARS020
*
PARS020 EQU *
CALLTSSR EP=IKJPARS,MF=(E,PPLSTG) Parse command line
LTR R0,R15 Any parse errors?
BNZ XITPAR12 Yes
DROP R8 PPL
*
*- Examine command line results
L R4,ANSWER -> IKJPARS built PCEs
USING PRDSECT,R4
*
PARS030 EQU *
LA R2,QTPCE -> QUIET PCE
CLC 0(2,R2),=AL2(1) Was QUIET specified?
BNE PARS035 No
OI FLAGS3,F3QUIET Indicate QUIET
*
PARS035 EQU *
LA R2,PDSPCE -> PDS/SEQL PCE
CLC 0(2,R2),=AL2(2) Was PDS specified?
BNE PARS040 No
OI FLAGS3,F3PDS Indic PDS copy and not SEQL copy
*
PARS040 EQU *
LA R2,VOLPCE -> VOLSER PCE
TM 6(R2),X'80' Was VOLSER specified?
BZ PARS050 No
L R3,0(,R2) -> VOLSER string
LH R1,4(,R2) Length of volser
MVC OUTVOL,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,MVVOL Move the volser
OI FLAGS3,F3VOLSER Indicate volser valid
*
PARS050 EQU *
LA R2,OTDAPCE -> OUTDATASET PCE
TM 6(R2),X'80' Was OUTDATASET specified?
BZ PARS080 No
MVC OUTPUTDS,BLANKS Init receiving field
LA R5,OUTPUTDS -> where to place DSN
*
TM 6(R2),X'40' Was dataset name in quotes?
BO PARS060 Y, don't insert prefix
CLC PREFIX,BLANKS Is a prefix available?
BE PARS060 All blank, dont use prefix
*
MVC OUTPUTDS(8),PREFIX Add the prefix
TRT OUTPUTDS,BLANK Look for end of prefix
MVI 0(R1),C'.' Set delim after prefix
LA R5,1(,R1) -> place to put rest of dsn
LA R2,OTDAPCE -> OUTDATASET PCE
*
PARS060 EQU *
L R3,0(,R2) -> OUTDATASET string
LH R1,4(,R2) Length of DSN
BCTR R1,0 Adjust for execute
EX R1,MVDS Move the DSN
OI FLAGS3,F3OUTDS Indicate OUTDATASET valid
*
PARS070 EQU *
TM 14(R2),X'80' Was OUTDATASET member specified?
BZ PARS080 No
L R3,8(,R2) -> OUTDATASET member name
LH R1,12(,R2) Length of member name
MVC OUTMEM,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,MVOUTMEM Move the member name
OI FLAGS3,F3OUTMEM Indicate OUTDATASET member valid
*
PARS080 EQU *
LA R2,FDAPCE -> DATASET PCE
TM 6(R2),X'80' Was DATASET specified?
BZ PARS130 No v200
MVC INPUTDS,BLANKS Init receiving field
LA R5,INPUTDS -> where to place DSN
*
TM 6(R2),X'40' Was dataset name in quotes?
BO PARS090 Y, don't insert prefix
CLC PREFIX,BLANKS Is a prefix available?
BE PARS090 All blank, dont use prefix
*
MVC INPUTDS(8),PREFIX Add the prefix
TRT INPUTDS,BLANK Look for end of prefix
MVI 0(R1),C'.' Set delim after prefix
LA R5,1(,R1) -> place to put rest of dsn
LA R2,FDAPCE -> DATASET PCE
*
PARS090 EQU *
L R3,0(,R2) -> DATASET string
LH R1,4(,R2) Length of DSN
BCTR R1,0 Adjust for execute
EX R1,MVDS Move the DSN
OI FLAGS3,F3INDS Indicate DATASET valid
*
PARS100 EQU *
TM 14(R2),X'80' Was DATASET member specified?
BZ PARS120 No
L R3,8(,R2) -> DATASET member name
LH R1,12(,R2) Length of member name
MVC INMEM,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,MVINMEM Move the member name
OI FLAGS3,F3INMEM Indicate SEQL MEMBER specified
B PARS130 We're done v200
*
PARS120 EQU *
NI FLAGS3,255-F3PDS Turn off;we'll do what DSORG say
*
PARS130 EQU * v200
LA R2,UNIPCE -> UNIT PCE v200
TM 6(R2),X'80' Was UNIT specified? v200
BZ PARS190 No v200
L R3,0(,R2) -> UNIT string v200
LH R1,4(,R2) Length of unit name v200
MVC OUTUNIT,BLANKS Init receiving field v200
BCTR R1,0 Adjust for execute v200
EX R1,MVUNIT Move the unit v200
OI FLAGS2,F2UNIT Indicate unit valid v200
*
PARS190 EQU *
B XITPAR00 All done
DROP R4 PRDSECT
*
MVVOL MVC OUTVOL(0),0(R3) executed instr
MVDS MVC 0(0,R5),0(R3) executed instr
MVINMEM MVC INMEM(0),0(R3) executed instr
MVOUTMEM MVC OUTMEM(0),0(R3) executed instr
MVUNIT MVC OUTUNIT(0),0(R3) executed instr v200
*
*
*-- Exit
*
XITPAR00 EQU *
LA R1,ANSWER -> IKJPARS "answer place"
IKJRLSA (1) Release parsing storage
*
SR R0,R0 Set secondary RC=0
SR R15,R15 Set RC=0;
B XITPAR
*
XITPAR04 EQU *
SR R0,R0 Set secondary RC=0
LA R15,4 Set RC=4; no parameters entered
B XITPAR
*
XITPAR08 EQU *
SR R0,R0 Set secondary RC=0
LA R15,8 Set RC=8; invalid node.user combo
B XITPAR
*
XITPAR12 EQU *
LA R15,12 Set RC=12; R0 already set by IKJPARS
B XITPAR
*
XITPAR EQU *
L R13,4(,R13) -> prev s.a.
L R14,12(,R13) Load r14
LM R1,R12,24(R13) Reload callers regs
BR R14 Return with RCs in R0/R15
*
LTORG
*
*-- IKJPARS Description Macros
*
*-- TRANSMIT command parms:
*
* TRANSMIT node.userid DATASET(ddd) OUTDATASET(ooo) VOLSER(vvvvv)
* PDS | SEQUENTIAL
* QUIET
*
* Where:
*
* node.user is the node and userid destination for the file.
* ddd is the dataset(+member) to be transmitted.
* ooo is the optional output dataset to write the NETDATA encoded
* transmission into in lieu of actually sending it.
* vvv is an optional VOLSER of where to allocate the OUTDATASET.
*
*
PCLDEFS IKJPARM DSECT=PRDSECT
*
*
QTPCE IKJKEYWD
IKJNAME QUIET PCE value = 1
*
PDSPCE IKJKEYWD DEFAULT='SEQUENTIAL'
IKJNAME SEQUENTIAL PCE value = 1
IKJNAME PDS PCE value = 2
*
OTDSPCE IKJKEYWD
IKJNAME 'OUTDATASET',SUBFLD=OTDSFLD,ALIAS='OUTDSNAME'
*
FDSPCE IKJKEYWD
IKJNAME 'DATASET',SUBFLD=FDSFLD,ALIAS='DSNAME'
*
VSRPCE IKJKEYWD
IKJNAME 'VOLSER',SUBFLD=VOLSFLD,ALIAS='VOLUME'
*
USRPCE IKJKEYWD , v200
IKJNAME 'UNIT',SUBFLD=UNISFLD,ALIAS=('U') v200
*
OTDSFLD IKJSUBF
OTDAPCE IKJPOSIT DSNAME, x
PROMPT='THE NAME OF THE DATA SET YOU WANT TO CONTAIN THEx
ENCODED FILE'
*
FDSFLD IKJSUBF
FDAPCE IKJPOSIT DSNAME, x
PROMPT='THE NAME OF THE DATA SET YOU WANT TO TRANSMIT'
*
VOLSFLD IKJSUBF
VOLPCE IKJPOSIT DSTHING,VOLSER, x
PROMPT='THE VOLUME SERIAL OF THE VOLUME WHERE YOU WANT Tx
HE OUTDATASET ALLOCATED'
*
UNISFLD IKJSUBF , v200
UNIPCE IKJIDENT 'UNIT NAME',MAXLNTH=8,FIRST=ALPHANUM, v200x
OTHER=ALPHANUM v200
*
IKJENDP
*
*
*
IKJPPL
IKJPPLSZ EQU (*-PPL)/4 # words in PPL
*
LTORG
*
* *
***********************************************************************
** **
** TASK ESTAE EXIT **
** **
** This csect handles all abends trapped by ESTAE during the normal **
** execution of the subtask. This exit does not attempt **
** any recovery other than to terminate processing. **
** An SVC dump is taken on abends. **
** **
** On entry: R0=ESTAE provide entry code **
** R1=SDWA address **
** R2=parameter passed on ESTAE macro **
** **
** **
** On exit: If SDWACLUP is 1, then no retry is allowed and this **
** exit will allow percolation back to system routines **
** to terminate the task. **
** **
** If SDWACLUP is 0, then retry is allowed. **
** **
** Security: N/A. **
** **
** Register usage: **
** **
** R1 = SDWA address **
** R3 = SDWA address **
** R10 = Dynamic storage area base **
** R12 = This program base **
** **
** **
** **
***********************************************************************
*
NJEDMP CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDMP'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
LR R12,R15 SET UP BASE REG
USING NJEDMP,R12 ESTABLISH ADDRESSABILITY
LR R8,R14 SAVE RETURN ADDRESS TO SYSTEM
*
L R10,0(,R1) GET VALUE PASSED TO US (WORKA)
USING NJEWK,R10
L R11,=A(NJECOM) -> common csect
USING NJECOM,R11
*
LR R3,R1 SAVE R1 ENTRY CONTENTS
USING SDWA,R3
LR R5,R0 Save R0 entry code
*
LTR R3,R3 Do we have an SDWA?
BZ NOSDWA Exit if no SDWA
LA R13,MVSSAVE Save area
ESTAE 0
*
MODESET MODE=SUP, Run this ESTAI exit privileged x
KEY=ZERO to access PSW -> storage
*
MVC MACLIST(WTOMSGL),WTOMSG
L R6,PSATOLD-PSA(0) -> my TCB
L R5,TCBTIO-TCB(,R6) -> TIOT
MVC MACLIST+9(8),0(R5) Plug in job name
MVC MACLIST+4(4),=C'USER'
MVC MACLIST+19(8),=C'TRANSMIT' Plug in command name
*
*
LNK020 EQU *
MVC MACLIST+29(5),=C'ABEND'
L R5,SDWAABCC GET ABEND CODE INFO WORD
N R5,=X'00FFF000' KEEP ONLY THE SYSTEM CODE
BZ USERCDE NONE THERE, MUST BE A USER CODE
SRL R5,12 Put sys code in low order v201
C R5,=X'00000222' Operator cancel, no dump? v201
BE SDUMP040 Yes, suppress dump
CLM R5,1,=X'3E' Was it an x3E (DETACH) ? v201
BE SDUMP040 Yes, suppress dump v201
C R5,=X'00000013' Open 013 abend? v201
BNE ACCPT no, do the dump v200
CLC SDWAGR15,=X'00000018' Was it 013-18? v200
BE SDUMP060 Yes, suppress dump v200
*
ACCPT EQU * v200
MVI MACLIST+35,C'S' INDICATE SYSTEM CODE
UNPK FWORK(5),SDWACMPC(3) GET SYSTEM CMP CODE
TR FWORK(3),HEXTRAN-240
MVC FWORK+3(5),=CL5' ' CLEAR REST OF ABEND CODE
B NOREAS
*
USERCDE EQU *
MVI MACLIST+35,C'U' INDICATE USER ABEND CODE
L R5,SDWAABCC GET ABEND CODE
N R5,=X'00000FFF' KEEP USER ABEND CODE
CVD R5,FSAVE CONVERT CODE TO DECIMAL
UNPK FWORK(4),FSAVE UNPK THE CODE
OI FWORK+3,X'F0' FIX SIGN
MVC FWORK+4(2),=CL2' ' BLANKS AT END OF ABEND CODE
*
NOREAS EQU *
MVC MACLIST+36(6),FWORK MOVE ABEND-REASON TO LINE
MVC ABCODE,MACLIST+36 Save a copy of formatted abcode
*
WTO ,MF=(E,MACLIST) Write to console
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(3),=C'PSW'
UNPK FSAVE(9),SDWAEC1(5) Add zones to PSW word 1
TR FSAVE(8),HEXTRAN-240
MVC MACLIST+10(8),FSAVE
UNPK FSAVE(9),SDWAEC1+4(5) Add zones to PSW word 2
TR FSAVE(8),HEXTRAN-240
MVC MACLIST+19(8),FSAVE
*
SR R5,R5 CLEAR FOR IC
IC R5,SDWAILC1 GET THE ILC
CVD R5,FWORK MAKE DECIMAL
MVC MACLIST+29(3),=C'ILC'
UNPK MACLIST+33(2),FWORK UNPK
OI MACLIST+34,X'F0' FIX THE SIGN
*
MVC MACLIST+37(4),=C'INTC'
UNPK FWORK(5),SDWAINC1(3) MAKE INTC DISPLAYABLE
TR FWORK(4),HEXTRAN-240
MVC MACLIST+42(4),FWORK MOVE INTC TO LINE
*
WTO ,MF=(E,MACLIST)
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(13),=C'DATA NEAR PSW'
MVC MACLIST+19(8),=CL8'UNAVAIL' ASSUME WE CANT GET DATA
L R4,SDWAEC1+4 Get PSW IA
LA R4,0(,R4) Clear high bit
C R4,=F'8' 1st 8 bytes of storage?
BH LOC010 No, its higher than that
SR R4,R4 Yes, just use 0
B LOC020
*
LOC010 EQU *
S R4,=F'8' BACK UP BEFORE INTERRUPT ADDR
*
LOC020 EQU *
LRA R0,0(,R4) Do we have access?
BNZ UNAVAIL No translation, better not
LRA R0,14(,R4) Do we have access?
BNZ UNAVAIL No translation, better not
*
ST R4,FWORK SAVE FOR CONVERSION
UNPK FSAVE(9),FWORK(5) ADD ZONES TO ADDRESS
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+19(8),FSAVE MOVE DISPLAYABLE
*
MVC FWORK(4),0(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+29(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),4(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+38(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),8(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+47(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),12(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+56(8),FSAVE MOVE TO LINE
*
UNAVAIL EQU *
WTO ,MF=(E,MACLIST)
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
*----
LA R4,4 4 ROWS OF REGISTERS
LA R5,SDWAGR00 POINT TO ABEND REGS
LA R6,REGLIST POINT TO REGISTER ID LITERALS
*
REG000 EQU *
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(8),0(R6) MOVE REGISTERS ID
LA R15,MACLIST+13 WHERE 1ST REG GOES ON LINE
LA R14,4 4 REGS PER LINE
*
REG010 EQU *
UNPK FSAVE(9),0(5,R5) UNPK A REGISTER
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC 0(8,R15),FSAVE MOVE TO THE LINE
LA R15,10(,R15) NEXT SPOT ON PRINT LINE
LA R5,4(,R5) NEXT REGISTER
BCT R14,REG010 KEEP DOING REGS
WTO ,MF=(E,MACLIST)
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
LA R6,8(,R6) NEXT REGISTER ID
BCT R4,REG000 GO DISPLAY THE NEXT ROW
*
*
SDUMP000 EQU *
L R5,SDWAABCC Get abend code info word
N R5,=X'00FFF000' Keep only the system code
SRL R5,12 Right justify the code
C R5,=X'00000222' Operator cancel, no dump?
BE SDUMP040 Yes, skip dump
CLM R5,1,=X'37' x37 abend code?
BE SDUMP040 Skip the dump
*
MVI DHDR,C' '
MVC DHDR+1(29),DHDR
MVI DHDR,29 IBM length of header
L R5,PSATOLD-PSA(0) -> my TCB
L R5,TCBTIO-TCB(,R5) -> TIOT
MVC DHDR+1(8),0(R5) Use jobname in description
MVC DHDR+11(8),=C'TRANSMIT' Use command name
MVC DHDR+21(7),ABCODE
*
MVC MACLIST(SDUMPL),SDUMP MOVE SDUMP LIST TO WORK
LA R1,MACLIST
SDUMP HDRAD=DHDR, ISSUE SDUMP TO RECORD STATUS x
BUFFER=NO, x
QUIESCE=NO, x
SDATA=(RGN,CSA,LPA,SUM), x
MF=(E,(1))
*
*
SDUMP040 EQU *
LR R1,R3 SDWA BACK TO R1
L R15,=A(NJETRN) Main csect addr
ST R15,SDWASRSV+4*R12 Plug it to R12
L R15,=A(EXIT08) -> TRANSMIT exit point
B SDUMP090 v200
*
SDUMP060 EQU * ** Here for S013-18 abend only v200
LR R1,R3 SDWA BACK TO R1 v200
L R15,=A(NJETRN) Main csect addr v200
ST R15,SDWASRSV+4*R12 Plug it to R12 v200
L R15,=A(ERR015) -> TRANSMIT ERRMSG v200
*
SDUMP090 EQU *
SETRP RC=4, Retry - try to shut down TRANSMITx
DUMP=NO, Suppress any further dumps x
FRESDWA=YES, Free the SDWA x
RETREGS=YES, Restore original regs x
RETADDR=(15) Return to Transmit exit point
*
NOSDWA EQU * ** NO RETRY AVAILABLE (OR DESIRED)
SR R15,R15 REQUEST PERCOLATION
LR R14,R8 RESTORE RETURN ADDRESS
BR R14 RETURN TO SYSTEM
*
LTORG
*
SDUMP SDUMP MF=L
SDUMPL EQU *-SDUMP
*
REGLIST DC CL8'GR 0-3'
DC CL8'GR 4-7'
DC CL8'GR 8-11'
DC CL8'GR 12-15'
*
WTOMSG WTO ' x
',MF=L
WTOMSGL EQU *-WTOMSG
*
LTORG
*
*
**** Main work area common NJE00290
**** to all NJExxx CSECTs. NJE00290
* NJE00290
NJEWK DSECT
NJEEYE DS CL4'NJET' Eyecatcher
NJEWKLEN DS F Getmain size of this area
*
DBLE DS D Work area NJE00310
TWRK DS 2D Work area
LCLNODE DS CL8 Local node id
DEFUSER DS CL8 Default 'no security' userid
USERID DS CL8 TSO Userid
PREFIX DS CL8 TSO PREFIX
DESTNODE DS CL8 Destination node
DESTUSER DS CL8 Destination userid
SPLDSN DS CL44 NETSPOOL dataset name
*
*
MACLIST DS CL96 Macro expansion area
STAXLIST DS CL20 STAX parameter list
* NET02360
CPARMS DS A -> input CPPL (entry parms)
PUTECB DS F ECB for PUTLINE
IOPLAREA DS 4A IOPL for PUTLINE
SV14PUT DS A R14 save area
SV14LN DS A R14 save area NET02370
SV14PB DS A R14 save area NET02370
SV14SI DS A R14 save area NET02370
*
PBREM DS F # bytes remaining in phys rec
PBPOS DS A -> current position in BUFF
PBRPS DS A -> current position in phys rec
OUTRECS DS F Count of output records written
*
BLOCKLEN DS F Length of block buffer
BLOCK DS A -> Block of physical records
*
DEVINFO DS 0XL20 5 WORDS OF DEVTYPE INFO
DEVUCBTY DS F DEV TYPE: VALUE OF UCBTYP FIELD
DEVMAXBK DS F MAXIMUM BLKSIZE ON DEVICE
DEVCYLS DS XL2 NUMBER OF CYLINDERS ON DEVICE
DEVTRKS DS XL2 NUMBER OF HEADS ON DEVICE
DEVNUSED DS 0XL8 2 WORDS NOT USED HERE
*
OLD DS F For PUTGET, # segments
OLDMSGAD DS A -> msg len/text
*
PARSECB DS F IKJPARS ECB
ANSWER DS F IKJPARS Answer area
PPLSTG DS (IKJPPLSZ)A Space for PPL
OUTVOL DS CL6 User specified output volser
OUTPUTDS DS CL44 User specified OUTDATASET DSN
OUTMEM DS CL8 User specified OUTDATASET member
OUTUNIT DS CL8 User specified UNIT name v200
INPUTDS DS CL44 Input dataset name
INMEM DS CL8 User specified input member
*
*
FLAGS1 DS X Flag bits
F1INPDS EQU X'80' 1... .... Input dataset is a PDS, 0=SEQL
F1ATTN EQU X'40' .1.. .... User pressed ATTN key v201
F1BATCH EQU X'08' .... 1... Running in BATCH TSO
F1ACEE EQU X'04' .... .1.. Security is available on system
F1AUSR EQU X'02' .... ..1. Special user
F1APF EQU X'01' .... ...1 Authorized at invocation
* ..xx .... available bits
*
FLAGS2 DS X Flag bits
F2INOPN EQU X'80' 1... .... INDS DCB open
F2NCBOPN EQU X'40' .1.. .... NETSPOOL NCB open
F2OUTOPN EQU X'20' ..1. .... OUTDS DCB open
F2NJE38 EQU X'10' ...1 .... NJE38 is active (LCLNODE valid)
F2SYSOPN EQU X'08' .... 1... SYSINDS DCB open
F2EXIST EQU X'04' .... .1.. OUTDATASET previously existed
F2UNIT EQU X'02' .... ..1. UNIT specified v200
* .... ...x available bits
*
FLAGS3 DS X Flag bits from CMD line parse
F3DEST EQU X'80' 1... .... Valid node.user destination spec
F3PDS EQU X'40' .1.. .... 1=PDS,0=SEQL specified
F3VOLSER EQU X'20' ..1. .... VOLSER specified
F3OUTDS EQU X'10' ...1 .... OUTDATASET specified
F3OUTMEM EQU X'08' .... 1... OUTDATASET MEMBER specified
F3INDS EQU X'04' .... .1.. DATASET specified
F3INMEM EQU X'02' .... ..1. DATASET member specified
F3QUIET EQU X'01' .... ...1 1=QUIET suppress info msgs
*
FLAGS4 DS X Flag bits
* xxxx xxxx available bits
* NET02470
DS 0F
INMF01 DS (INMFSZ)X Fields for INMR01 record
INMF02A DS (INMFSZ)X Fields for 1st INMR02 record
INMF02B DS (INMFSZ)X Fields for 2nd INMR02 record
INMF03 DS (INMFSZ)X Fields for INMR03 record
* NET02590
DS 0F
CAMWORK DS 0XL140 CAMLST work area
BUFF DS CL256 GB buffer containing request data NET02600
LIST DS CL80 Print line
REC DS CL133 Physical record from spool
*
*----
LS99PTR DS A PTR TO S99RB
LS99RB DS XL20 SPACE FOR S99RB
*
TXTPTRS DS 15A -> Text unit ptr list
*
DS 0H
UTXT DS 0XL06,Y,AL2,AL2 DDNAME Unallocation
UDDNAME DS CL8 DDNAME
*
DS 0H
TXT01 DS 0XL06,Y,AL2,AL2 Return DDNAME
TDDNAME DS CL8 DDNAME
*
DS 0H
TXT02 DS 0XL06,Y,AL2,AL2 DSN=
TDSNAME DS CL44 DSNAME
*
DS 0H
TXT03 DS 0XL07,Y,AL2,AL2,X DISP=(NEW,
*
DS 0H
TXT04 DS 0XL07,Y,AL2,AL2,X DISP=(,CATLG)
*
DS 0H
TXT05 DS 0XL06,Y,AL2,AL2 SPACE BLOCK LEN
TBLKLEN DS XL3 BLKLEN
*
DS 0H
TXT06 DS 0XL06,Y,AL2,AL2 SPACE PRIMARY
TPRIME DS XL3 Primary
*
DS 0H
TXT07 DS 0XL06,Y,AL2,AL2 SPACE SECONDARY
TSECND DS XL3 Secondary
*
DS 0H
TXT08 DS 0XL06,Y,AL2,AL2 SPACE DIRECTORY BLOCKS
TDIRBLKS DS XL3 DIR BLKS
*
DS 0H
TXT09 DS 0XL06,Y,AL2,AL2 VOLUME
TVOLSER DS CL6 VOLSER
*
DS 0H
TXT10 DS 0XL14,Y,AL2,AL2 UNIT v200
TUNIT DS CL8 UNITNAME v200
*
DS 0H
TXT11 DS 0XL06,Y,AL2,AL2 EXPDT
TEXPDT DS CL5 EXPDT=yyddd
*
DS 0H
TXT12 DS 0XL06,Y,AL2,AL2 BLKSIZE
TBLKSIZE DS XL2 BLKSIZE
*
DS 0H
TXT13 DS 0XL06,Y,AL2,AL2 DSORG
TDSORG DS XL2 DSORG
*
DS 0H
TXT14 DS 0XL06,Y,AL2,AL2 LRECL
TLRECL DS XL2 LRECL
*
DS 0H
TXT15 DS 0XL06,Y,AL2,AL2 RECFM
TRECFM DS XL1 RECFM
*
DS 0H
TXT16 DS 0XL04,Y,AL2 DUMMY
*
DS 0H
TXT17 DS 0XL04,Y,AL2 SYSOUT
*
DS 0H
TXT18 DS 0XL04,Y,AL2 TERM
*
DS 0H
TXT19 DS 0XL04,Y,AL2 CYLINDER
*
DS 0H
TXT20 DS 0XL04,Y,AL2 FREE=CLOSE
*
DS 0H
TXT21 DS 0XL06,Y,AL2,AL2 MEMBER
TMEMBER DS CL8
*---
*
CTL DS X Segment descriptor byte
*
*
DS 0F
TAGDATA DS XL108 TAG data area
TYPPRT EQU X'40' PRT dev
TYPPUN EQU X'80' PUN dev
*
NCB1 DS XL48 NCB for Spool Access
SYSINDS DS 0X SYSIN DCB for IEBCOPY ctl cards
INDS DS (DMYINDSL)X Input dataset DCB
OUTDS DS (DMYOUTDL)X OUTDATASET DCB
CAMLST DS (DMYLSTL)X Space to hold a CAMLST
*
CPYPLIST DS XL(COPYPRML) IEBCOPY PARM FIELD
*
DS 0H
DDLISTL DS AL2(DDLISTSZ) DDNAME LIST LENGTH
DDLIST DS 4XL8'00' FOUR DDNAMES UNDEFINED
DDSYSIN DS CL8 DDNAME representing IEBCOPY's SYSIN
DDSYSPR DS CL8 DDNAME representing IEBCOPY's SYSPRINT
DS XL8'00' UNDEFINED DD
DDSYSUT1 DS CL8 DDNAME of the dataset to be transmitted (SYSUT1)
DDSYSUT2 DS CL8 DDNAME representing IEBCOPY's SYSUT2
DS XL8'00' SYSUT3 unused
DDSYSUT4 DS CL8 DDNAME representing IEBCOPY's SYSUT4
DDLISTSZ EQU *-DDLIST LENGTH OF DDLIST for IEBCOPY
DDOUTDS DS XL8'00' OUTDATASET DDNAME
DDNETSPL DS XL8'00' NETSPOOL DDNAME
UNLISTSZ EQU *-DDLIST TOTAL of all DDs in list
*
*-- ESTAE exit used areas
*
FSAVE DS 2D
FWORK DS D
DHDR DS CL30
ABCODE DS CL7
MVSSAVE DS 18F ESTAE exit OS save
*-- End of ESTAE area
*
*
NJESA DS 18F NJERCV OS save area NJE00300
DYNSA DS 18F NJEDYN OS save area NJE00300
NETSA DS 18F NJENET OS save area NJE00300
PARSA DS 18F NJEPAR OS save area NJE00300
*
DS 0D Force doubleword size
NJEWKSZ EQU *-NJEWK
* NJE00930
*
*-- System DSECTs
*
CVT DSECT=YES,PREFIX=NO
IEFZB4D0
IEFZB4D2
DCBD DSORG=PS,DEVD=DA
*
IEFUCBOB DSECT
IEFUCBOB LIST=YES
IHAPSA
IEESMCA
IKJTCB
IHASDWA
IEFTIOT DSECT
IEFTIOT1
IHAASCB
IHAASXB
IKJUPT
IKJCPPL
IKJPGPB
IKJIOPL
DSCBF1 DSECT
IECSDSL1 (1)
*
VOLLIST DSECT Volume list returned by LOCATE
VOLCOUNT DS H Volume count
VOLDEV DS CL4 UCB dev type
VOLSER DS CL6 Volser
VOLSTAT DS H Status bytes
*
ACEE DSECT Maps a portion of ACEE in MVS3.8
ACEEEYE DS CL4'ACEE'
DS 16X
ACEEUSRL DS X Length of userid
ACEEUSR DS CL8 Userid
*
COPY NETSPOOL NJE00940
COPY TAG
*
*-- NJE38 DSECTs
*
NJEWRE v220
*
END NJETRN NJE01000
./ ADD NAME=NJERCV
*
*-- NJE38 - TSO RECEIVE
*
* Command line format (all parameters are optional):
*
* RECEIVE filenum
* DATASET( )
* VOLSER( )
* UNIT( )
* DIR( )
* INDATASET( )
* PURGE | NOPURGE
* PROMPT | NOPROMPT
* QUIET
*
* where:
*
* filenum - specifies a specific NJE38 spool file number
* to be received. If not specified, the next
* available spool file is received. Ignored if
* INDATASET is specified.
*
* DATASET( ) - specifies the dsname of the dataset to be
* created; the received data will be placed within.
* If not specified, the dataset name will be
* derived from the incoming dataset name, with
* the first qualifer being replaced by the
* receiver's TSO userid.
*
* VOLSER( ) - specifies a volume where DATASET should be
* created. If not specified, a PUBLIC volume will
* be chosen based on the receiving dataset's
* attributes.
*
* UNIT( ) - specifies a unit name where DATASET should be
* created. If not specified, SYSDA is the default
* unit name.
*
* DIR( ) - specifies a number of directory blocks if
* incoming file was a PDSE.
*
* INDATASET( ) - optional. Specifies that the encoded named
* dataset is to be received. The encoded dataset
* was previously created by TRANSMIT using
* OUTDATASET. May optionally specify a membername.
*
* PURGE - DEFAULT. Indicates that RECEIVE is to purge
* the spool file after successful retrieval. Has
* no meaning if INDATASET is specified.
*
* NOPURGE - Indicates that RECEIVE is to retain the spool
* file. The file can be received again or must be
* removed from the spool by other means. Has
* no meaning if INDATASET is specified.
*
* PROMPT - DEFAULT. Indicates that RECEIVE is to prompt
* the TSO user to respecify DATASET or VOLSER
* after learning the incoming dataset name. The
* user can then choose to change the name or
* volume.
*
* NOPROMPT - Indicates that no prompts are to be issued. If
* errors are encountered, such as the incoming
* dataset name already existing, then RECEIVE is
* terminated without any opportunity to change
* the parameters.
*
* QUIET - If specified, indicates that all informational
* messages from RECEIVE are suppressed. Error
* messages will always be displayed. QUIET also
* forces on NOPROMPT.
*
*
* Change log:
*
*
* 21 Oct 21 - Temp dataset on IEBCOPY type receive not using vol v230
* identified by GETVOL (instead uses hi-cuu PUBLIC) v230
* 22 Jul 21 - Typo could cause alloc error with user coded volume v230
* 24 Apr 21 - Use TSO userid as default user if no security and v222
* NJE38 is not active. v222
* 15 Feb 21 - Not picking up jobname when run as an STC. v221
* 01 Oct 20 - Put ENQ existence check in common module v210
* 09 Aug 20 - Improve TSO attention key handling v201
* 13 Jul 20 - Flat file with JCL sneaks by NETDATA checks, causing v200
* loss of first record in result. v200
* 12 Jul 20 - Add support for DIR( ) command line parameter v200
* 10 Jul 20 - Add support for UNIT( ) command line parameter v200
* 08 Jul 20 - IEBCOPY failures if netdata records shorter than 80 v200
* 15 May 20 - Initial creation
*
*
GBLC &VERS
REGEQU
NJERCV CSECT NJE00020
NJEVER
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJERCV,R12 NJE00070
LR R8,R1 Copy input parm addr
*
GETMAIN RU, Get local stg area X
LV=4096, X
BNDRY=PAGE
LR R10,R1
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the page
*
USING NJEWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC NJEEYE,=CL4'NJER' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
L R11,=A(NJECOM) -> common csect
USING NJECOM,R11
ST R8,CPARMS Save ptr to input parms
MVC OLD,=F'1' Set number of PUTGET segments
OI FLAGS3,F3PURGE Set default: PURGE
*
INIT000 EQU *
MVC MACLIST(ESTAEL),ESTAE Move ESTAE parm list
L R6,=A(NJEDMP) Point to local ESTAE rtn
ESTAE (R6), Issue ESTAE X
CT, X
TERM=YES, X
PARAM=(R10), PARAM is work area address X
MF=(E,MACLIST)
*
*-- Establish TSO userid issuing this command
*
TESTAUTH FCTN=1 Are we authorized on entry?
LTR R15,R15 Check result
BNZ INIT010 Branch if not authorized
OI FLAGS1,F1APF Indicate authorized on entry
*
INIT010 EQU *
L R2,PSATOLD-PSA(0) -> my TCB
L R2,TCBTIO-TCB(R2) -> my TIOT
LA R4,TIOCNJOB-IEFTIOT(R2) -> TIOT jobname v221
LR R3,R4 Assume will use jobname v222
*
L R2,PSAAOLD-PSA(0) -> my ASCB
L R6,ASCBTSB-ASCB(,R2) -> TSB (or 0)
L R2,ASCBASXB-ASCB(,R2) -> my ASXB
ICM R2,15,ASXBSENV-ASXB(R2) -> my ACEE
BZ INIT015 Exit if no ACEE
*
USING ACEE,R2
CLI ACEEUSRL,X'00' No userid available?
BE INIT015 Exit if unavail
CLI ACEEUSR,X'00' Userid not formed correctly?
BE INIT015 Exit if unavail
LA R3,ACEEUSR -> Userid
OI FLAGS1,F1ACEE Valid ACEE found
CLC ACEEUSR,=CL8'STC' Is this a started task? v221
BNE INIT015 No, use ACEEUSR id v221
LR R3,R4 Make the TIOT jobname the idv221
DROP R2 ACEE
*
INIT015 EQU *
MVC USERID,0(R3) Set the userid
TM FLAGS1,F1APF Authorized at entry?
BO INIT040 yes.
CLC USERID,=CL8'HERC01' Special access id?
BE INIT020 Yes
CLC USERID,=CL8'HERC02' Special access id?
BNE INIT030 No
*
INIT020 EQU *
OI FLAGS1,F1AUSR Indicate special authorized user
SR 0,0 Use authorization SVC
LA 1,1 For TK4- HERC01/HERC02 only
SVC 244 Get authorized
B INIT040
*
INIT030 EQU *
TM FLAGS1,F1APF Authorized at entry?
BZ ERR006 No, issue error
*
INIT040 EQU *
LA R6,0(,R6) Clear high order byte
LTR R6,R6 Was there a TSB address
BNZ INIT045 There was. Running in TSO userid
OI FLAGS1,F1BATCH Indicate batch TSO
TM FLAGS1,F1ACEE Valid ACEE found?
BO INIT045 Yes, go with ACEE userid
BAL R2,CHK000 See if NJE38 is active v210
BNZ INIT045 NJE38 not active; use jobnamv222
MVC USERID,DEFUSER Use default userid
*
INIT045 EQU *
L R2,4(,R8) -> UPT from input parms
USING UPT,R2
MVC PREFIX,BLANKS Init receiving field
SR R1,R1 Clear for IC
ICM R1,1,UPTPREFL Get prefix length
BZ INIT050 No prefix value in use
BCT R1,*+10 Adjust for execute
MVC PREFIX(0),UPTPREFX executed instr
EX R1,*-6 Copy the prefix value
DROP R2 UPT
*
INIT050 EQU *
MVC STAXLIST(STAXL),STAX Move STAX parm list
LA R5,LIST -> input buffer from attn
LA R6,STAXXIT Point to local exit
STAX (R6), Set exit for attention X
OBUF=(ATTNMSG,L'ATTNMSG), x
IBUF=((5),80), x
USADDR=(10), Parameter is our work area x
MF=(E,MACLIST)
*
*-- Parse command line
*
SR R0,R0 Code 0: parse command line
L R15,=A(NJEPAR) -> parse routine
BALR R14,R15
*
TM FLAGS4,F4ATTN Was ATTN pressed? v201
BO EXIT08 Y, immediate exit v201
LTR R15,R15 Any errors?
BNZ ERR001 Display IJKPARS RC
*
*-- Issue hello msgs
*
INIT060 EQU *
LA R2,MSG000 Issue hello msg
BAL R14,PUTLINE
LA R2,MSGBLNK Issue blank line
BAL R14,PUTLINE
*
*-- Are we reading from the NJE38 spool or an INDATASET?
*
TM FLAGS3,F3INDS INDATASET specified?
BZ OPN000 No, use NETSPOOL
*
*-- Set up INDATASET
*
INIT080 EQU *
MVC TDSNAME,USRINDS Set DSNAME of INDATASET
*
LA R0,DYNINDS 24 allocate INDATASET
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15 Any errors?
BNZ EXIT08 Exit if allocation error
*
MVC NETDATA(DMYNPOL),DMYNPO Set up DCB for PDS
CLI TDSORG,X'02' Was DSORG=PO ?
BE *+10 Yes
MVC NETDATA(DMYNPSL),DMYNPS Set up DCB for SEQL
*
MVC DDNETDAT,TDDNAME Save off the DDNAME returned
MVC DECB(READL),READ Set up DECB
LA R6,NETDATA -> DCB
USING IHADCB,R6
MVC DCBDDNAM,DDNETDAT Set DCB DDNAME
*
MVC MACLIST(OPENL),OPEN Move OPEN list
OPEN (NETDATA,INPUT), Open the NETDATA dataset X
MF=(E,MACLIST)
OI FLAGS2,F2NETOPN Indicate DCB is open
*
CLC DCBLRECL,=Y(80) Is LRECL 80?
BNE ERR009 No, cant be netdata file
TM DCBRECFM,DCBRECF Fixed length records?
BZ ERR009 No, cant be netdata file
*
LH R0,DCBBLKSI Get physical blksize
ST R0,BLOCKLEN Save it
GETMAIN RU,LV=(0) Get buffer to read blocks
ST R1,BLOCK Save buffer addr
DROP R6
*
CLI TDSORG,X'40' Was DSORG=PS ?
BE INIT100 Yes, don't do the FIND
*
FIND NETDATA,USRMEM,D Point to the member
LTR R15,R15 Any errors?
BNZ ERR004 Exit if member not found
*
*-- Process the initial NETDATA control records from INDATASET
*
INIT100 EQU *
SR R0,R0 Code 0, process initial NETDATA
L R15,=A(NJENET) -> NETDATA parsing routines
BALR R14,R15 Process the control records
*
B INIT110(R15) Branch based on error
INIT110 B USR000 00 Normal, proceed.
B ERR008 04 File is not NETDATA
B EXIT08 08 Invalid NETDATA encountered
B ERR005 0C Unexpected EOF on INDATASET
B ERR007 10 READ i/o error on INDATASET
B ERR030 14 INMTEXT detected, not supported
B ERR038 18 Record segments exceed LRECLv222
*
*-- Open NETSPOOL
*
OPN000 EQU *
BAL R2,CHK000 Get NJE38 Spool DSN v210
BNZ ERR013 NJE38 is not active v210
*
MVC DDNETSPL,=CL8'NETSPOOL' Set NETSPOOL DDN (for unalloc)
MVC TDDNAME,DDNETSPL NETSPOOL DD
LA R0,DYNETSPL 28 allocate NETSPOOL
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
*
LA R8,NCB1 -> NCB
USING NCB,R8
*
LA R6,TAGDATA -> area to hold tag data
USING TAG,R6
*
NSIO TYPE=OPEN, x
NCB=(R8), x
TAG=(R6), -> Where tag data will be x
EODAD=EOD000
C R15,=F'4' NETSPOOL needs verify?
BE ERR025 Yes
BL OPN010 Everything is good
BAL R14,FMT000 Display Open error
CLC NCBRTNCD(2),=AL1(8,152) X'0898' security denied access?
BE ERR032 Yes, special msg
B EXIT08 Exit on VSAM error
*
OPN010 EQU *
OI FLAGS2,F2NCBOPN Indicate NETSPOOL is open
TM FLAGS3,F3FILEID Specific file # specified?
BO OPN020 Yes
*
*-- Here for 'next' available spool file
*
NSIO TYPE=CONTENTS, Get list of files x
NCB=(R8)
LTR R15,R15 Any errors?
BZ OPN030 No
CLC NCBRTNCD(2),=AL1(12,6) No files in directory?
BE ERR010 Close up and indicate no files
BAL R14,FMT000 Display error
B EXIT08 Exit on VSAM error
*
*-- Here for 'specific' spool file number
*
OPN020 EQU *
MVC TAGID,FILEID+2 Set file # to find
*
NSIO TYPE=FIND, get directory entry x
NCB=(R8), x
TAG=(R6) Where to place tag data
LTR R15,R15 Any errors?
BZ OPN200 No, process file
CLC NCBRTNCD(2),=AL1(12,4) Was file id not found?
BE ERR011 Yes
BAL R14,FMT000 Otherwise, display error
B EXIT08 Exit on VSAM error
*
*-- Look for next available in contents directory
*
OPN030 EQU *
L R2,NCBAREA Get a list of spool content
USING NSDIR,R2
SR R5,R5
ICM R5,3,NCBRECCT # of returned entries
SR R6,R6 Indicate nothing found yet
*
OPN040 EQU *
CLC LCLNODE,NSTOLOC Is this file for this link?
BNE OPN160 no, skip this file
TM FLAGS1,F1ACEE Was security available?
BZ OPN150 No; do not enforce selection
CLC USERID,NSTOVM Is this file for this userid?
BNE OPN160 no, skip this file
*
OPN150 EQU *
LA R6,TAGDATA -> tag data area for file
USING TAG,R6
XC TAGDATA(TAGLEN),TAGDATA
MVC TAGINLOC(TAGUSELN),NSINLOC Copy tag datq
B OPN170 Go process the file
*
OPN160 EQU *
LA R2,NSDIRLN(,R2) Next NETSPOOL dir entry
BCT R5,OPN040 Continue thru the contents
DROP R2 NSDIR
*
*
OPN170 EQU *
LM R0,R1,NCBAREAL Get list length and address
XC NCBAREA,NCBAREA Clear obsolete ptr
FREEMAIN RU,LV=(0),A=(1)
*
LTR R6,R6 Did we obtain tag data?
BZ ERR010 No, no files available
B OPN300
*
*-- validate specific file owner
*
OPN200 EQU *
CLC LCLNODE,TAGTOLOC Is this file for this link?
BNE ERR016 no, skip this file
TM FLAGS1,F1ACEE Was security available?
BZ OPN300 No; do not enforce selection
CLC USERID,TAGTOVM Is file for this userid?
BNE ERR016 no, skip this file
DROP R6 TAG
DROP R8 NCB
*
*-- Process the initial NETDATA control records from NETSPOOL
*
OPN300 EQU *
SR R0,R0 Code 0, process initial NETDATA
L R15,=A(NJENET) -> NETDATA parsing routines
BALR R14,R15 Process the control records
*
B OPN310(R15) Branch based on error
OPN310 B USR000 00 Normal, proceed.
B OPN400 04 File is not NETDATA
B EXIT08 08 Invalid NETDATA encountered
B ERR005 0C Unexpected EOF on NETSPOOL
B ERR007 10 READ i/o error on NETSPOOL
B ERR030 14 INMTEXT detected, not supported
B ERR038 18 Record segments exceed LRECLv222
*
OPN400 EQU *
OI FLAGS2,F2FLAT Indicate file is a flat file
*
*-- Notify user of dataset and prompt for changes
*
*-- This routine will:
* 1. Obtain or make the dataset name that came from the Tag/NETDATA
* 2. Tell user that name and prompt for changes
* 3. Parse the changes
*
USR000 EQU *
LA R7,INMF02A -> 1st INMR02 record v200
USING INMFIELD,R7 v200
NC DSTYPE(2),DSTYPE Was a DSTYPE key detected? v200
BZ USR020 No, we're good v200
CLI DSTYPE+2,X'40' PDSE program library? v200
BE ERR035 Can't support it v200
DROP R7 INMFIELD v200
*
USR020 EQU * v200
MVI FLAGS4,X'00' Reinit parse results flags
L R15,=A(NJENOT) -> Notify user and parse rtn
BALR R14,R15
*
LR R1,R15 RC to R1
LR R15,R0 Any secondary RC to R15
B USR080(R1) Branch based on error in R1
USR080 B USR100 00 Normal, proceed.
B RCV920 04 User specified "END"
B RCV910 08 User specified "PURGE"
B ERR001 0C IKJPARS err, RC in R15
B ERR026 10 PUTGET errr, RC in R15
*
*-- Did user enter a dataset name -and- member name on the prompt?
*-- If so, warn him that we are ignoring the member name.
*
USR100 EQU *
TM FLAGS4,F4MEMINV Was a member name specified?
BZ USR110 No
*
LA R2,MSG021 msg: member name ignored
BAL R14,PUTLINE Inform user
*
USR110 EQU *
TM FLAGS2,F2FLAT Flat non-NETDATA type file?
BZ RCV000 No, process NETDATA
*
*-- Prepare attributes for a flat file
*
FLT000 EQU *
LA R7,INMF02A -> 1st INMR02 record
USING INMFIELD,R7
MVC TDSNAME,FINALDS Set up DSNAME to build
MVI DSNAME+1,44 Set DSNAME length for dynalloc
MVC DSORG+2(2),=X'4000' Set DSORG=PS
MVC BLKSIZE+6(4),=F'0' Set BLKSIZE to 0 to be computed
MVI RECFM+2,DCBRECF+DCBRECBR Indicate RECFM=FB
LA R6,TAGDATA -> TAG data
USING TAG,R6
LA R1,80 Assume punch data length
TM TAGINDEV,TYPPUN Is this punch data?
BO FLT010 Yes
LA R1,133 Assign print data length
OI RECFM+2,DCBRECCA Use ASA ctl char
*
FLT010 EQU *
STCM R1,15,LRECL+6 Set LRECL
SR R0,R0 Clear for multiply
M R0,TAGRECNM Compute size of file
ST R1,FILESIZE+6 Set size in bytes for space calc
DROP R6,R7 TAG,INMFIELD
*
*-- Prepare to receive the data
*
RCV000 EQU *
LA R7,INMF02A -> 1st INMR02 record
USING INMFIELD,R7 v222
ICM R0,15,BLKSIZE+6 Get blocksize to use in srchv222
C R0,=F'32760' BLKSIZE > 32760 MVS limit? v222
BH ERR023 Exit if invalid blksize v222
CLC LRECL+6(4),=F'32760' LRECL > 32760 MVS limit? v222
BH ERR023 Exit if invalid LRECL v222
*
TM FLAGS1,F1INMR2B Was there a second INMR02?
BZ RCV030 No
LA R7,INMF02B -> 2nd INMR02 record
*
*-- Locate a suitable volume to hold the new dataset
*
RCV030 EQU *
MVC TVOLSER,USRVOL Assume user specified volser
TM FLAGS3,F3VOLSER Did user specify a volser?
BO RCV040 Yes, we'll use that
TM FLAGS4,F4VOLSER user specify a volser at prompt?
BO RCV040 Yes, we'll use that
TM FLAGS2,F2UNIT user specify a unit? v200
BO RCV040 Y, dont select a volume v200
*
* R0 must contain BLKSIZE or 0
BAL R14,GETVOL Find a volume for allocation
BZ ERR022 No volume found
*
*-- Start computing values and filling dynamic allocation text units
*
RCV040 EQU *
LA R1,TVOLSER -> selected volser v200
BAL R14,FNDVOL Get track sz of selected volv200
BZ ERR036 Volume not online v200
LA R1,INMF02A -> 1st INMR02 record v200
L R1,BLKSIZE+6-INMFIELD(,R1) Get target DSN blksize v200
CR R1,R15 Will block fit on track? v200
BH ERR037 No; were done here v200
*
BAL R14,GETBSZ Obtain final sizes, format
STH R1,TBLKSIZE Set dynalloc block size
STCM R1,7,TBLKLEN Set dynalloc space blk len
STH R2,TLRECL Set dynalloc lrecl
STC R3,TRECFM Set dynalloc recfm
*
BAL R14,GETSPACE Compute space parameters
STCM R1,7,TPRIME Set primary space in blocks
STCM R2,7,TSECND Set secondary space in blocks
*
MVC TDSORG,DSORG+2 NETDATA DSORG to text unit
MVC TDSNAME,FINALDS Set DSNAME to allocate
*
*
*
*-- Call NJEDYN to allocate the dataset
*
LA R0,DYNINMCP 04 allocate dataset for SEQL file
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
*
B RCV060(R15) Branch on RC
RCV060 B RCV200 00 Normal, proceed
B USR000 04 Dataset exists, reprompt
B EXIT08 08 All other errors
*
*
*-- Open the dataset
*
RCV200 EQU *
MVC DDSYSUT1,TDDNAME Save off the DDNAME returned
MVC NEWDS(DMYSEQL),DMYSEQ Set up DCB
LA R6,NEWDS -> DCB
USING IHADCB,R6
MVC DCBBLKSI,TBLKSIZE Set block size
MVC DCBLRECL,TLRECL Set length
MVC DCBRECFM,TRECFM Set format
MVC DCBDDNAM,DDSYSUT1 Set Dynamic DD name
TM DCBRECFM,DCBRECU Using undefined records?
BNO RCV210 No
*
LH R0,DCBBLKSI Get dataset block size
GETMAIN RU,LV=(0) Get recd build buffer for RECFMU
STM R0,R1,NEWLEN Save length and addr
DROP R6 IHADCB
*
RCV210 EQU *
MVC MACLIST(OPENL),OPEN Move OPEN list
OPEN (NEWDS,OUTPUT), Open the NEWDS dataset X
MF=(E,MACLIST)
OI FLAGS2,F2NEWOPN Indicate DCB is open
*
LA R0,4 Code 4, process NETDATA
TM FLAGS2,F2FLAT Flat non-NETDATA type file?
BZ RCV220 No, proceed with NETDATA
LA R0,8 Code 8, process PRT/PUN file
*
RCV220 EQU *
L R15,=A(NJENET) -> data retreival routines
BALR R14,R15 Process the records
*
B RCV230(R15) Branch based on result RC
RCV230 B RCV240 00 Normal, proceed.
DC AL4(0) 04 Not used
B EXIT08 08 Invalid NETDATA encountered
B ERR005 0C Unexpected EOF on INDATASET
B ERR007 10 READ i/o error on INDATASET
B ERR030 14 INMTEXT detected, not supported
B ERR038 18 Record segments exceed LRECLv222
*
RCV240 EQU *
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (NEWDS), Close it X
MF=(E,MACLIST)
NI FLAGS2,255-F2NEWOPN Indicate file closed
*
TM FLAGS3,F3INDS INDATASET specified?
BZ RCV250 No, skip close
*
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (NETDATA), Close it X
MF=(E,MACLIST)
NI FLAGS2,255-F2NETOPN Indicate NETDATA file closed
*
*
*
*-- If two INMR02 control records were found, then we need to run
*-- IEBCOPY to load a PDS from the unloaded file just processed above.
*
RCV250 EQU *
TM FLAGS1,F1INMR2B Was there a second INMR02?
BZ RCV950 No. We're done
*
LA R7,INMF02A -> 1st INMR02 record
USING INMFIELD,R7
*
*-- Filling dynamic allocation text units for final dataset
*
ICM R1,15,BLKSIZE+6 Get the NETDATA blksize
STH R1,TBLKSIZE Set dynalloc block size
STCM R1,7,TBLKLEN Set dynalloc space blk len
MVC TLRECL,LRECL+8 Set dynalloc lrecl
MVC TRECFM,RECFM+2 Set dynalloc recfm
*
BAL R14,GETSPACE Compute space parameters
STCM R1,7,TPRIME Set primary space in blocks
STCM R2,7,TSECND Set secondary space in blocks
*
MVC TDIRBLKS,DIRBLKS+7 Set directory blocks required
TM FLAGS2,F2DIR Did user override with DIR? v200
BZ RCV255 No v200
MVC TDIRBLKS,USRDIR+1 Set directory blocks req'd v200
*
RCV255 EQU * v200
MVC TDSORG,DSORG+2 NETDATA DSORG to text unit
MVC TDSNAME,FINALDS Set DSNAME to allocate
*
*
*-- Call NJEDYN to allocate the final output dataset as "SYSUT2"
*
LA R0,DYNFINAL 10 allocate final dataset
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
*
B RCV260(R15) Branch on RC
RCV260 B RCV400 00 Normal, proceed
B RCV300 04 Dataset exists, reprompt
B EXIT08 08 All other errors
*
*-- Notify user of existing dataset and prompt for changes
*
*-- This routine will:
* 1. Obtain or make the dataset name that came from the Tag/NETDATA
* 2. Tell user that name and prompt for changes
* 3. Parse the changes
*
RCV300 EQU *
MVI FLAGS4,X'00' Reinit parse results flags
L R15,=A(NJENOT) -> Notify user and parse rtn
BALR R14,R15
*
LR R1,R15 RC to R1
LR R15,R0 Any secondary RC to R15
B RCV310(R1) Branch based on error in R1
RCV310 B RCV320 00 Normal, proceed.
B RCV920 04 User specified "END"
B RCV910 08 User specified "PURGE"
B ERR001 12 IKJPARS err, RC in R15
B ERR026 16 PUTGET errr, RC in R15
*
*-- Did user enter a dataset name -and- and member name on the prompt?
*-- If so, warn him that we are ignoring the member name.
*
RCV320 EQU *
TM FLAGS4,F4VOLSER Was a new volser specified?
BZ RCV330 No
MVC TVOLSER,USRVOL Grab new volser
*
RCV330 EQU *
TM FLAGS4,F4MEMINV Was a member name specified?
BZ RCV250 No, try to allocate again
*
LA R2,MSG021 msg: member name ignored
BAL R14,PUTLINE Inform user
B RCV250 Try to allocate again
*
*
*
*-- Prepare to launch IEBCOPY
*
RCV400 EQU *
MVC DDSYSUT2,TDDNAME Set replacement SYSUT2 DD
*
*-- Call NJEDYN to allocate the SYSIN dataset needed by IEBCOPY
*
LA R0,DYNSYSIN 08 allocate SYSIN for IEBCOPY
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
MVC DDSYSIN,TDDNAME Save generated DDNAME
*
*-- Call NJEDYN to allocate the SYSPRINT dataset needed by IEBCOPY
*
LA R0,DYNSYSPR 12 allocate SYSPRINT for IEBCOPY
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
MVC DDSYSPR,TDDNAME Save generated DDNAME
*
*-- Call NJEDYN to allocate the SYSUT3 dataset needed by IEBCOPY
*
LA R0,DYNSYSU3 14 allocate SYSUT3 temporary
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
LTR R15,R15
BNZ EXIT08 Exit with dynalloc error
MVC DDSYSUT3,TDDNAME Set replacement SYSUT3 DD
*
*-- Invoke IEBCOPY
*
MVC CPYPLIST,COPYPARM Move IEBCOPY parms to 24-bit stg
MVC DDLISTL,=AL2(DDLISTSZ) Set IEBCOPY DD list length
LA R2,CPYPLIST
LA R3,DDLISTL
MVC MACLIST(LINKL),LINK Move macro model
LINK EP=IEBCOPY, x
PARAM=((R2),(R3)), x
VL=1, x
MF=(E,MACLIST)
LTR R5,R15 Copy RC to R5
BZ RCV950 Exit on success
*
*-- RECEIVE ended because IEBCOPY failed
*
RCV900 EQU *
LA R2,MSGBLNK -> blank line msg
BAL R14,PUTLINE
*
MVC LIST(4+L'MSG018T),MSG018 IEBCOPY fail msg
CVD R5,DBLE Convert IEBCOPY RC
UNPK LIST+37(2),DBLE
OI LIST+38,X'F0' Fix sign
*
LA R2,LIST -> start of msg
BAL R14,PUTLINE Display failure
B EXIT08
*
*-- User chose PURGE on the action prompt; purge the spool file
*-- (if not using INDATASET) and then exit.
*
RCV910 EQU *
TM FLAGS3,F3INDS Was INDATASET specified?
BO RCV920 Y, exit with no action
BAL R14,PUR000 Purge spool file as requested
LA R2,MSGBLNK -> blank line msg
BAL R14,PUTLINE
LA R2,MSG029 -> ended with nothing recv'd
BAL R14,PUTLINE
B EXIT00 And we're done
*
*-- RECEIVE ended with no action taken
*
*-- Here if 'END' specified or attention received
*
RCV920 EQU *
LA R2,MSGBLNK -> blank line msg
BAL R14,PUTLINE
LA R2,MSG019 -> ended with no action
BAL R14,PUTLINE
TM FLAGS2,F2FEND Was END forced in BATCH mode?
BO EXIT08 Yes, force RC=8
B EXIT00
*
*-- RECEIVE ended successfully with dataset created and filled
*
*-- If the user at any time specified the PURGE option, remove
*-- the spool file that was received.
*
RCV950 EQU *
*
RCV990 EQU *
LA R2,MSGBLNK -> blank line msg
BAL R14,PUTLINE
MVC LIST,BLANKS
MVC LIST(4+L'MSG017T),MSG017 Success msg
LA R1,LIST+4+L'MSG017T -> next available byte
MVI 0(R1),C'''' Move apost
MVC 1(44,R1),FINALDS Move final DSN
TRT 1(45,R1),BLANK Look for end of DSN
MVI 0(R1),C'''' Move apost
LA R1,2(,R1) -> skip over apost + 1 blank
MVC 0(10,R1),=C'successful'
LA R1,10(,R1) -> skip to end
LA R2,LIST -> start of msg
SR R1,R2 Compute msg length
STH R1,LIST Set RDW
BAL R14,PUTLINE Display success
*
BAL R14,PUR000 Purge the spool file if needed
B EXIT00
*
*
*-- Return the BLKSIZE value from the NETDATA, and adjust the
*-- RECFM and LRECL based on the NETDATA-unique variable formats when
*-- applicable.
*
*-- General guidelines and manipulations by this routine:
*
*-- 1. If the NETDATA LRECL is zero, this is unusual but don't alter
*-- any other DCB parameters; this covers the RECFM=U case.
*
*-- 2. If the NETDATA RECFM specifies the variable spanned records,
*-- leave all other parameters as is. This file came from MVS.
*
*-- 3. If the NETDATA RECFM specifies the shortened variable format,
*-- e.g., RECFM=xx01 or xx02, then the LRECL must be increased
*-- by 4 bytes to account for a RDW to be inserted.
*
*-- 4. If the NETDATA RECFM specifies the shortened variable format,
*-- e.g., RECFM=xx01 or xx02, then the RECFM value used for
*-- dynamic allocation of the dataset must be modified to specify
*-- variable length records, as the variable X'40' bit may not
*-- be set in the NETDATA RECFM.
*
*-- 5. If the BLKSIZE is 0, the file probably came from VM; then
*-- do the following:
*-- a. Manufacture a suitable blksize as close to 4K as possible.
*-- b. If the LRECL > 4K, then make BLKSIZE=LRECL.
*-- c. For Fixed length records, force the RECFM X'10' bit to
*-- indicate blocked records, if BLKSIZE is not equal to LRECL.
*
*-- Entry: Fields BLKSIZE, LRECL, RECFM as decoded from NETDATA
*-- Exit: R1 = BLKSIZE for use in dynamic allocation and DCB
*-- R2 = LRECL for use in dynamic allocation and DCB
*-- R3 = RECFM for use in dynamic allocation and DCB
*
GETBSZ EQU *
ICM R1,15,BLKSIZE+6 Get blocksize
IC R3,RECFM+2 Get DCB portion of NETDATA RECFM
ICM R2,15,LRECL+6 Get lrecl
BZR R14 No LRECL? leave everything be
TM RECFM+2,X'48' Spanned variable records?
BOR R14 Yes, use as specified
TM RECFM+3,X'03' Shortened variable format?
BZ GETB010 No
LA R2,4(,R2) Add length to LRECL for RDW
O R3,=A(DCBRECV+DCBRECBR) Ensure DCB RECFM is VB
*
GETB010 EQU *
LTR R1,R1 Was there a blksize?
BNZR R14 Use it if we have it
TM RECFM+2,X'40' Variable format data?
BO GETB030 Yes
TM RECFM+3,X'03' Compressed variable format?
BNZ GETB030 Yes, treat as variable
*fixed
L R1,=F'4096' Get possible block size
DR R0,R2 Compute # recs in 4096 block
LTR R1,R1 Do any recs fit?
BZ GETB020 No, so make blksize=lrecl
SR R0,R0 Dispose of remainder
MR R0,R2 Compute nearest block size
O R3,=A(DCBRECF+DCBRECBR) Set RECFM to FB
BR R14 Return with BLKSIZE in R1
*
GETB020 EQU *
LR R1,R2 Make BLKSIZE=LRECL if LRECL>4096
N R3,=A(-1-DCBRECBR) Turn off blocking
BR R14 Return with BLKSIZE in R1
*
*variable
GETB030 EQU *
L R1,=F'4096' Get possible block size
LA R0,4092 Possible size - 4 (for RDW)
CR R2,R0 Will LRECL fit in possible size?
BNHR R14 Yes, use the 4K blksize
*
GETB040 EQU *
LA R1,4(,R2) Mk BLKSIZE=LRECL+4 if LRECL>4092
N R3,=A(-1-DCBRECBR) Turn off blocking
BR R14 Return with BLKSIZE in R1
*
*-- Compute primary and secondary space values in # blocks
*
*-- Entry: R1 = blksize
*-- Field FILESIZE contains NETDATA estimated file size in bytes
*
*-- Exit: R1 = # of primary blocks
*-- R2 = # of secondary blocks (always 10% of primary)
*
GETSPACE EQU *
ICM R3,15,FILESIZE+6 Get approx size of file
SR R2,R2 Clear for divide
DR R2,R1 Compute # blocks needed
LA R3,1(,R3) Always round up
LR R1,R3 Return primary blocks in R1
SR R2,R2 Clear for divide
D R2,=F'10' Compute 1/10th of needed amt
LA R2,1(,R3) Round up = secondary blks needed
BR R14 Return with R1 & R2 values
DROP R7
*
*-- PURGE the spool file
*
*-- Conditions:
*-- 1. If INDATASET was specified then there is no spool file to purge
*-- 2. If PURGE was specified when the user was prompted for
*-- additional parameters, then purge the spool file and exit
*-- without receiving the file.
*-- 3. If NOPURGE was specified on the command line (if not overridden
*-- by (2) above), then receive the file but do not purge it from
*-- the spool.
*-- 4. Otherwise, PURGE is defaulted or explicity specified on the
*-- command line, receive the file and then purge it from spool.
*
PUR000 EQU *
TM FLAGS3,F3INDS INDATASET specified?
BOR R14 Yes, PURGE has no meaning
TM FLAGS4,F4PURGE PURGE specified on prompt?
BO PUR010 Yes, do it
TM FLAGS3,F3PURGE PURGE specified or defaulted?
BZR R14 No; do not purge spool file
*
PUR010 EQU *
ST R14,SV14PUR Save return addr
LA R6,TAGDATA -> area containing tag data
USING TAG,R6
LA R8,NCB1 -> NCB
NSIO TYPE=PURGE, Purge the file x
NCB=(R8), x
TAG=(R6) -> Where tag data is
LTR R15,R15 Any errors?
BZ PUR040 No
BAL R14,FMT000 Display error
B EXIT08 Exit on VSAM error
*
PUR030 EQU *
NSIO TYPE=CLOSE, Close the spool x
NCB=(R8)
NI FLAGS2,255-F2NCBOPN Indicate NETSPOOL closed
*
PUR040 EQU *
MVC LIST(4+L'MSG028T),MSG028 Move file purged msg
LH R1,TAGID Get the file ID
DROP R6 TAG
CVD R1,DBLE
UNPK LIST+9(4),DBLE
OI LIST+12,X'F0' Fix sign
LA R2,LIST -> msg text
BAL R14,PUTLINE Inform user
L R14,SV14PUR Reload return addr
BR R14 Return
*
*
ERR001 EQU *
MVC LIST(4+L'MSG001T),MSG001 Move msg to work area
CVD R15,DBLE unpk IKJPARS RC
UNPK LIST+57(2),DBLE
OI LIST+58,X'F0' Fix sign
LA R2,LIST -> msg
B ERRPUT Write msg v200
*
ERR004 EQU *
MVC LIST(4+L'MSG004T),MSG004 Move msg to work area
MVC LIST+11(8),USRMEM Plug in member name
LA R2,LIST -> msg
B ERRPUT Write msg v200
*
ERR005 EQU *
MVC LIST(4+L'MSG005T),MSG005 Move msg text
LA R1,=CL9'INDATASET' Assume reading from INDATASET
TM FLAGS3,F3INDS Using INDATASET?
BO *+8 We are
LA R1,=CL9'NETSPOOL' NO, its NETSPOOL
MVC LIST+4+L'MSG005T(9),0(R1) Move source of error
LH R1,LIST Get current msg length
LA R1,9(,R1) Add on the source length
STH R1,LIST Put back
LA R2,LIST Unexpected EOF on xxxxxxxxx
B ERRPUT Write msg v200
*
ERR006 EQU *
LA R2,MSG006 Not APF authorized
B ERRPUT Write msg v200
*
ERR007 EQU *
MVC LIST(4+L'MSG007T),MSG007 Move msg text
LA R1,=CL9'INDATASET' Assume reading from INDATASET
TM FLAGS3,F3INDS Using INDATASET?
BO *+8 We are
LA R1,=CL9'NETSPOOL' NO, its NETSPOOL
MVC LIST+4+L'MSG007T(9),0(R1) Move source of error
LH R1,LIST Get current msg length
LA R1,9(,R1) Add on the source length
STH R1,LIST Put back
LA R2,LIST Read i/o error on INDATASET
B ERRPUT Write msg v200
*
ERR008 EQU *
LA R2,MSG008 INDATASET is not NETDATA fmt
B ERRPUT Write msg v200
*
ERR009 EQU *
LA R2,MSG009 INDATASET is not 80/F
B ERRPUT Write msg v200
*
ERR010 EQU *
LA R2,MSG010 No files available to receive
B ERRPUT Write msg v200
*
ERR011 EQU *
LA R2,MSG011 Specific file number not exis
B ERRPUT Write msg v200
*
ERR013 EQU *
LA R2,MSG013 NJE38 is not active
B ERRPUT Write msg v200
*
ERR016 EQU *
LA R2,MSG016 Cant receive another users file
B ERRPUT Write msg v200
*
ERR022 EQU *
LA R2,MSG022 No suitable PUBLIC volume
B ERRPUT Write msg v200
*
ERR023 EQU *
LA R2,MSG023 BLKSIZE/LRECL to large
B ERRPUT Write msg v200
*
ERR025 EQU *
LA R2,MSG025 Need to run VERIFY
B ERRPUT Write msg v200
*
ERR026 EQU *
MVC LIST(4+L'MSG026T),MSG026 Move msg to work area
CVD R15,DBLE unpk PUTGET RC
UNPK LIST+49(2),DBLE
OI LIST+50,X'F0' Fix sign
LA R2,LIST -> msg PUTGET failed
B ERRPUT Write msg v200
*
ERR030 EQU *
LA R2,MSG030 INMTEXT detected not supported
B ERRPUT Write msg v200
*
ERR032 EQU *
LA R2,MSG032 Security denied access NETSPOOL
B ERRPUT Write msg v200
*
ERR035 EQU * v200
LA R2,MSG035 Incoming is a PDSE Prog Lib v200
B ERRPUT Write msg v200
*
ERR036 EQU * v200
LA R2,MSG036 Volume not online v200
B ERRPUT Write msg v200
*
ERR037 EQU * v200
LA R2,MSG037 BLKSIZE to large for volume v200
B ERRPUT Write msg v200
*
ERR038 EQU * v222
LA R2,MSG038 Input file recs exceed LRECLv222
B ERRPUT Write msg v222
*
ERRPUT EQU * v200
BAL R14,PUTLINE Write error msg in R2 v200
B EXIT08 Exit w RC=08 v200
*
EXIT00 EQU *
SR R15,R15 Set RC=0
B XIT000 Clean up and exit
*
EXIT08 EQU *
LA R15,8 Set RC=8
B XIT000 Clean up and exit
*
XIT000 EQU *
LA R13,NJESA Ensure using proper SA in case
* we've come here due to ESTAE
LR R5,R15 Save RC across shutdown
ESTAE 0 Disable ESTAE
*
TM FLAGS2,F2NETOPN Is NETDATA open?
BZ XIT010 No
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (NETDATA), Close it X
MF=(E,MACLIST)
*
XIT010 EQU *
TM FLAGS2,F2NEWOPN Is NEWDS open?
BZ XIT020 No
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE (NEWDS), Close it X
MF=(E,MACLIST)
*
XIT020 EQU *
TM FLAGS2,F2NCBOPN Is NETSPOOL open?
BZ XIT030 No
SR R6,R6 Ensure no tag data
LA R8,NCB1 -> NCB
NSIO TYPE=CLOSE, Close the spool x
NCB=(R8)
*
XIT030 EQU *
L R0,BLOCKLEN Size of stg area
ICM R1,15,BLOCK -> stg area
BZ XIT040 Skip if never allocated
FREEMAIN RU,LV=(0),A=(1) Release it
*
XIT040 EQU *
L R0,NEWLEN Size of stg area
ICM R1,15,NEWBLK -> stg area
BZ XIT050 Skip if never allocated
FREEMAIN RU,LV=(0),A=(1) Release it
* NJE00200
XIT050 EQU * NJE00210
LA R3,DDLIST -> list of DD's we allocated
LA R4,UNLISTSZ/8 # of DD list entries
*
XIT060 EQU *
CLC =XL8'00',0(R3) Unassigned DD?
BE XIT070 Skip to next
*
MVC UDDNAME,0(R3)
LA R0,UNDYN 00 unalloc
L R15,=A(NJEDYN) -> dynamic allocation rtns
BALR R14,R15
*
XIT070 EQU * NJE00210
LA R3,8(,R3) -> next DD entry
BCT R4,XIT060 Continue unallocation scan
*
XIT080 EQU * NJE00210
TM FLAGS1,F1AUSR Special authorized user?
BZ QUIT Y, Don't need Auth SVC
SR 0,0 Use authorization SVC
SR 1,1 For HERC01/HERC02 only
SVC 244 Get un-authorized
*
QUIT EQU * NJE00210
LR R1,R10 -> NJEWK main work area page
L R13,4(,R13) -> caller's sa NJE00210
ST R5,16(,R13) Set exit RC
FREEMAIN RU, x
LV=4096, x
A=(1)
LM R14,R12,12(R13) Reload system's regs NJE00220
BR R14 Return NJE00240
DROP R12
*
*-- STAX attention exit
*
*-- Just post the PUTGET ECB and return. PUTGET will fail with RC=8.
*
STAXXIT EQU *
STM R14,R12,12(R13) Save
LR R12,R15 Get base
USING STAXXIT,R12
L R10,8(,R1) -> NJEWK area
USING NJEWK,R10
POST PUTECB,16 Post the PUTGET ECB
OI FLAGS4,F4ATTN Indicate ATTN pressed v201
LM R14,R12,12(R13) Load
DROP R12
BR R14 Return
*
LTORG ,
*
DMYNPO DCB DDNAME=NETDATA, X
MACRF=(R), X
DSORG=PO, X
EODAD=EOD000
DMYNPOL EQU *-DMYNPO
*
DMYNPS DCB DDNAME=NETDATA, X
MACRF=(R), X
DSORG=PS, X
EODAD=EOD000
DMYNPSL EQU *-DMYNPS
*
*
DMYSEQ DCB DDNAME=0, X
MACRF=(PL), X
DSORG=PS, X
BFTEK=A
DMYSEQL EQU *-DMYSEQ
*
*
OPEN OPEN 0,MF=L
OPENL EQU *-OPEN
CLOSE CLOSE 0,MF=L
CLOSEL EQU *-CLOSE
LINK LINK EP=0,SF=L
LINKL EQU *-LINK
READ READ DMYDECB,SF,DMYNPO,MF=L
READL EQU *-READ
ESTAE ESTAE 0,MF=L
ESTAEL EQU *-ESTAE
STAX STAX 0,OBUF=(0,0),IBUF=(0,0),USADDR=0,MF=L
STAXL EQU *-STAX
*
COPYPARM DC AL2(L'COPYOPT)
COPYOPT DC C'WORK=0512K'
COPYPRML EQU *-COPYPARM TOTAL LENGTH OF PARM OPTION
*
ATTNMSG DC C'COMMAND TERMINATED DUE TO ATTENTION; PRESS ENTER TWICE'
* v201
*********************
* N J E C O M * NJECOM hosts small routines and
* * frequently used constants that
* Common routines * are available to all NJERxx csects
* and constants * via base register 11
* *
*********************
*
NJECOM CSECT
DC A(0) No branch around constants
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECOM'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
USING NJECOM,R11
*
*-- GET000 is used to read a block from the INDATASET or to read
*-- a record from NETSPOOL.
*
*-- Entry: INDATASET or NETSPOOL must be OPEN.
*-- Exit: R0 = length of data read
*-- R1 -> data read
*-- R15= RC. 0=OK
*-- 4=Unexpected end of file
*-- 8=Read i/o error
*
GET000 EQU *
ST R14,SV14GET
TM FLAGS3,F3INDS INDATASET specified?
BZ GET030 No, use NETSPOOL
*
LA R2,NETDATA -> DCB
L R0,BLOCK -> read buffer
*
READ DECB,SF,(R2),(R0),'S',MF=E Read block
CHECK DECB
*
CLI DECB,X'7F' Was read successful?
BNE GET090 No, read failed
*
L R0,BLOCKLEN Get current block size
L R15,DECB+16 -> IOB addr
SH R0,14(,R15) Compute size of block read
L R1,BLOCK Return buffer addr
SR R15,R15 Set RC=0
L R14,SV14GET
BR R14 Return w/len & addr in R0,R1
*
GET030 EQU *
LA R1,NCB1 -> NCB
NSIO TYPE=GET, TAG data contains file # x
NCB=(1), x
AREA=LIST v200
LTR R15,R15 Any errors?
BZ GET040 No
BAL R14,FMT000 Display error
B GET090
*
GET040 EQU *
MVC REC(133),BLANKS Init receiving field v200
LH R2,NCBRECLN-NCB(,R1) Get the record length v200
BCTR R2,0 Adjust for execute v200
EX R2,MVSPL Mv spool record to phy rec areav200
LA R1,REC -> record
LA R0,80 Always 80
SR R15,R15 Set RC=0
L R14,SV14GET
BR R14 Return w/len & addr in R0,R1
*
MVSPL MVC REC(0),LIST executed instr v200
*
GET090 EQU *
LA R15,8 Set RC=8 = Read error
L R14,SV14GET
BR R14 Return
*
EOD000 EQU *
LA R15,4 Set RC=4 = unexpected EOF
L R14,SV14GET
BR R14 Return w/len & addr in R0,R1
*
*-- Find a PUBLIC volume for use in allocations
*
*-- Entry: R0 = blksize of dataset to be allocated
*-- Exit: CC=0 if no volume selected
*-- CC<>0 if volume selected, and,
*-- TVOLSER,DEVINFO fields are filled in.
*
*-- Uses R15-R3
*
GETVOL EQU *
LA R1,DISKS -> dasd characteristics table
USING DASDTAB,R1
*
GETV010 EQU *
SR R3,R3 Clear for ICM
L R2,16 -> CVT
USING CVT,R2
L R2,CVTILK2 -> UCB Lookup table
*
GETV020 EQU *
LA R2,2(,R2) -> first table entry
*
CLC 0(2,R2),=X'FFFF' End of UCBs?
BE GETV030 Y
ICM R3,3,0(R2) -> UCB
BZ GETV020 Skip empty table slot
USING IEFUCBOB,R3
TM UCBSTAT,UCBONLI Is device online?
BZ GETV020 N, next UCB
TM UCBTBYT3,UCB3DACC Direct access device?
BZ GETV020 N, next UCB
CLC UCBTBYT4,DASDTYPE Preferred device type?
BNE GETV020 N, next UCB
TM UCBSTAB,UCBBPUB PUBLIC volume?
BZ GETV020 N
LA R15,DASDSIZE -> full track size for device
CLC DASDHTRK,=AL2(0) Is a half-track blksize avail?
BE *+8 No
LA R15,DASDHTRK Yes, use 1/2 track for device
CLM R0,3,0(R15) Will file blksize fit?
BH GETV030 Too large, get another dasd type
*
ST R1,DEVINFO Save ptr to selected dev type
* UCBNAME contains C'cuu'
MVC TVOLSER,UCBVOLI Save selected volser to text unit
CLI *,1 Set CC to non zero
BR R14
*
GETV030 EQU *
LA R1,DASDLEN(,R1) Next DASD device preference
CLI 0(R1),X'FF' End of DASD table?
BER R14 Y, no suitable unit found, cc=0
B GETV010 Search again
DROP R3 IEFUCBOB
DROP R2 CVT v200
DROP R1 DASDTAB
*
*-- Find a volser in the UCBs so we can get its devtype (cant use v200
*-- DEVTYPE because it is not allocated yet) and determine its v200
*-- maximum track size. v200
*
*-- Entry: R1 -> CL'volser' to be located v200
*-- Exit: CC=0 if the volser was not found v200
*-- CC<>0 if volume found; and R15 = track size in bytes v200
*
*-- Uses R15-R3 v200
*
FNDVOL EQU * v200
SR R3,R3 Clear for ICM v200
L R2,16 -> CVT v200
USING CVT,R2 v200
L R2,CVTILK2 -> UCB Lookup table v200
DROP R2 CVT v200
*
FNDV020 EQU * v200
LA R2,2(,R2) -> first table entry v200
* v200
CLC 0(2,R2),=X'FFFF' End of UCBs? v200
BE FNDV090 Y v200
ICM R3,3,0(R2) -> UCB v200
BZ FNDV020 Skip empty table slot v200
USING IEFUCBOB,R3 v200
TM UCBSTAT,UCBONLI Is device online? v200
BZ FNDV020 N, next UCB v200
TM UCBTBYT3,UCB3DACC Direct access device? v200
BZ FNDV020 N, next UCB v200
CLC UCBVOLI,0(R1) Selected volser? v200
BNE FNDV020 No, next UCB v200
*
LA R1,DISKS -> dasd characteristics table v200
USING DASDTAB,R1 v200
*
FNDV030 EQU * v200
CLI 0(R1),X'FF' End of DASD types? v200
BE FNDV090 Cant match volser vs devtype v200
*
CLC UCBTBYT4,DASDTYPE Match the device type? v200
BE FNDV080 Yes v200
LA R1,DASDLEN(,R1) Next DASD device in table v200
B FNDV030 Look again v200
*
FNDV080 EQU * v200
SR R15,R15 Clear for IC v200
ICM R15,3,DASDSIZE Get full track size for device v200
CLI *,1 Set CC to non zero v200
*
FNDV090 EQU * v200
BR R14 Return w CC=0 or CC<>0 v200
DROP R3 IEFUCBOB v200
DROP R1 DASDTAB v200
*
*
*-- Format VSAM NETSPOOL errors
*
*
FMT000 EQU *
STM R14,R2,PARSA+12 Borrow NJEPAR save area
LA R15,0(,R14) Clear high, Get addr of call to this rtn
L R2,NJESA+4 -> system provided FSA
L R2,16(,R2) Get R15's entry point addr
LA R2,0(,R2) Ensure high byte clear
SR R15,R2 Compute offset of call
MVC LIST+0(4+L'MSG024T),MSG024 Move msg text
MVC LIST+55(8),5(R2) Move csect name
TRT LIST+55(9),BLANK Look for end of csect name
MVI 0(R1),C'+'
*
ST R15,DBLE Save call offset to work area
UNPK TWRK(5),DBLE+2(3) Add zones
TR TWRK(4),HEXTRAN-240 Display hex
MVC 1(4,R1),TWRK Move call offset to msg
*
LA R15,NCB1
UNPK TWRK(5),NCBRTNCD-NCB(3,R15) Add zones
TR TWRK(4),HEXTRAN-240
MVC LIST+35(4),TWRK Move rtncd/errcd
*
UNPK TWRK(3),NCBREQ-NCB(2,R15) Add zones
TR TWRK(2),HEXTRAN-240
MVC LIST+45(2),TWRK Move req code
*
L R1,NCBMACAD-NCB(,R15) Get failing VSAM macro addr
LA R1,0(,R1) Clear high byte
S R1,=V(NJESPOOL) Compute offset into NJESPOOL rtn
ST R1,DBLE
UNPK TWRK(5),DBLE+2(3) Add zones
TR TWRK(4),HEXTRAN-240 Display hex
MVC LIST+50(4),TWRK Move NJESPOOL offset to msg
*
LA R2,LIST
BAL R14,PUTLINE
*
FMT090 EQU *
LM R14,R2,PARSA+12 Restore caller regs
BR R14 Return
*
*-- Write a single line to terminal
*
*-- Entry: R2 -> output msg (RDW+msg text)
*-- Exit: R15 = RC from PUTLINE
*
PUTLINE EQU *
TM FLAGS3,F3QUIET QUIET mode enabled?
BZ PUT010 No, proceed
CLI 3(R2),1 Suppress this msg in QUIET mode?
BER R14 Yes
*
PUT010 EQU *
ST R14,SV14LN Save return
XC PUTECB,PUTECB Clear PUTLINE ECB
L R15,CPARMS -> command input CPPL
USING CPPL,R15
LA R1,IOPLAREA -> IOPL
USING IOPL,R1
MVC IOPLUPT,CPPLUPT Set UPT ptr
MVC IOPLECT,CPPLECT Set ECT ptr
DROP R15 CPPL
*
MVC TWRK(PBL),PB Move macro model
PUTLINE PARM=TWRK, Write a line x
ECB=PUTECB, x
OUTPUT=((R2),TERM,SINGLE,DATA), x
MF=(E,(1))
DROP R1 IOPL
L R14,SV14LN Load return
BR R14
*
*
*-- Write a single line to terminal and prompt for response
*
*-- Entry: OLDMSGAD points to output message
*-- Exit: R15 = RC from PUTGET
*-- PGPBIBUF -> input data (if any)
*
PUTGET EQU *
ST R14,SV14LN Save return
XC PUTECB,PUTECB
L R15,CPARMS -> command input CPPL
USING CPPL,R15
LA R1,IOPLAREA -> IOPL
USING IOPL,R1
MVC IOPLUPT,CPPLUPT Set UPT ptr
MVC IOPLECT,CPPLECT Set ECT ptr
DROP R15 CPPL
*
MVC MACLIST(PGTL),PGT move macro model
PUTGET PARM=MACLIST, x
ECB=PUTECB, x
OUTPUT=(OLD,SINGLE,PROMPT), x
TERMPUT=(EDIT,WAIT,NOHOLD,NOBREAK), x
TERMGET=(EDIT,WAIT), x
MF=(E,(1))
DROP R1 IOPL
*
LA R5,MACLIST
USING PGPB,R5
L R1,PGPBIBUF -> input buffer acquired
DROP R5
L R14,SV14LN Load return
BR R14
*
*-- Get status of NJE38
*
*-- Entry: R1=0 (no spool dsn needed), or, R1-> 44-char spool DSN area
*-- Exit: RC=0 NJE38 is active; R1-> NJE38 CSA block
*-- RC<>0 NJE is not active.
*
CHK000 EQU *
LA R1,TDSNAME => where to place spool DSN v210
L R15,=V(NJESYS) -> ENQ finder v210
BALR R14,R15 Check if NJE38 already act v210
LTR R15,R15 Set CC (RC=0 NJE38 active) v210
BNZR R2 Return if NJE38 inactive v210
MVC LCLNODE,NJ38NODE-NJ38CSA(R1) Save off lcl node namev210
MVC DEFUSER,NJ38DUSR-NJ38CSA(R1) Save off default user v210
BR R2 Return; NJE38 active v210
*
LTORG
*
PB PUTLINE MF=L
PBL EQU *-PB
PGT PUTGET MF=L
PGTL EQU *-PGT
*
NJE38Q DC CL8'NJE38' QNAME
NJERCON DC CL8'NJEINIT' RNAME (first 8 bytes)
*
*
*
BLANKS DC CL136' ' v200
NONBLANK DC 64X'FF',X'00',191X'FF' TR Table to locate nonblank
BLANK DC 64X'00',X'FF',191X'00' TR Table to locate blanks
DOTS DC 75X'00',X'FF',180X'00' TR Table to locate '.' char
HEXTRAN DC CL16'0123456789ABCDEF' Translate table
*
*-- RECEIVE messages
*
*-- Note: a '1' after the length indicates suppress this msg if QUIET
*
MSGBLNK DC Y(4+L'MSGBLNKT,1)
MSGBLNKT DC C' '
*
MSG000 DC Y(4+L'MSG000T,1)
MSG000T DC C'NJE38 RECEIVE &VERS'
*
MSG001 DC Y(4+L'MSG001T,0)
MSG001T DC C'Error parsing RECEIVE command parameters. IKJPARS RC=yx
y (dec)'
* 456789012345678901234567890123456789012345678901234567
MSG002 DC Y(4+L'MSG002T,0)
MSG002T DC C' ' UNUSED - AVAILABLE
*
MSG003 DC Y(4+L'MSG003T,0)
MSG003T DC C'Invalid or unsupported NETDATA detected; error code x,*
record '
*
MSG004 DC Y(4+L'MSG004T,0)
MSG004T DC C'Member xxxxxxxx was not found'
* 456789012345678901234567890123456789012345678901234567
*
MSG005 DC Y(4+L'MSG005T,0)
MSG005T DC C'Unexpected end of file encountered reading '
*
MSG006 DC Y(4+L'MSG006T,0)
MSG006T DC C'The RECEIVE command is not APF-authorized'
*
MSG007 DC Y(4+L'MSG007T,0)
MSG007T DC C'I/O error reading '
*
MSG008 DC Y(4+L'MSG008T,0)
MSG008T DC C'Specified INDATASET does not contain NETDATA formattedx
records'
*
MSG009 DC Y(4+L'MSG009T,0)
MSG009T DC C'Specified INDATASET must be LRECL=80, RECFM=F or FB'
*
MSG010 DC Y(4+L'MSG010T,0)
MSG010T DC C'No files are available to receive'
*
MSG011 DC Y(4+L'MSG011T,0)
MSG011T DC C'Specified file number does not exist'
*
MSG012 DC Y(4+44+L'MSG012T,0)
MSG012T DC C'Allocation error xxxxxxxx, DSN='
*
MSG013 DC Y(4+L'MSG013T,0)
MSG013T DC C'NJE38 is not active'
*
MSG014 DC Y(4+L'MSG014T,1)
MSG014T DC C'Receiving '
*
MSG015 DC Y(4+L'MSG015T,1)
MSG015T DC C' Enter receive parameters or ''PURGE'' or ''END'' +'
*
MSG016 DC Y(4+L'MSG016T,0)
MSG016T DC C'Cannot receive file destined for another user'
*
MSG017 DC Y(4+L'MSG017T,1)
MSG017T DC C'Receive into '
*
MSG018 DC Y(4+L'MSG018T,0)
MSG018T DC C'Receive failed due to IEBCOPY RC=xx'
* 456789012345678901234567890123456789012345678901234567
*
MSG019 DC Y(4+L'MSG019T,0)
MSG019T DC C'RECEIVE ended with no action taken'
*
MSG020 DC Y(4+L'MSG020T,1)
MSG020T DC C' Enter receive parameters or ''END'' +'
*
MSG021 DC Y(4+L'MSG021T,0)
MSG021T DC C'Member name ignored'
*
MSG022 DC Y(4+L'MSG022T,0)
MSG022T DC C'No suitable PUBLIC volume found that can contain this x
dataset'
*
MSG023 DC Y(4+L'MSG023T,0)
MSG023T DC C'The BLKSIZE or LRECL of the received file exceeds the x
32760-byte MVS limit'
*
MSG024 DC Y(4+L'MSG024T,0)
MSG024T DC C'ERROR: NETSPOOL RTNCD/ERRCD=X''0000'',REQ=01,O=1234,Mx
MMMMMMM '
*
MSG025 DC Y(4+L'MSG025T,0)
MSG025T DC C'Unable to open NETSPOOL. Run IDCAMS VERIFY against thex
NETSPOOL dataset'
*
MSG026 DC Y(4+L'MSG026T,0)
MSG026T DC C'Error in terminal prompt message. PUTGET RC=yy (dec)'
* 456789012345678901234567890123456789012345678901234567
*
MSG027 DC Y(4+L'MSG027T,0)
MSG027T DC C' exists'
*
MSG028 DC Y(4+L'MSG028T,1)
MSG028T DC C'File(xxxx) purged from NJE38 spool'
*
MSG029 DC Y(4+L'MSG029T,0)
MSG029T DC C'RECEIVE ended without receiving anything'
*
MSG030 DC Y(4+L'MSG030T,0)
MSG030T DC C'RECEIVE halted; unsupported message text (INMTEXT) detx
ected'
*
MSG031 DC Y(4+L'MSG031T,0)
MSG031T DC C' does not exist'
*
MSG032 DC Y(4+L'MSG032T,0)
MSG032T DC C'Access to the NETSPOOL dataset denied due to security x
settings'
*
MSG033 DC Y(4+L'MSG033T,0) v200
MSG033T DC C'Volume unavailable or conflicting with specified UNIT x
name' v200
*
MSG034 DC Y(4+L'MSG034T,0) v200
MSG034T DC C'The specified UNIT name is not defined in the system' x
v200
*
MSG035 DC Y(4+L'MSG035T,0) v200
MSG035T DC C'Incoming file is a PDSE Program Library which cannot bx
e supported' v200
*
MSG036 DC Y(4+L'MSG036T,0) v200
MSG036T DC C'The selected volume is not online' v200
*
MSG037 DC Y(4+L'MSG037T,0) v200
MSG037T DC C'The incoming file block size is too large to fit on thx
e selected volume' v200
*
MSG038 DC Y(4+L'MSG038T,0) v222
MSG038T DC C'The incoming file contains logical records that exceedx
the LRECL of the dataset' v222
* NJE00250
* NJE00250
* DASD Characteristics in order of selection preference NJE00250
* NJE00250
* NOTE: 3380 DASD exist in this table twice. The reason for NJE00250
* this is to allow a better identification of the DASD NJE00250
* type required by "GETVOL" based on the received file's NJE00250
* BLKSIZE. The file could be half-track blocked, so we NJE00250
* need to account for that in selecting a device type. NJE00250
* However, the file could be using a BLKSIZE that is NJE00250
* larger than the half track size despite the inefficiency. NJE00250
* For these cases, the last 3380 entry does not have NJE00250
* a half-track size value, allowing the GETVOL search to
* succeed using the full track size which would accomodate
* any MVS BLKSIZE that could be received.
*
* NJE00250
DISKS EQU * TYP CYLS TRKS BYTES 1/2-TRK
DC X'0E',AL2(885),AL1(15),AL2(47476),AL2(23476) 3380 A/D/J
DC X'0B',AL2(555),AL1(30),AL2(19069),AL2(0) 3350
DC X'0C',AL2(959),AL1(12),AL2(35616),AL2(17600) 3375
DC X'0F',AL2(1113),AL1(15),AL2(56664),AL2(27998) 3390-1
DC X'0D',AL2(808),AL1(19),AL2(13030),AL2(0) 3330-11
DC X'09',AL2(404),AL1(19),AL2(13030),AL2(0) 3330-1
DC X'0A',AL2(696),AL1(12),AL2(8368),AL2(0) 3340-70
DC X'08',AL2(200),AL1(20),AL2(7294),AL2(0) 2314
DC X'0E',AL2(885),AL1(15),AL2(47476),AL2(0) 3380 A/D/J
DC X'FF' End of table
* NJE00250
DASDTAB DSECT
DASDTYPE DS X Dasd UCB device type code
DASDCYLS DS AL2 Number of cylinders
DASDTRKS DS AL1 Number of tracks
DASDSIZE DS AL2 Bytes per track
DASDHTRK DS AL2 Bytes per half-track block or 0
DASDLEN EQU *-DASDTAB Size of one DASDTAB entry
*
* NJE00250
*********************
* N J E N O T * NJENOT tells the user the chosen
* * DSN of the file and prompts for
* User notify and * changes
* prompt *
* *
*********************
*
*
NJENOT CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJENOT'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJENOT,R12 NJE00070
USING NJEWK,R10
ST R13,NOTSA+4 SAVE prv S.A. ADDR NJE00080
LA R2,NOTSA -> my save area
ST R2,8(,R13) Plug it into prior SA
LR R13,R2
*
NOT000 EQU *
BAL R14,BDS000 Build final dataset name
BAL R14,NTF000 Build notification msg
*
TM FLAGS2,F2FEND END forced previously?
BO XITNOT04 Force 'END' again
*
LA R2,LIST -> MSG014 receiving dataset...
BAL R14,PUTLINE Notify user
*
TM FLAGS1,F1BATCH Are we in BATCH mode?
BO NOT090 Yes, special handling
TM FLAGS3,F3NPRMPT Are we in NOPROMPT mode?
BO NOT090 Yes, special handling
*
LA R1,MSG015 -> enter parameters prompt
TM FLAGS3,F3INDS Was INDATASET specified?
BZ NOT010 No
LA R1,MSG020 Use MSG020 if INDS in use
*
NOT010 EQU *
ST R1,OLDMSGAD Set it in the OLD
BAL R14,PUTGET Prompt the user
C R15,=F'8' PUTGET ECB posted (attn recv'd)?
BE XITNOT04 Yes, treat as 'END' specified
LTR R0,R15 PUTGET RC to R0
BNZ XITNOT16 Exit if putget error
*
ST R1,OLDMSGAD Temp save of PUTGET input ptr
LA R0,4 Code 4: use prompt parameters
* R1 -> PUTGET input buffer
L R15,=A(NJEPAR) -> parse routine
BALR R14,R15
LR R5,R15 Any errors to R5
*
TM FLAGS4,F4ATTN Was ATTN pressed? v201
BO XITNOT04 Y, immediate exit v201
*
L R1,OLDMSGAD -> PUTGET input buffer
LH R0,0(,R1) Get length of area
O R0,=X'01000000' Set SP=1
FREEMAIN R,LV=(0),A=(1) Free the PUTGET msg buffer
*
LTR R0,R5 Now put IKJPARS RC in R0
BNZ XITNOT12 Display IJKPARS RC
TM FLAGS4,F4END Was END specified?
BO XITNOT04 Exit if END
TM FLAGS4,F4PURGE Was PURGE specified?
BO XITNOT08 Exit if PURGE
B XITNOT00
*
*-- If running BATCH, allow one trip through here to exit cleanly
*-- to simulate pressing "enter" with no parameters. On all
*-- subsquent calls to NJENOT, F2END will be set (if BATCH) so
*-- we can force END in order to prevent looping in batch.
*
NOT090 EQU *
OI FLAGS2,F2FEND Indic force END from now on
B XITNOT00 Allow null prompt this time
*
*-- Build DSN
*
*-- DSN Strategy: The DSN from the NETDATA will be extracted and
*-- the first qualifer eliminated, unless the DSN is only one
*-- qualifier. Then, the remaining part of that DSN will be appended
*-- to the receiving user's userid (the userid will be the new
*-- first qualifier.
*
*-- If the incoming file is a flat file (not NETDATA) the DSNAME is
*-- manufactured from the filename and filetype fields of the TAG data.
*
*-- If DATASET was specified on the command line (F3DS=1) then we
*-- will attempt to use that as is and exit the build DS routine.
*
BDS000 EQU *
TM FLAGS3,F3DS Is final dataset already set?
BOR R14 Exit if we already have it
MVC FINALDS,BLANKS Init
MVC FINALDS(8),USERID Move userid
TM FLAGS2,F2FLAT Is incoming file a flat file?
BO BDS020 Yes, use tag data
*
LA R7,INMF02A -> first INMR02 results
USING INMFIELD,R7
*
SR R4,R4 Clear for IC
ICM R4,3,DSNAME Get NETDATA DSN length
LA R1,DSNAME+2 Assume DSN has 1 qualifier
TRT DSNAME+2(10),DOTS Look for end of 1st qualifier
BZ BDS010 Branch if only 1 qualifier
LA R1,1(,R1) Skip the delim after 1st qualifr
LR R0,R1 Copy position
LA R2,DSNAME+2 Start of DSN
SR R0,R2 Compute length we are skipping
SR R4,R0 Reduce remaining DSN length
*
BDS010 EQU *
LR R3,R1 Save start of NETDATA DSN
TRT FINALDS(9),BLANK Look for end of userid
MVI 0(R1),C'.' Add delimiter
LA R1,1(,R1) -> next available byte
LA R2,FINALDS -> start of userid
LR R0,R1 Copy next available byte addr
SR R0,R2 Compute userid. length
LA R15,43 Total DSN length -1 for execute
SR R15,R0 Compute remaining available
CR R15,R4 Use lesser remaining length
BL *+6 Br if TDSNAME length is less
LR R15,R4 No, NETDATA DSN len is less
EX R15,MVCDSN Move the rest of it
*MVCDSN MVC 0(0,R1),0(R3)
CLI FINALDS+43,C'.' Last char of DSN is a delim?
BNER R14 No
MVI FINALDS+43,C' ' Blank it out
DROP R7 INMFIELD
BR R14 Return
*
BDS020 EQU *
LA R4,TAGDATA -> Spool file's tag data
USING TAG,R4
*
LA R1,FINALDS -> final dsname area
TRT 0(9,R1),BLANK Look for end of userid
MVI 0(R1),C'.' Add delimiter
LA R1,1(,R1) -> next available byte
MVC 0(8,R1),TAGNAME Insert tag's file name
TRT 0(9,R1),BLANK Find the end of it
MVI 0(R1),C'.' Add delimiter
LA R1,1(,R1) -> next available byte
MVC 0(8,R1),TAGTYPE Insert tag's file name
DROP R4 TAG
BR R14 Return
*
*
MVCDSN MVC 0(0,R1),0(R3) executed instr
*
*
*-- Build msg containing incoming dataset name from the netdata
*
NTF000 EQU *
MVC LIST,BLANKS
MVC LIST(4+L'MSG014T),MSG014 'Receiving ...'
LA R1,LIST+4+L'MSG014T -> next available byte
MVI 0(R1),C'''' Move apost
LA R1,1(,R1) Next byte
*
TM FLAGS2,F2FLAT Is incoming file a flat file?
BO NTF020 Yes, use tag data
*
LA R7,INMF02A -> First INMR02 data
USING INMFIELD,R7
MVC 0(44,R1),DSNAME+2 Move incoming DSN
TRT 0(45,R1),BLANK Look for end of DSN
MVI 0(R1),C'''' Move apost
LA R1,2(,R1) -> skip over apost + 1 blank
MVC 0(4,R1),=C'from'
LA R1,5(,R1) -> where to put node id
LA R7,INMF01 -> INMR01 data
USING INMFIELD,R7
MVC 0(8,R1),FNODE+2 Move from node name
TRT 0(9,R1),BLANK Look for end of nodeid
MVI 0(R1),C'(' Insert (
MVC 1(8,R1),FUSER+2 Move from user name
DROP R7 INMFIELD
TRT 1(9,R1),BLANK Look for end of userid
MVI 0(R1),C')' Insert )
LA R1,1(,R1) -> end of msg
LA R0,LIST -> start of msg
ST R0,OLDMSGAD Set msg ptr
SR R1,R0 Compute length of msg
STH R1,LIST Set length of msg for PUTGET
BR R14 Return
*
*-- Build msg containing incoming dataset name from the tag data
*
NTF020 EQU *
LA R4,TAGDATA -> Spool file's tag data
USING TAG,R4
*
MVC 0(8,R1),TAGNAME Insert tag's file name
TRT 0(9,R1),BLANK Find the end of it
LA R1,1(,R1) -> next available byte
MVC 0(8,R1),TAGTYPE Insert tag's file name
TRT 0(9,R1),BLANK Find the end of it
MVI 0(R1),C'''' Move apost
LA R1,2(,R1) -> skip over apost + 1 blank
MVC 0(4,R1),=C'from'
LA R1,5(,R1) -> where to put node id
MVC 0(8,R1),TAGINLOC Move from node name
TRT 0(9,R1),BLANK Look for end of nodeid
MVI 0(R1),C'(' Insert (
MVC 1(8,R1),TAGINVM Move from user name
DROP R4 TAG
TRT 1(9,R1),BLANK Look for end of userid
MVI 0(R1),C')' Insert )
LA R1,1(,R1) -> end of msg
LA R0,LIST -> start of msg
ST R0,OLDMSGAD Set msg ptr
SR R1,R0 Compute length of msg
STH R1,LIST Set length of msg for PUTGET
BR R14 Return
*
*-- Exit
*
XITNOT00 EQU *
SR R0,R0 Set secondary RC=0;
SR R15,R15 Set RC=0; normal
B XITNOT
*
XITNOT04 EQU *
SR R0,R0 Set secondary RC=0;
LA R15,4 Set RC=4; END specified
B XITNOT
*
XITNOT08 EQU *
SR R0,R0 Set secondary RC=0;
LA R15,8 Set RC=8; PURGE specified
B XITNOT
*
XITNOT12 EQU *
LA R15,12 Set RC=12; secondary is IKJPARS RC
B XITNOT
*
XITNOT16 EQU *
LA R15,16 Set RC=16; secondary is PUTGET RC
*
XITNOT EQU *
L R13,4(,R13) -> prev s.a.
L R14,12(,R13) Load r14
LM R1,R12,24(R13) Reload callers regs
BR R14 Return with RCs in R0/R15
*
LTORG
* NJE00250
* NJE00250
*********************
* N J E D Y N * NJEDYN handles the various
* * dynamic allocations required
* Handle DYNALLOC * and their unallocations as well.
* *
*********************
*
USING INMFIELD,R7 -> R7 at entry
*
NJEDYN CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDYN'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJEDYN,R12 NJE00070
USING NJEWK,R10
ST R13,DYNSA+4 SAVE prv S.A. ADDR NJE00080
LA R1,DYNSA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC LS99RB,CPS99RB init THE S99RB
LA R1,LS99RB -> S99RB
USING S99RB,R1
ST R1,LS99PTR Set parameter word
OI LS99PTR,X'80' Set VL
LA R6,TXTPTRS -> start of text unit list
ST R6,S99TXTPP Put in S99RB
DROP R1 S99RB
*
UNDYN EQU 0 00 unallocate DDNAME
DYNINMCP EQU 4 04 Allocate INMCOPY dataset
DYNSYSIN EQU 8 08 Allocate SYSIN for IEBCOPY
DYNSYSPR EQU 12 0C Allocate SYSPRINT for IEBCOPY
DYNFINAL EQU 16 10 Allocate final dataset IEBCOPY
DYNSYSU3 EQU 20 14 Allocate SYSUT3 IEBCOPY
DYNINDS EQU 24 18 Allocate INDATASET
DYNETSPL EQU 28 1C Allocate NETSPOOL
*
LR R5,R0 Copy action code
B DYN000(R5) Branch into table
*
DYN000 B DYN010 00 Perform DDNAME Unallocation
B DYN100 04 Allocate INMCOPY dataset
B DYN200 08 Allocate SYSIN for IEBCOPY
B DYN300 0C Allocate SYSPRINT for IEBCOPY
B DYN400 10 Allocate final dataset IEBCOPY
B DYN500 14 Allocate SYSUT3 IEBCOPY
B DYN600 18 Allocate INDATASET
B DYN700 1C Allocate NETSPOOL
*
DYN010 EQU *
MVC UTXT,UTXTD Init text unit
LA R1,LS99RB -> S99RB
USING S99RB,R1
MVI S99VERB,S99VRBUN Set verb code to unallocation
DROP R1 S99RB
*
LA R0,UTXT -> UNALLOC DD text unit
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Deallocate the DD
*
*-- Dataset created for INMCOPY INMR02 control record
*
*-- If there is no DSN, this is a temporary 'unloaded pds' dataset and
*-- no volser is used and can be allocated on a storage volume.
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,DELETE),UNIT=SYSDA,
* // SPACE=(blk,(pri,sec)),
* // DCB=(BLKSIZE=blk,LRECL=l,RECFM=f,DSORG=PS)
*
*-- If there is a DSN, then this is a final dataset, so use the
*-- dsname text unit and place it on the volser of choise.
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,CATLG),UNIT=SYSDA,
* // SPACE=(blk,(pri,sec)),
* // DCB=(BLKSIZE=blk,LRECL=l,RECFM=f,DSORG=PS),
* // DSN=dsname,VOL=SER=volser
*
DYN100 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
MVC TXT04,TXT04D
MVC TXT05,TXT05D
MVC TXT06,TXT06D
MVC TXT07,TXT07D
MVC TXT09,TXT09D
MVC TXT10,TXT10D
MVC TXT12,TXT12D
MVC TXT13,TXT13D
MVC TXT14,TXT14D
MVC TXT15,TXT15D
*
LA R0,TXT01 -> Return DDNAME text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP text unit 1
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP text unit 2
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT12 -> BLKSIZE text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT05 -> BLKLEN text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT14 -> LRECL text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT15 -> RECFM text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> PRIMARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT07 -> SECONDARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT13 -> DSORG text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT10 -> UNIT text unit
ST R0,0(,R6) Plug into ptr list
*
CLC DSNAME(2),=AL2(0) Was there a DSN?
BNE DYN120 Yes, plug DSN & VOL text unit
MVI TXT04+6,X'04' No, its a temp; set DISP=,DELETE
*v223 B DYN190 Then skip DSN text unit v200
B DYN130 Process remaining txt units v223
*
DYN120 EQU *
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSN text unit
ST R0,0(,R6) Plug into ptr list
*
DYN130 EQU * v223
TM FLAGS2,F2UNIT Was UNIT specified? v200
BZ DYN170 No, leave default v200
MVC TUNIT,USRUNIT Set user's unit name v200
TM FLAGS3,F3VOLSER Did user specify VOLSER? v200
BO DYN170 Yes, use what he coded v200
TM FLAGS4,F4VOLSER Did user specify VOLSER? v200
BO DYN170 Yes, use what he coded v200
B DYN190 UNIT without VOLSER specif'dv200
*
DYN170 EQU * Use specified VOL or GETVOL v200
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT09 -> VOLSER text unit
ST R0,0(,R6) Plug into ptr list
*
DYN190 EQU * v200
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- SYSIN for IEBCOPY
*
* Equivalent JCL:
* //SYS00000 DD DUMMY
*
*
DYN200 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT16,TXT16D
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT16 -> DUMMY
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- SYSPRINT for IEBCOPY
*
* Equivalent JCL:
* //SYS00000 DD SYSOUT=*,TERM=TS
*
DYN300 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT16,TXT16D
MVC TXT17,TXT17D
MVC TXT18,TXT18D
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
*
TM FLAGS3,F3QUIET QUIET mode enabled?
BO DYN310 Yes, use DUMMY
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT17 -> SYSOUT=*
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT18 -> TERM=TS
ST R0,0(,R6) Plug into ptr list
B DYN320
*
DYN310 EQU *
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT16 -> DUMMY
ST R0,0(,R6) Plug into ptr list
*
DYN320 EQU *
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Final dataset that IEBCOPY will load
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,CATLG),UNIT=SYSDA,
* // SPACE=(blk,(pri,sec)),
* // DCB=(BLKSIZE=blk,LRECL=l,RECFM=f,DSORG=PO),
* // DSN=dsname,VOL=SER=volser
*
DYN400 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
MVC TXT04,TXT04D
MVC TXT05,TXT05D
MVC TXT06,TXT06D
MVC TXT07,TXT07D
MVC TXT08,TXT08D
MVC TXT09,TXT09D
MVC TXT10,TXT10D
MVC TXT12,TXT12D
MVC TXT13,TXT13D
MVC TXT14,TXT14D
MVC TXT15,TXT15D
*
LA R0,TXT01 -> Return DDNAME text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP text unit 1
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP text unit 2
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT12 -> BLKSIZE text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT05 -> BLKLEN text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT14 -> LRECL text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT15 -> RECFM text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> PRIMARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT07 -> SECONDARY text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT08 -> DIRECTORY BLOCKS text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT13 -> DSORG text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSN text unit
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot v200
LA R0,TXT10 -> UNIT text unit v200
ST R0,0(,R6) Plug into ptr list v200
*
TM FLAGS2,F2UNIT Was UNIT specified? v200
BZ DYN470 No, leave default v200
MVC TUNIT,USRUNIT Set user's unit name v200
TM FLAGS3,F3VOLSER Did user specify VOLSER? v200
BO DYN470 Yes, use what he coded v200
TM FLAGS4,F4VOLSER Did user specify VOLSER? v200
BO DYN470 Yes, use what he coded v223
B DYN490 UNIT without VOLSER specif'dv200
*
DYN470 EQU * Use specified VOL or GETVOL v200
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT09 -> VOLSER text unit
ST R0,0(,R6) Plug into ptr list
*
DYN490 EQU * v200
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- SYSUT3 for IEBCOPY
*
* Equivalent JCL:
* //SYS00000 DD DISP=(NEW,DELETE),UNIT=SYSDA,
* // SPACE=(CYL,5)
*
DYN500 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT03,TXT03D DISP 1
MVC TXT04,TXT04D DISP 2
MVC TXT06,TXT06D PRIME
MVC TXT10,TXT10D UNIT
MVC TXT19,TXT19D CYL
*
MVI TXT04+6,X'04' Adjust to DISP=,DELETE
MVC TXT06+6(3),=XL3'05' 5 cylinders
*
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=NEW
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT04 -> DISP=,DELETE
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT06 -> Primary space
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT10 -> UNIT
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT19 -> SPACE CYL
ST R0,0(,R6) Plug into ptr list
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Dataset INDATASET
*
* Equivalent JCL:
* //SYS00000 DD DISP=SHR,DSNAME=indataset
*
DYN600 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
MVC TXT13,TXT13D
*
MVI TXT03+6,X'08' set DISP=SHR
MVC TXT13(2),=Y(DALRTORG) set RETURN DSORG
*
LA R0,TXT01 -> return DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=SHR
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT13 -> DSORG
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSNAME
ST R0,0(,R6) Plug into ptr list
*
DYN610 EQU *
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Dataset NETSPOOL
*
* Equivalent JCL:
* //NETSPOOL DD DISP=SHR,DSNAME=NJE38.NETSPOOL
*
*
DYN700 EQU *
MVC TXT01,TXT01D Init from the models
MVC TXT02,TXT02D
MVC TXT03,TXT03D
*
MVC TXT01(2),=Y(DALDDNAM) Use fixed DD
MVI TXT03+6,X'08' set DISP=SHR
*
LA R0,TXT01 -> DDNAME
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT03 -> DISP=SHR
ST R0,0(,R6) Plug into ptr list
LA R6,4(,R6) -> next ptr list slot
LA R0,TXT02 -> DSNAME
ST R0,0(,R6) Plug into ptr list
*
OI 0(R6),X'80' End the parameter list
B DYN900 Go allocate
*
*-- Allocate the dataset
*
DYN900 EQU *
LA R1,LS99RB -> S99RB
USING S99RB,R1
OI S99FLAG1,S99NOCNV FORCE NEW ALLOCATION
DROP R1
LA R1,LS99PTR POINTER TO S99 PTR
SVC 99 ISSUE DYNALLOC
LTR R15,R15 Any errors?
BZ XITDYN00 No
*
LA R1,LS99RB
USING S99RB,R1
UNPK TWRK(9),S99ERROR(5) Add zones to error code
L R4,S99ERROR Error code in R4 for later v200
DROP R1
TR TWRK(8),HEXTRAN-240
CLI TWRK+1,C'7' Class 7 error code?
BNE ERR012 No
LA R1,DYNINMCP Code for the INMCOPY dataset?
CR R1,R5 Was alloc for DYNINMCP?
BE ERR027 Yes, dataset exists
LA R1,DYNFINAL Code for the final dataset?
CR R1,R5 Was alloc for DYNFINAL?
BE ERR027 Yes, dataset exists
LA R1,DYNINDS Code for the INDATASET?
CR R1,R5 Was alloc for DYNINDS?
BE ERR031 Yes, dataset does not exist
*
ERR012 EQU *
MVC LIST(4+L'MSG012T),MSG012 Dyn alloc failure msg
MVC LIST+21(8),TWRK Error codes to line
MVC LIST+35(44),TDSNAME Move DSNAME
LA R2,LIST -> msg
BAL R14,PUTLINE Display it
CLM R4,12,=X'0218' volume conflict/invalid? v200
BE ERR033 Yes v200
CLM R4,12,=X'021C' Unit undefined? v200
BE ERR034 Yes v200
B XITDYN08 General allocation failure
*
ERR027 EQU *
MVC LIST,BLANKS
MVC LIST+4(9),=C'Dataset '''
MVC LIST+13(44),TDSNAME Move name
TRT LIST+13(45),BLANK Look for end of name
MVI 0(R1),C'''' Close apost
LA R1,1(,R1) Skip apost
MVC 0(L'MSG027T,R1),MSG027T Move rest of msg
LA R1,L'MSG027T(,R1) point to end
XC LIST(4),LIST Clear RDW area
LA R2,LIST -> start of RDW+msg
SR R1,R2 Compute total length
STH R1,LIST Plug RDW
BAL R14,PUTLINE Inform user
B XITDYN04 And exit with dataset exists
*
ERR031 EQU *
MVC LIST,BLANKS
MVC LIST+4(9),=C'Dataset '''
MVC LIST+13(44),TDSNAME Move name
TRT LIST+13(45),BLANK Look for end of name
MVI 0(R1),C'''' Close apost
LA R1,1(,R1) Skip apost
MVC 0(L'MSG031T,R1),MSG031T Move rest of msg
LA R1,L'MSG031T(,R1) point to end
XC LIST(4),LIST Clear RDW area
LA R2,LIST -> start of RDW+msg
SR R1,R2 Compute total length
STH R1,LIST Plug RDW
BAL R14,PUTLINE Inform user
B XITDYN04 And exit with dataset doesnt exist
*
ERR033 EQU * v200
LA R2,MSG033 -> msg (inv unit/volser combo) v200
BAL R14,PUTLINE Display it v200
B XITDYN08 v200
*
ERR034 EQU * v200
LA R2,MSG034 -> msg (undefined unit) v200
BAL R14,PUTLINE Display it v200
B XITDYN08 v200
*
*
*-- Exit
*
XITDYN00 EQU *
SR R15,R15 Set RC=0; alloc/dealloc ok
B XITDYN
*
XITDYN04 EQU *
LA R15,4 Set RC=4; Exit for special action
B XITDYN
*
XITDYN08 EQU *
LA R15,8 Set RC=8; allocation error
*
XITDYN EQU *
L R13,4(,R13) -> prev s.a.
ST R15,16(,R13) Set RC
LM R14,R12,12(R13) Reload callers regs
BR R14 Return with RC
*
LTORG
DROP R7 INMFIELD
*
*
*
*-- Text unit skeletons
*
*-- Note: EXPDT is included for completeness but is not used.
*
*
*
TXT01D DC Y(DALRTDDN),AL2(1),AL2(8) RETURN DDNAME
TXT02D DC Y(DALDSNAM),AL2(1),AL2(44) DSNAME
TXT03D DC Y(DALSTATS),AL2(1),AL2(1),X'04' DISP=(NEW,)
TXT04D DC Y(DALNDISP),AL2(1),AL2(1),X'02' DISP=(,CATLG)
TXT05D DC Y(DALBLKLN),AL2(1),AL2(3) BLK TEXT KEY, BLKLEN
TXT06D DC Y(DALPRIME),AL2(1),AL2(3) PRIMARY SPACE UNITS
TXT07D DC Y(DALSECND),AL2(1),AL2(3) SECONDARY SPACE UNITS
TXT08D DC Y(DALDIR),AL2(1),AL2(3) DIRECTORY BLOCKS
TXT09D DC Y(DALVLSER),AL2(1),AL2(6) VOLSER
TXT10D DC Y(DALUNIT),AL2(1),AL2(8),CL8'SYSDA' UNIT default v200
TXT11D DC Y(DALEXPDT),AL2(1),AL2(5) EXPDT C'YYDDD'
TXT12D DC Y(DALBLKSZ),AL2(1),AL2(2) BLKSIZE
TXT13D DC Y(DALDSORG),AL2(1),AL2(2) DSORG
TXT14D DC Y(DALLRECL),AL2(1),AL2(2) LRECL
TXT15D DC Y(DALRECFM),AL2(1),AL2(1) RECFM
TXT16D DC Y(DALDUMMY),AL2(0) DUMMY
TXT17D DC Y(DALSYSOU),AL2(0) SYSOUT
TXT18D DC Y(DALTERM),AL2(0) TERM
TXT19D DC Y(DALCYL),AL2(0) CYLINDER
TXT20D DC Y(DALCLOSE),AL2(0) FREE=CLOSE
*
UTXTD DC Y(DUNDDNAM),AL2(1),AL2(8) DD for deallocation
*
DS 0F
CPS99RB DS 0XL20 DEFINE INITIAL S99RB
DC AL1(20) LENGTH OF REQ BLOCK
DC AL1(1) VERB CODE: ALLOCATION
DC X'20' FLAGS: NO MOUNTS,OFFLINE VOLS
DC X'00' FLAGS
DC AL2(0) ERROR REASON CODE
DC AL2(0) INFO REASON CODE
DC A(0) ADDR OF TEXT PTRS
DC A(0) ADDR OF RBX
DC AL4(0) MORE FLAGS
* NJE00250
* NJE00250
*********************
* N J E N E T * NJENET determines if NETDATA
* * exists in a spool file and
* Examine NETDATA * examines the INMR02 control
* * record for attributes
*********************
*
NJENET CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJENET'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJENET,R12 NJE00070
USING NJEWK,R10
ST R13,NETSA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NETSA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
LR R15,R0 Copy action code
B FUNC000(R15) Branch into table
*
FUNC000 B PINIT000 00 Process initial ctl records
B PDATA000 04 Process netdata records
B PFLAT000 08 Process flat records
*
*-- Find INMR01 record NET00060
* NET00060
PINIT000 EQU *
LA R0,2 # of bytes to get NET00070
BAL R14,GETBYTES Get length and desc of segment NET00080
MVC CTL,1(R1) Save copy of descriptor byte
* NET00090
CLI CTL,X'E0' Valid 1st control rec indic?v200 NET00100
BE PINIT010 Could be ok v200 NET00110
CLI CTL,X'A0' Valid 1st control rec indic?v200 NET00100
BNE XITNET04 No, its not NETDATA v200 NET00110
* NET00120
PINIT010 EQU * v200
L R2,GBRPS -> phys record position v200
CLC 0(6,R2),INMR01 Peek ahead. INMR01? v200
BNE XITNET04 No, its not NETDATA v200
*
SR R0,R0 NET00130
IC R0,0(,R1) Get segment length byte NET00140
S R0,=F'2' Less 2 we already retrieved NET00150
LR R3,R0 Copy length of control record NET00300
BAL R14,GETBYTES Get control record NET00160
* NET00170
CLC 0(6,R1),INMR01 NETDATA? NET00180
BNE XITNET04 Not NETDATA NET00190
*
LA R15,6 Len of "INMR01" NET00360
AR R1,R15 Skip over that field NET00370
LA R9,INMF01 -> area to hold INMR01 fields
USING INMFIELD,R9
BAL R14,CTL000 Go parse control record
OI FLAGS1,F1INMR01 Indicate fields processed
*
*-- Find INMR02 record NET00060
* NET00200
FINMR02 EQU *
LA R0,2 # of bytes to get NET00210
BAL R14,GETBYTES Get length and desc of segment NET00220
MVC CTL,1(R1) Save copy of descriptor byte
* NET00090
LA R0,CODE1 Control record not indicated
TM CTL,X'20' Is this a control record? NET00100
BZ XITNET08 No, invalid NETDATA NET00110
* NET00260
SR R0,R0 NET00270
IC R0,0(,R1) Get segment length byte NET00280
S R0,=F'2' Less 2 we already retrieved NET00290
LR R3,R0 Copy length of control record NET00300
BAL R14,GETBYTES Get control record NET00310
* NET00320
LA R0,CODE2 INMR02 record not detected
CLC 0(6,R1),INMR02 NETDATA? NET00330
BNE XITNET08 invalid NETDATA NET00190
* NET00350
LA R15,10 Len of "INMR02"+file number word NET00360
AR R1,R15 Skip over those fields NET00370
LA R9,INMF02A -> area to hold INMR02 fields
BAL R14,CTL000 Go parse control record
TM FLAGS2,F2TERM Was a TERM text unit key found?
BO XITNET20 Y, unsupported
OI FLAGS1,F1INMR2A Indicate fields processed
*
*-- Find INMR02 or INMR03 record NET00060
* NET00200
LA R0,2 # of bytes to get NET00210
BAL R14,GETBYTES Get length and desc of segment NET00220
MVC CTL,1(R1) Save copy of descriptor byte
* NET00090
LA R0,CODE3 Control record not indicated
TM CTL,X'20' Is this a control record? NET00100
BZ XITNET08 No, invalid NETDATA NET00110
* NET00260
SR R0,R0 NET00270
IC R0,0(,R1) Get segment length byte NET00280
S R0,=F'2' Less 2 we already retrieved NET00290
LR R3,R0 Copy length of control record NET00300
BAL R14,GETBYTES Get control record NET00310
* NET00320
CLC 0(6,R1),INMR03 Is it INMR03? NET00330
BE IR03 Yes, go there NET00190
LA R0,CODE4 INMR02 record not detected
CLC 0(6,R1),INMR02 Is it INMR02? NET00330
BNE XITNET08 Something wrong; inval NETDATA NET00190
* NET00350
LA R15,10 Len of "INMR02"+file number word NET00360
AR R1,R15 Skip over those fields NET00370
LA R9,INMF02B -> area to hold INMR02 fields
BAL R14,CTL000 Go parse control record
TM FLAGS2,F2TERM Was a TERM text unit key found?
BO XITNET20 Y, unsupported
OI FLAGS1,F1INMR2B Indicate fields processed
*
*-- Find INMR03 record NET00060
* NET00200
FINMR03 EQU *
LA R0,2 # of bytes to get NET00210
BAL R14,GETBYTES Get length and desc of segment NET00220
MVC CTL,1(R1) Save copy of descriptor byte
* NET00090
LA R0,CODE5 INMR03 ctl rec not indicated
TM CTL,X'20' Is this a control record? NET00100
BZ XITNET08 No, invalid NETDATA NET00110
* NET00260
SR R0,R0 NET00270
IC R0,0(,R1) Get segment length byte NET00280
S R0,=F'2' Less 2 we already retrieved NET00290
LR R3,R0 Copy length of control record NET00300
BAL R14,GETBYTES Get control record NET00310
* NET00320
LA R0,CODE6 INMR03 record not detected
CLC 0(6,R1),INMR03 Is it INMR03? NET00330
BNE XITNET08 Something wrong; invalid NETDATA NET00190
* NET00350
IR03 EQU *
LA R15,6 Len of "INMR03" NET00360
AR R1,R15 Skip over those fields NET00370
LA R9,INMF03 -> area to hold INMR02 fields
BAL R14,CTL000 Go parse control record
OI FLAGS1,F1INMR03 Indicate fields processed
B XITNET00 Done
* NET00380
*-- Parse the text unit keys from a control record NET00380
* NET00380
*-- Entry: R3 = length of entire control record NET00380
*-- R15= length of INMRxx header fields to skip over
*-- Exit: Keys identified are parsed an in their respective fields NET00380
* NET00380
CTL000 EQU * NET00390
ST R14,SV14CTL Save return addr
*
CTL010 EQU * NET00390
LA R4,CTL010 Where to return with new segmnt
SR R3,R15 Reduce remaining length NET00400
BNP CTL070 Done with control record segmnt NET00410
LA R7,INMKEYS -> text unit keys table
* NET00420
*-- Look for supported keys NET00430
* NET00440
CTL020 EQU * NET00390
LA R0,CODE7 Inv/unrecognized NETDATA key
CLI 0(R7),X'FF' End of table?
BE XITNET08 Invalid NETDATA key
*
CLC 0(2,R1),0(R7) Look for matching key NET00450
BE CTL030 Got one NET00460
LA R7,KEYLEN(,R7) Bump to next in table
B CTL020 Keep searching
*
CTL030 EQU * NET00390
ICM R15,15,2(R7) -> supporting rtn for key
BNZR R15 Go there if rtn available
* NET00610
*-- Skip over and ignore unsupported/unrecognized keys NET00620
* NET00630
CTL050 EQU *
LA R1,2(,R1) Skip over unrecognized key NET00640
LA R15,2 Remaining length adjust NET00650
SR R0,R0 Clear for IC NET00660
ICM R0,3,0(R1) Get # value NET00670
LA R1,2(,R1) Skip over # value NET00680
LA R15,2(,R15) Remaining length adjust NET00690
BZ CTL010 # was 0; no lengths NET00700
*
LA R4,CTL060 Where to return with new segmnt
SR R3,R15 Reduce remaining length NET00400
BNP CTL070 Done with control record segmnt NET00410
* NET00720
CTL060 EQU * NET00730
SR R14,R14 Clear for ICM NET00710
ICM R14,3,0(R1) Get length field NET00740
LA R1,2(R14,R1) Skip over length and data NET00750
LA R15,2(R14,R15) Remaining length adjust NET00760
BCT R0,CTL060 Do next len/data field pair NET00770
B CTL010 Resume NET00780
* NET00720
*-- Here at end of segment or entire control record. NET00720
*-- We could also be here in the middle of a key (like INMMEMBR) and NET00720
*-- we need to return to the right place after getting the next
*-- segment to continue on.
* NET00720
CTL070 EQU * NET00730
TM CTL,X'40' Was that the final segment?
BO CTL090 Yes, done with control record
*
*-- We need another control record segment
*
ST R0,SVR0CTL Save # value for keys in progres
LA R0,2 # of bytes to get NET00070
BAL R14,GETBYTES Get length and desc of segment NET00080
MVC CTL,1(R1) Save copy of descriptor byte
* NET00090
LA R0,CODE8 Ctl rec segment not detected
TM CTL,X'20' Is this a control record? NET00100
BZ XITNET08 Bad...something wrong NET00110
* NET00120
SR R0,R0 NET00130
IC R0,0(,R1) Get segment length byte NET00140
S R0,=F'2' Less 2 we already retrieved NET00150
LR R3,R0 Copy length of ctl segment NET00300
BAL R14,GETBYTES Get control record segment NET00160
L R0,SVR0CTL Restore # value of the key
SR R15,R15 Clear length adjustment
BR R4 Return to CTL010 or CTL060
* NET00720
CTL090 EQU * NET00730
L R14,SV14CTL Load return addr
BR R14 Done with control record
* NET00790
*-- Handle keys we dont support. NET00800
*-- We look for INMTERM in order to bail out if present.
*-- This is generated by modern TRANSMIT with MSG.
*
TRM000 EQU *
OI FLAGS2,F2TERM Indicate INMTERM discovered
B CTL050 Ignore the text unit key
*
*-- Handle keys we support, as well as those that we will capture NET00800
*-- a value for but not do anything with it (example: creation date).
* NET00810
*- Utility name NET00820
UTL000 EQU * Get utility name NET00830
MVC UTLNAME+2,BLANKS Init receiving field NET00840
LA R6,UTLNAME -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
* NET00870
*- File size NET00880
FSZ000 EQU * File size NET00890
LA R6,FILESIZE -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
* NET00920
*- DSORG NET00930
DSG000 EQU * DSORG NET00940
LA R6,DSORG -> receiving field NET00950
BAL R14,KEY000 Go handle the key NET00960
B CTL010 Scan for next key
*- BLKSIZE NET00970
BLK000 EQU * BLKSIZE NET00980
LA R6,BLKSIZE -> receiving field NET00990
BAL R14,KEY000 Go handle the key NET01000
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
* NET01010
*- LRECL NET01020
LRL000 EQU * LRECL NET01030
LA R6,LRECL -> receiving field NET01040
BAL R14,KEY000 Go handle the key NET01050
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
* NET01060
*- RECFM NET01070
RFM000 EQU * RECFM NET01080
LA R6,RECFM -> receiving field NET01090
BAL R14,KEY000 Go handle the key NET01100
B CTL010 Scan for next key
* NET00870
*- # directory blocks NET00880
DIR000 EQU * File size NET00890
LA R6,DIRBLKS -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
* NET01110
*- FFM NET01120
FFM000 EQU * File mode number NET01130
LA R6,FFM -> receiving field NET01140
BAL R14,KEY000 Go handle the key NET01150
B CTL010 Scan for next key
*
*- Origin timestamp NET00820
FTM000 EQU * NET00830
MVC FTIME+2,BLANKS Init receiving field NET00840
LA R6,FTIME -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Origin node NET00820
FND000 EQU * Get origin node NET00830
MVC FNODE+2,BLANKS Init receiving field NET00840
LA R6,FNODE -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Origin userid NET00820
FUS000 EQU * Get origin userid NET00830
MVC FUSER+2,BLANKS Init receiving field NET00840
LA R6,FUSER -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- To node NET00820
TND000 EQU * Get destination node NET00830
MVC TNODE+2,BLANKS Init receiving field NET00840
LA R6,TNODE -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- To userid NET00820
TUS000 EQU * Get destination userid NET00830
MVC TUSER+2,BLANKS Init receiving field NET00840
LA R6,TUSER -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Version NET00820
VER000 EQU * Get Version info NET00830
MVC FVERS+2,BLANKS Init receiving field NET00840
LA R6,FVERS -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
*
*- Creation date NET00820
CRE000 EQU * NET00830
MVC CREATE+2,BLANKS Init receiving field NET00840
LA R6,CREATE -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- DDNAME NET00820
DDN000 EQU * NET00830
MVC DDNAME+2,BLANKS Init receiving field NET00840
LA R6,DDNAME -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Extended attribute NET00820
ATR000 EQU * NET00830
LA R6,EATTR -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- RECEIVE error code NET00820
ECD000 EQU * NET00830
LA R6,ERRCD -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Expiration date NET00820
EXP000 EQU * NET00830
MVC EXPDT+2,BLANKS Init receiving field NET00840
LA R6,EXPDT -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Last changed date NET00820
LCH000 EQU * NET00830
MVC LCHG+2,BLANKS Init receiving field NET00840
LA R6,LCHG -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
*
*- Last referenced date NET00820
LRF000 EQU * NET00830
MVC LREF+2,BLANKS Init receiving field NET00840
LA R6,LREF -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
* NET00870
*- Size in megabytes NET00880
LSZ000 EQU * File size in MB NET00890
LA R6,LSIZE -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
B CTL010 Scan for next key
* NET00870
*- Number of files NET00880
NMF000 EQU * File size in MB NET00890
LA R6,NUMF -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
* NET00870
*- Record count NET00880
RCT000 EQU * NET00890
LA R6,RECCT -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
BAL R14,ADJ000 Right justify the value NET00910
B CTL010 Scan for next key
* NET00870
*- Secondary space NET00880
SEC000 EQU * NET00890
LA R6,SECND -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
B CTL010 Scan for next key
*
*- Destination timestamp NET00820
TTM000 EQU * NET00830
MVC TTIME+2,BLANKS Init receiving field NET00840
LA R6,TTIME -> receiving field NET00850
BAL R14,KEY000 Go handle the key NET00860
B CTL010 Scan for next key
* NET00870
*- Dataset Type NET00880
TYP000 EQU * Data set type NET00890
LA R6,DSTYPE -> receiving field NET00900
BAL R14,KEY000 Go handle the key NET00910
B CTL010 Scan for next key
* NET01160
* NET01160
*- DSNAME NET01170
DSN000 EQU * DSNAME NET01180
MVC DSNAME+2,BLANKS Init receiving field NET01190
LA R6,DSNAME+2 -> receiving field NET01200
LA R1,2(,R1) Skip over key NET01210
LA R15,2 Remaining length adjust NET01220
SR R0,R0 Clear for IC NET01230
ICM R0,3,0(R1) Get # value NET01240
LA R1,2(,R1) Skip over # value NET01250
LA R15,2(,R15) Remaining length adjust NET01260
BZ CTL010 # was 0; no lengths NET01270
SR R14,R14 Clear for ICM NET01280
* NET01290
DSN020 EQU * NET01300
ICM R14,3,0(R1) Get length field NET01310
BCT R14,DSN030 Adjust for execute NET01320
MVC 0(0,R6),2(R1) executed instr NET01330
DSN030 EX R14,*-6 Move name to receiving field NET01340
LA R1,3(R14,R1) Skip over length and data NET01350
LA R15,3(R14,R15) Remaining length adjust NET01360
LA R6,1(R14,R6) Bump to next qualifier area NET01370
MVI 0(R6),C'.' Add qualifier dot
LA R6,1(,R6) -> next qualifier area
BCT R0,DSN020 Do next len/data field pair NET01380
BCTR R6,0 -> last byte of DSNAME NET01390
MVI 0(R6),C' ' Remove trailing dot
BCTR R6,0 -> prior to trailing '.' NET01390
LA R0,DSNAME+2 -> start of DSNAME NET01400
SR R6,R0 Compute final DSN length NET01410
STCM R6,3,DSNAME Save it NET01420
B CTL010 get next key NET01430
* NET01440
*-- Common routine to break part key/#/len/data elements that have #=1 NET01450
* NET01460
KEY000 EQU * NET01470
LA R1,4(,R1) Skip over key, # NET01480
LA R15,4 Remaining length accum NET01490
SR R5,R5 Clear for IC NET01500
ICM R5,3,0(R1) Get length of name NET01510
STCM R5,3,0(R6) Store actual len in result fld
BZR R14 If no length, done with key
BCT R5,KEY010 Adjust for execute NET01520
MVC 2(0,R6),2(R1) executed instr NET01530
KEY010 EX R5,*-6 Move name to receiving field NET01540
LA R1,3(R5,R1) -> next text unit key NET01550
LA R15,3(R5,R15) Accum length adjustment NET01560
BR R14 Return NET01570
*
*-- Common routine right justify numeric fields of numeric text units NET01450
* NET01460
ADJ000 EQU *
LA R8,8 Max length of value
LH R0,0(,R6) Get length from NETDATA key
SR R8,R0 Compute # bytes of shift
BZR R14 No justification required
SLA R8,3 Turn # bytes into # bits
LM R4,R5,2(R6) Get numeric field
SRDL R4,0(R8) Right justify the number
STM R4,R5,2(R6) Put back justified numeric value
BR R14
*
DROP R9 INMFIELD
*
*
*-- Process data records
*
*-- NOTE! We are using PUT LOCATE mode here, which offers the
*-- flexibility to accomodate RECFM=VS and VBS records when
*-- combined with DCB=BFTEK=A. This can be confusing looking
*-- as it seems the PUT is issued and then the record is built.
*-- However, the PUT is actually writing the previous record
*-- and the last record is written by CLOSE, all per the IBM
*-- data management specification.
*
*-- NOTE! RECFM=U processing requires the length of the record
*-- be stored in DCBLRECL prior to the PUT LOCATE being issued.
*-- But we don't know the length of the record yet, because it
*-- is coming in from the NETDATA in segments. So, we have to
*-- unfortunately use a separate buffer to accumulate the
*-- segments and when complete obtain the total length to
*-- store into DCBLRECL. Then we can issue the PUT. Then
*-- we have to move the data from our segment accumulation
*-- buffer into the PUT LOCATE buffer. Note though, that
*-- if we used PUT MOVE for RECFM=U, the system would
*-- move our data out of the segment buffer; so either way
*-- the data is moved an extra time.
*
PDATA000 EQU *
LA R0,2 # of bytes to get NET00210
BAL R14,GETBYTES Get length and desc of segment NET00220
* NET00230
TM 1(R1),X'20' Is this a control record? NET00240
BO PDATA100 Yes NET00110
*
MVC CTL,1(R1) Save copy of descriptor byte
SR R0,R0 NET00130
IC R0,0(,R1) Get segment length byte NET00140
S R0,=F'2' Less 2 we already retrieved NET00150
LR R3,R0 Copy length of segment NET00300
BAL R14,GETBYTES Get a segment NET00160
LR R4,R1 Copy segment ptr
*
*-- Determine type of record segment
*
TM CTL,X'C0' C0 Complete record?
BO CMP000 Yes
TM CTL,X'80' 80 1st record of segment?
BO FST000 Yes
TM CTL,X'40' 40 last record of segment?
BO LST000 Yes
*
*-- Middle segment
*
MID000 EQU * 00 Handle middle segment
L R1,RBPOS -> next available buffer byte
LR R0,R1 Copy next available ptr v222
S R0,RBUFF Compute len used so far v222
AR R0,R3 Add len of next segment v222
CH R0,NEWDS+(DCBLRECL-IHADCB) will segment fit in buff?v222
BH XITNET24 No. record too large v222
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segement data
LA R1,1(R3,R1) -> next available byte
ST R1,RBPOS Save record position
B PDATA000 Go get some more
*
*-- Complete segment (an entire record)
*
CMP000 EQU *
TM TRECFM,X'C0' Using undefined format?
BO CMPU100 Yes
*
PUT NEWDS Write R1 buffer and get new one
*
TM TRECFM,X'40' Using variable format?
BO CMP010 Yes
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segment data
B PDATA000 Go get some more
*
CMP010 EQU *
LA R0,4(,R3) Copy record length + 4
SLL R0,16 Make RDW = LLZZ
STCM R0,15,0(R1) Plug in RDW
LA R1,4(,R1) Skip over RDW
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segment data
B PDATA000 Go get some more
*
CMPU100 EQU * ** Here if RECFM=U only
STH R3,NEWDS+(DCBLRECL-IHADCB) Set len of output recrd
PUT NEWDS Write R1 buffer and get new one
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segment data
B PDATA000 Go get some more
*
MVCSEG MVC 0(0,R1),0(R4) executed instr
*
*-- First segment of a record
*
FST000 EQU * Handle first segment
TM TRECFM,X'C0' Using undefined format?
BO FSTU100 Yes
*
PUT NEWDS Write R1 buffer and get new one
ST R1,RBUFF Save start addr of buffer
*
TM TRECFM,X'40' Variable records?
BZ FST010 No
LA R1,4(,R1) Leave space for RDW
*
FST010 EQU *
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segment data
LA R1,1(R3,R1) -> next available byte
ST R1,RBPOS Save record position
B PDATA000 Go get some more
*
FSTU100 EQU * ** Here if RECFM=U only
L R1,NEWBLK -> RECFM=U build buffer
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segment data
LA R1,1(R3,R1) -> next available byte
ST R1,RBPOS Save record position
B PDATA000 Go get some more
*
*-- Last segment of a record
*
LST000 EQU * Handle last segment
L R1,RBPOS -> next available buffer byte
LR R0,R1 Copy next available ptr v222
S R0,RBUFF Compute len used so far v222
AR R0,R3 Add len of next segment v222
CH R0,NEWDS+(DCBLRECL-IHADCB) will segment fit in buff?v222
BH XITNET24 No. record too large v222
BCTR R3,0 Adjust for execute
EX R3,MVCSEG Move segment data
LA R1,1(R3,R1) -> next available byte
*
TM TRECFM,X'C0' Using undefined format?
BO LSTU100 Yes
*
L R3,RBUFF -> record start
TM TRECFM,X'40' Variable records?
BZ LST010 No
*
SR R1,R3 Compute record length
LA R0,CODE9 Assume bad segment length v200
CH R1,NEWDS+(DCBLRECL-IHADCB) Chk RDW against LRECL v200
BH XITNET08 It was v200
*
SLL R1,16 Make RDW = LLZZ
STCM R1,15,0(R3) Plug in RDW
SRL R1,16 Make length
*
LST010 EQU *
B PDATA000 Go get some more
*
LSTU100 EQU * ** Here if RECFM=U only
L R2,NEWBLK -> RECFM=U record build area
SR R1,R2 Compute record length
STH R1,NEWDS+(DCBLRECL-IHADCB) Set len of output recrd
LR R3,R1 Copy length to write
*
PUT NEWDS Write prv buffer and get new one
LR R0,R1 -> PUT buffer to R0
LR R1,R3 Length of record
MVCL R0,R2 Move to PUT LOCATE buffer
B PDATA000 Go get some more
*
*-- Control record encountered in data stream
*
PDATA100 EQU *
SR R0,R0 NET00130
IC R0,0(,R1) Get segment length byte NET00140
S R0,=F'2' Less 2 we already retrieved NET00150
LR R3,R0 Copy length of segment NET00300
BAL R14,GETBYTES Get a segment NET00160
*
CLC 0(6,R1),INMR06 Is it INMR06? NET00330
BNE PDATA000 Ignore other control records
B XITNET00 Done
*
*-- Process FLAT FILE not in NETDATA format
*
*-- We've already read the first spool record, in REC.
*-- PUN files: just write 80 byte records.
*-- PRT files: write 133 bytes, always convert to ASA carriage ctl;
*-- the raw data over NJE is always M carriage ctl for PRT.
*
*-- Writing out to DCB NEWDS using MACRF=PL
*
*
*
PFLAT000 EQU *
LA R6,TAGDATA
USING TAG,R6
LA R4,X'40' Assume CC of space 1
B PFLAT030 1st record is already in REC
*
*
*-- Retrieve the spool file records
*
PFLAT010 EQU *
BAL R14,GET000 Get a record
C R15,=F'4' EOF?
BE XITNET00 Yes, were done
LTR R15,R15 Any errors?
BNZ XITNET16 Yes, deal with them
*
PFLAT030 EQU *
TM TAGINDEV,TYPPUN Is this punch data?
BO PFLAT180 Yes
*
*-- Output PRT records with RECFM=A carriage control
*
TM REC,X'03' Immediate cmd CC in record?
BNO PFLAT070 No, this one is the data
*
LA R4,C'0' Space 2 lines
CLI REC,X'13' Is CC character space 2 immed?
BE PFLAT010 Yes
LA R4,C'1' Skip to channel 1
CLI REC,X'8B' Is CC character ch 1 immed?
BE PFLAT010 Yes
LA R4,C'-' Space 3 lines
CLI REC,X'1B' Is CC character space 3 immed?
BE PFLAT010 Yes
LA R4,C'+' Suppress space
CLI REC,X'01' Is CC character write sup imd?
BE PFLAT010 Yes
LA R4,X'40' Otherwise use space 1
B PFLAT010
*
PFLAT070 EQU *
PUT NEWDS Write a line
LR R5,R1 Get new buffer addr
*
STC R4,0(,R5) Set the CC byte
LH R1,NCB1+(NCBRECLN-NCB) Get length of spool record
BCTR R1,0 Less one to skip CC byte
ICM R1,8,BLANKS Set pad char
LA R0,REC+1 -> spool input record skipping
* the M carriage control
LA R14,1(,R5) Where to build output record
LH R15,NEWDS+(DCBLRECL-IHADCB) get len of output recrd area
BCTR R15,0 Less one to skip CC byte
MVCL R14,R0 Move record and pad excess
B PFLAT010 Process another line
*
*-- PUN records
*
PFLAT180 EQU *
PUT NEWDS Write a line
LR R5,R1 Get new buffer addr
*
LH R1,NCB1+(NCBRECLN-NCB) Get length of spool record
ICM R1,8,BLANKS Set pad char
LA R0,REC -> spool input record
LR R14,R5 Where to build output record
LH R15,NEWDS+(DCBLRECL-IHADCB) get len of output recrd area
MVCL R14,R0 Move record and pad excess
B PFLAT010 Process another line
*
*
* NET01580
* NET01580
* NET01580
*-- Request some more bytes of NETDATA formatted data NET01590
* NET01590
*-- Entry: R0 = # of bytes requested (1-255) NET01590
*-- Exit: R1 -> string of bytes obtained NET01590
* NET01660
*-- Uses R0-R1,R5-R8,R14-R15; the caller's values in these NET01660
*-- registers are not preserved across this call.
* NET01660
GETBYTES EQU * NET01670
ST R14,SV14GB Save return addr NET01680
L R5,GBREM Get # bytes remaining in rec buf NET01690
LA R1,BUFF Point to getbytes buffer NET01700
ST R1,GBPOS Set starting position NET01710
*
L R8,GBRBA Get RBA of current position
ST R8,GBPBA Save prior RBA
AR R8,R0 Compute next RBA
ST R8,GBRBA Update RBA if successful
*
LR R8,R0 Requested amount to R8 NET01720
* NET01730
* NET01740
GB010 EQU * NET01750
LTR R5,R5 Any bytes left in phy record? NET01760
BP GB040 Yes, use them first NET01770
* NET01780
BAL R14,GET000 Get a NETDATA record
LTR R15,R15 Any errors?
BNZ GB090 Yes, deal with them
* R0-> length of record read NET01850
LR R5,R0 Num bytes read NET01840
ST R1,GBRPS Reset start of record position NET01880
* NET01890
GB040 EQU * NET01900
LR R7,R8 Assume requested amt avail NET01910
LR R15,R8 Same NET01920
* NET01930
CR R5,R8 Have more than we need? NET01940
BH GB050 Yes, just move requested NET01950
LR R7,R5 Else move what we have NET01960
LR R15,R5 Same NET01970
* NET01980
GB050 EQU * NET01990
LR R0,R7 Save copy of length to move NET02000
L R14,GBPOS -> GB buffer position NET02010
L R6,GBRPS -> input record curr position NET02020
MVCL R14,R6 Move NET02030
* NET02040
ST R14,GBPOS New GB position NET02050
ST R6,GBRPS New phys record curr position NET02060
* NET02070
SR R5,R0 Reduce bytes left in phy record NET02080
SR R8,R0 Reduce requested amt NET02090
BP GB010 We need more, go get it NET02100
* NET02110
ST R5,GBREM Remember whats left in phy rec NET02120
* NET02130
LA R1,BUFF Point to the requested bytes NET02140
L R14,SV14GB Load return addr NET02150
BR R14 Return from getbytes NET02160
* NET01980
GB090 EQU * NET01990
C R15,=F'4' End of file?
BE XITNET12 Yes
B XITNET16 I/O error
*
*-- Exit NETDATA processing
*
XITNET00 EQU *
SR R15,R15 RC=0; NETDATA info filled
B XITNET
*
XITNET04 EQU *
LA R15,4 RC=4; File doesnt lead off w/NETDATA
B XITNET
*
*-- Here if unexpected or unrecognized NETDATA sequences are found
*
*-- There are 8 places that could branch here; they are numbered 1-8
*-- in R0 to indicate how we arrived here "detection code". Used
*-- with the input NETDATA record and byte number this code can
*-- help to locate the offending error.
*
*-- The detection CODEx equates below describe the 8 tests
*
CODE1 EQU 1 Control record not indicated
CODE2 EQU 2 INMR02 record not detected
CODE3 EQU 3 Control record not indicated
CODE4 EQU 4 INMR02 record not detected
CODE5 EQU 5 INMR03 ctl rec not indicated
CODE6 EQU 6 INMR03 record not detected
CODE7 EQU 7 Inv/unrecognized NETDATA key
CODE8 EQU 8 Ctl rec segment not detected
CODE9 EQU 9 Incorrect segment lengths v200
*
*-- Format error msg (MSG003):
*
*Invalid or unsupported NETDATA detected; error code x, record y byte z
*
*-- Note for debugging: the record and byte number displayed point
*-- to the position in the original input at the point of the GETBYTES
*-- call. The error may be at that exact byte or following it for
*-- some reasonable amount (up to 255 bytes). For error codes 1-6 and
*-- code 8, the rec/byte shown is very close and usually exact. For
*-- code 7 errors there is an invalid or unknown text unit key and
*-- the invalid key is somewhere after the rec/byte shown in the
*-- next 255 bytes.
*
*-- For code 9, the record segment lengths exceeded the LRECL v200
*-- (variable length records only). v200
*
XITNET08 EQU *
LR R6,R0 Detection code to R6
*
L R1,GBPBA Get RBA of prior GETBYTES call
SR R0,R0 Clear for divide
D R0,=F'80' Compute input record number
LA R2,1 Load 1
AR R1,R2 Make record number relative to 1
AR R0,R2 Make byte number relative to 1
CVD R1,DBLE Convert
MVC LIST(4+L'MSG003T),MSG003 Build msg
MVC TWRK(12),=X'402020206B2020206B202120' Edit mask
LA R1,TWRK+11 Start of significance
EDMK TWRK(12),DBLE+3 Edit record count
LA R2,TWRK+11 -> last digit of edited number
SR R2,R1 Compute display length
EX R2,MVREC Move edited number to line
LA R1,LIST+67(R2) -> next available byte in line
MVC 0(8,R1),=C' byte xx'
*
CVD R0,DBLE Convert byte position
UNPK 6(2,R1),DBLE Fill in byte #
OI 7(R1),X'F0' Fix sign
*
STC R6,LIST+56 Store detection code
OI LIST+56,X'F0' Add a sign to make display
*
LA R1,8(,R1) Compute end of msg text
LA R2,LIST -> start of msg
SR R1,R2 Compute msg length RDW
STH R1,LIST Set RDW
*
BAL R14,PUTLINE Notify user
LA R15,8 RC=8; Invalid NETDATA detected
B XITNET
*
*-- EOF on NETDATA
XITNET12 EQU *
LA R15,12 RC=12 unexpected EOF
B XITNET
*
*-- Read error on NETDATA
XITNET16 EQU *
LA R15,16 RC=16 Read i/o error
B XITNET
*
*-- INMTERM text unit key detected and it is unsupported
XITNET20 EQU *
LA R15,20 RC=20 INMTERM detected
B XITNET
*
*-- Segmented record pieces are too large for LRECL and exceed v222
*-- the PUT record buffer v222
XITNET24 EQU * v222
LA R15,24 RC=24 record too large v222
B XITNET v222
*
XITNET EQU *
L R13,4(,R13) -> prev s.a.
ST R15,16(,R13) Set RC
LM R14,R12,12(R13) Reload callers regs
BR R14 Return with RC
*
MVREC MVC LIST+66(0),0(R1) executed instr
*
LTORG
* NET02190
* NET02190
*- Control records that we look for and process (others ignored). NET02190
INMR01 DC C'INMR01' Header Control record NET02200
INMR02 DC C'INMR02' File Utility Control record NET02210
INMR03 DC C'INMR03' Data Control record NET02210
INMR06 DC C'INMR06' Trailer Control record NET02210
* NET02220
*- Keys NET02230
INMKEYS DS 0H
INMBLKSZ DC X'0030',AL4(BLK000) Block size
INMCREAT DC X'1022',AL4(CRE000) Creation date
INMDDNAM DC X'0001',AL4(DDN000) DDNAME for the file
INMDIR DC X'000C',AL4(DIR000) Number of directory blocks
INMDSNAM DC X'0002',AL4(DSN000) Name of the file
INMDSORG DC X'003C',AL4(DSG000) File organization
INMEATTR DC X'8028',AL4(ATR000) Extended attribute status
INMERRCD DC X'1027',AL4(ECD000) RECEIVE command error code
INMEXPDT DC X'0022',AL4(EXP000) Expiration date
INMFACK DC X'1026',AL4(0) NO SPT--Originator requested notificat'n
INMFFM DC X'102D',AL4(FFM000) Filemode number
INMFNODE DC X'1011',AL4(FND000) Origin node name or node number
INMFTIME DC X'1024',AL4(FTM000) Origin timestamp
INMFUID DC X'1012',AL4(FUS000) Origin user ID
INMFVERS DC X'1023',AL4(VER000) Origin version num of the data
INMLCHG DC X'1021',AL4(LCH000) Date last changed
INMLRECL DC X'0042',AL4(LRL000) Logical record length
INMLREF DC X'1020',AL4(LRF000) Date last referenced
INMLSIZE DC X'8018',AL4(LSZ000) Data set size in megabytes.
INMMEMBR DC X'0003',AL4(0) NO SPT--Member name list
INMNUMF DC X'102F',AL4(NMF000) Number of files transmitted
INMRECCT DC X'102A',AL4(RCT000) Transmitted record count
INMRECFM DC X'0049',AL4(RFM000) Record format
INMSECND DC X'000B',AL4(SEC000) Secondary space quantity
INMSIZE DC X'102C',AL4(FSZ000) File size in bytes
INMTERM DC X'0028',AL4(TRM000) Data transmitted as a message
INMTNODE DC X'1001',AL4(TND000) Target node name or node number
INMTTIME DC X'1025',AL4(TTM000) Destination timestamp
INMTUID DC X'1002',AL4(TUS000) Target user ID
INMTYPE DC X'8012',AL4(TYP000) Data set type
INMUSERP DC X'1029',AL4(0) NO SPT--User parameter string
INMUTILN DC X'1028',AL4(UTL000) Name of utility program
DC X'FFFF' End of table
KEYLEN EQU 6 Length of key/adcon pair
*
*-- Target fields from INMRxx control records that we recognize:
*
*-- Missing from the list and unsupported:
*-- INMFACK 1-64 bytes, notification string from transmit
*-- INMTERM 0 bytes, data was transmitted as a message
*-- INMUSERP 1-251 bytes, user PARM field string from TRANSMIT/RECEIVE
*
INMFIELD DSECT
UTLNAME DS 0XL8,XL2,CL8 Utility name NET02490
FILESIZE DS 0XL8,XL2,XL8 File size in bytes NET02500
DIRBLKS DS 0XL8,XL2,XL8 #directory blocks NET02500
BLKSIZE DS 0XL8,XL2,XL8 BLKSIZE NET02510
LRECL DS 0XL8,XL2,XL8 LRECL NET02520
RECFM DS 0XL2,XL2,XL2 RECFM NET02530
DSORG DS 0XL2,XL2,XL2 DSORG NET02540
FFM DS 0XL1,XL2,CL1 File mode number NET02550
DSNAME DS 0XL44,XL2,CL44 DSNAME NET02580
FTIME DS 0XL20,XL2,CL20 Origin time stamp NET02580
FNODE DS 0XL8,XL2,CL8 Origin node NET02580
FUSER DS 0XL8,XL2,CL8 Origin userid NET02580
TNODE DS 0XL8,XL2,CL8 Dest node NET02580
TUSER DS 0XL8,XL2,CL8 Dest userid NET02580
TTIME DS 0XL16,XL2,CL16 Destination time stamp NET02580
FVERS DS 0XL8,XL2,XL8 Version NET02580
DDNAME DS 0XL8,XL2,CL8 DDNAME NET02580
CREATE DS 0XL16,XL2,CL16 Creation date NET02580
EATTR DS 0XL1,XL2,CL1 Extended attributes NET02550
ERRCD DS 0XL1,XL2,CL1 Receive error code NET02550
EXPDT DS 0XL16,XL2,CL16 Expiration date NET02580
LCHG DS 0XL16,XL2,CL16 Last Changed date NET02580
LREF DS 0XL16,XL2,CL16 Last Referenced date NET02580
LSIZE DS 0XL4,XL2,XL4 Size of file in MB NET02580
MEMBR DS 0XL8,XL2,CL8 Member name list (1 supported) NET02580
NUMF DS 0XL8,XL2,XL8 Number of files in transmission NET02520
RECCT DS 0XL8,XL2,XL8 Number of records transmitted NET02520
SECND DS 0XL3,XL2,XL3 secondary space qty NET02520
DSTYPE DS 0XL1,XL2,XL1 Data set type NET02520
DS 0H Force to halfword size
INMFSZ EQU *-INMFIELD Size of DSECT
*
* NJE00250
*********************
* N J E P A R * NJEPAR calls IKJPARS to parse
* * the TSO command line parameters.
* TSO Command Line *
* Parse *
* *
*********************
*
* Entry: R0=0 Parse the command line parameters
*
* R0=4 Parse the prompt parameters (change dsname, etc)
* R1 -> Prompt input buffer from PUTGET if R0 = 4.
*
* Exit: R15 = IKJPARS RC
*
NJEPAR CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEPAR'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
STM R14,R12,12(R13) Save Regs NJE00050
LR R12,R15 Base NJE00060
USING NJEPAR,R12 NJE00070
USING NJEWK,R10
ST R13,PARSA+4 SAVE prv S.A. ADDR NJE00080
LA R2,PARSA -> my save area
ST R2,8(,R13) Plug it into prior SA
LR R13,R2
*
*
LR R7,R0 Copy entry action code
LR R6,R1 Copy any passed ptr
*
L R1,CPARMS -> CPPL entry parms
LM R2,R5,0(R1) Get TSO command entry parameters
* R2 -> Command buffer
* R3 -> UPT
* R4 -> PSCB
* R5 -> ECT
*
*-- Build the IKJPARS PPL
*
PARS000 EQU *
LA R8,PPLSTG -> PPL
USING PPL,R8
ST R3,PPLUPT Set UPT addr
ST R5,PPLECT Set ECT addr
LA R3,PARSECB -> parse ECB
ST R3,PPLECB Set it
LA R3,ANSWER -> IKJPARS "answer area"
ST R3,PPLANS Set it
ST R10,PPLUWA Set user work area addr
C R7,=F'4' Process prompt parameters?
BE PARS010 Yes
*
* ** Process command line
ST R2,PPLCBUF Set TSO command buffer addr
L R3,=A(PCLDEFS) -> command parms definitions
ST R3,PPLPCL Set it
B PARS020
*
PARS010 EQU * ** Process prompt parameters
ST R6,PPLCBUF Set PUTGET input buffer addr
L R3,=A(PRMTOPS) -> prompt parms definitions
ST R3,PPLPCL Set it
*
PARS020 EQU *
CALLTSSR EP=IKJPARS,MF=(E,PPLSTG) Parse command line
LTR R0,R15 Any parse errors?
BNZ XITPAR12 Yes
DROP R8 PPL
*
C R7,=F'4' Did we parse prompt parms?
BE PARS200 Yes, examine those
*
*- Examine command line results
L R4,ANSWER -> IKJPARS built PCEs
USING PRDSECT,R4
*
LA R2,FILEPCE -> File #### PCE data
TM 6(R2),X'80' Was file #### specified?
BZ PARS025 No
*
L R3,0(,R2) -> word containing file #
MVC FILEID,0(R3) Save specified spool id #
OI FLAGS3,F3FILEID Indicate file id valid
*
PARS025 EQU *
LA R2,QTPCE -> QUIET PCE
CLC 0(2,R2),=AL2(1) Was QUIET specified?
BNE PARS030 No
OI FLAGS3,F3QUIET+F3NPRMPT Indicate QUIET+NOPROMPT
*
PARS030 EQU *
LA R2,PURPCE -> PURGE/NOPURGE PCE
CLC 0(2,R2),=AL2(2) Was NOPURGE specified?
BNE PARS035 No
NI FLAGS3,255-F3PURGE Indicate no purge
*
PARS035 EQU *
LA R2,PRMTPCE -> PROMPT/NOPROMPT PCE
CLC 0(2,R2),=AL2(2) Was NOPROMPT specified?
BNE PARS040 No
OI FLAGS3,F3NPRMPT Indicate no prompts
*
PARS040 EQU *
LA R2,VOLPCE -> VOLSER PCE
TM 6(R2),X'80' Was VOLSER specified?
BZ PARS050 No
L R3,0(,R2) -> VOLSER string
LH R1,4(,R2) Length of volser
MVC USRVOL,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,MVVOL Move the volser
OI FLAGS3,F3VOLSER Indicate volser valid
*
PARS050 EQU *
LA R2,INDAPCE -> INDATASET PCE
TM 6(R2),X'80' Was INDATASET specified?
BZ PARS080 No
MVC USRINDS,BLANKS Init receiving field
LA R5,USRINDS -> where to place DSN
*
TM 6(R2),X'40' Was dataset name in quotes?
BO PARS060 Y, don't insert prefix
CLC PREFIX,BLANKS Is a prefix available?
BE PARS060 All blank, dont use prefix
*
MVC USRINDS(8),PREFIX Add the prefix
TRT USRINDS,BLANK Look for end of prefix
MVI 0(R1),C'.' Set delim after prefix
LA R5,1(,R1) -> place to put rest of dsn
LA R2,INDAPCE -> INDATASET PCE
*
PARS060 EQU *
L R3,0(,R2) -> INDATASET string
LH R1,4(,R2) Length of DSN
BCTR R1,0 Adjust for execute
EX R1,MVINDS Move the DSN
OI FLAGS3,F3INDS Indicate INDATASET valid
*
PARS070 EQU *
TM 14(R2),X'80' Was INDATASET member specified?
BZ PARS080 No
L R3,8(,R2) -> INDATASET member name
LH R1,12(,R2) Length of member name
MVC USRMEM,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,MVINMEM Move the member name
OI FLAGS3,F3INMEM Indicate INDATASET member valid
*
PARS080 EQU *
LA R2,FDAPCE -> DATASET PCE
TM 6(R2),X'80' Was DATASET specified?
BZ PARS110 No
MVC FINALDS,BLANKS Init receiving field
LA R5,FINALDS -> where to place DSN
*
TM 6(R2),X'40' Was dataset name in quotes?
BO PARS090 Y, don't insert prefix
CLC PREFIX,BLANKS Is a prefix available?
BE PARS090 All blank, dont use prefix
*
MVC FINALDS(8),PREFIX Add the prefix
TRT FINALDS,BLANK Look for end of prefix
MVI 0(R1),C'.' Set delim after prefix
LA R5,1(,R1) -> place to put rest of dsn
LA R2,FDAPCE -> DATASET PCE
*
PARS090 EQU *
L R3,0(,R2) -> DATASET string
LH R1,4(,R2) Length of DSN
BCTR R1,0 Adjust for execute
EX R1,MVINDS Move the DSN
OI FLAGS3,F3DS Indicate DATASET valid
*
PARS100 EQU *
TM 14(R2),X'80' Was DATASET member specified?
BZ PARS110 No
OI FLAGS4,F4MEMINV Indicate MEMBER specified
*
PARS110 EQU * v200
LA R2,UNIPCE -> UNIT PCE v200
TM 6(R2),X'80' Was UNIT specified? v200
BZ PARS120 No v200
L R3,0(,R2) -> UNIT string v200
LH R1,4(,R2) Length of unit name v200
MVC USRUNIT,BLANKS Init receiving field v200
BCTR R1,0 Adjust for execute v200
EX R1,MVUNIT Move the unit v200
OI FLAGS2,F2UNIT Indicate unit valid v200
*
PARS120 EQU * v200
LA R2,DIRPCE -> # dir blocks PCE v200
TM 6(R2),X'80' Was DIR specified? v200
BZ PARS130 No v200
*
L R3,0(,R2) -> word containing # blks v200
MVC USRDIR,0(R3) Save specified # v200
OI FLAGS2,F2DIR Indicate DIR valid v200
*
PARS130 EQU * v200
B XITPAR00 All done
DROP R4 PRDSECT
*
MVVOL MVC USRVOL(0),0(R3) executed instr
MVUNIT MVC USRUNIT(0),0(R3) executed instr v200
MVINDS MVC 0(0,R5),0(R3) executed instr
MVINMEM MVC USRMEM(0),0(R3) executed instr
*
*
*- Examine prompt parameter results
PARS200 EQU *
L R4,ANSWER -> IKJPARS built PCEs
USING PRMSECT,R4
*
PARS220 EQU *
LA R2,ACTPCE -> PURGE/END PCE
CLC 0(2,R2),=AL2(1) Was PURGE specified?
BNE PARS230 No
OI FLAGS4,F4PURGE Indicate purge
*
PARS230 EQU *
CLC 0(2,R2),=AL2(2) Was END specified?
BNE PARS240 No
OI FLAGS4,F4END Indicate END
*
PARS240 EQU *
LA R2,VLPCE -> VOLSER PCE
TM 6(R2),X'80' Was VOLSER specified?
BZ PARS250 No
L R3,0(,R2) -> VOLSER string
LH R1,4(,R2) Length of volser
MVC USRVOL,BLANKS Init receiving field
BCTR R1,0 Adjust for execute
EX R1,MVVOL Move the volser
OI FLAGS4,F4VOLSER Indicate volser valid
*
PARS250 EQU *
LA R2,DAPCE -> DATASET PCE
TM 6(R2),X'80' Was DATASET specified?
BZ PARS280 No
MVC FINALDS,BLANKS Init receiving field
LA R5,FINALDS -> where to place DSN
*
TM 6(R2),X'40' Was dataset name in quotes?
BO PARS260 Y, don't insert prefix
CLC PREFIX,BLANKS Is a prefix available?
BE PARS260 All blank, dont use prefix
*
MVC FINALDS(8),PREFIX Add the prefix
TRT FINALDS,BLANK Look for end of prefix
MVI 0(R1),C'.' Set delim after prefix
LA R5,1(,R1) -> place to put rest of dsn
LA R2,DAPCE -> DATASET PCE
*
PARS260 EQU *
L R3,0(,R2) -> DATASET string
LH R1,4(,R2) Length of DSN
BCTR R1,0 Adjust for execute
EX R1,MVINDS Move the DSN
OI FLAGS4,F4DS Indicate DATASET valid
NI FLAGS3,255-F3DS DATASET from cmd line not valid
*
PARS270 EQU *
TM 14(R2),X'80' Was DATASET member specified?
BZ PARS280 No
OI FLAGS4,F4MEMINV Indicate MEMBER specified
*
PARS280 EQU *
LA R2,UNPCE -> UNIT PCE v200
TM 6(R2),X'80' Was UNIT specified? v200
BZ PARS290 No v200
L R3,0(,R2) -> UNIT string v200
LH R1,4(,R2) Length of unit name v200
MVC USRUNIT,BLANKS Init receiving field v200
BCTR R1,0 Adjust for execute v200
EX R1,MVUNIT Move the unit v200
OI FLAGS2,F2UNIT Indicate unit valid v200
*
PARS290 EQU * v200
LA R2,DRPCE -> # dir blocks PCE v200
TM 6(R2),X'80' Was DIR specified? v200
BZ PARS300 No v200
*
L R3,0(,R2) -> word containing # blks v200
MVC USRDIR,0(R3) Save specified # v200
OI FLAGS2,F2DIR Indicate DIR valid v200
*
PARS300 EQU * v200
B XITPAR00 All done
DROP R4 PRMSECT
*
*-- Exit
*
XITPAR00 EQU *
LA R1,ANSWER -> IKJPARS "answer place"
IKJRLSA (1) Release parsing storage
*
SR R0,R0 Set secondary RC=0;
SR R15,R15 Set RC=0;
B XITPAR
*
XITPAR12 EQU *
LA R15,12 Set RC=12; R0 already set by IKJPARS
B XITPAR
*
XITPAR EQU *
L R13,4(,R13) -> prev s.a.
L R14,12(,R13) Load r14
LM R1,R12,24(R13) Reload callers regs
BR R14 Return with RCs in R0/R15
*
LTORG
*
*-- IKJPARS Description Macros
*
*-- RECEIVE command parms:
*
* RECEIVE #### INDATASET(ddd) VOLSER(vvv) UNIT(uuu) DATASET(iii)
* DIR(nnn)
* PURGE | NOPURGE
* PROMPT | NOPROMPT
* QUIET
*
* Where:
*
* #### if specified must be the first parm, all numeric spool id
* ddd is an optional dataset name to RECEIVE from
* vvv is an optional VOLSER of where to allocate the RECEIVEd data
* uuu is an optional UNIT of where to allocate the RECEIVEd data
* iii is an optional DSNAME to RECEIVE into.
* nnn is an optional number of directory blocks to assign
* PURGE indicates the spool file is purged after RECEIVE (DEFAULT)
* NOPURGE indicates the spool file is retained after RECEIVE
* PROMPT indicates to prompt user for parameters (DEFAULT)
* NOPROMPT no user prompts are issued
* QUIET suppress all informational msgs
*
*
PCLDEFS IKJPARM DSECT=PRDSECT
*
FILEPCE IKJIDENT 'FILE NUMBER', x
MAXLNTH=4,FIRST=NUMERIC,OTHER=NUMERIC, x
INTEG
*
PURPCE IKJKEYWD DEFAULT='PURGE'
IKJNAME PURGE PCE value = 1
IKJNAME NOPURGE PCE value = 2
*
PRMTPCE IKJKEYWD DEFAULT='PROMPT'
IKJNAME PROMPT PCE value = 1
IKJNAME NOPROMPT PCE value = 2
*
QTPCE IKJKEYWD
IKJNAME QUIET PCE value = 1
*
INDSPCE IKJKEYWD
IKJNAME 'INDATASET',SUBFLD=INDSFLD,ALIAS='INDSNAME'
*
FDSPCE IKJKEYWD
IKJNAME 'DATASET',SUBFLD=FDSFLD,ALIAS='DSNAME'
*
VSRPCE IKJKEYWD
IKJNAME 'VOLSER',SUBFLD=VOLSFLD,ALIAS='VOLUME'
*
USRPCE IKJKEYWD , v200
IKJNAME 'UNIT',SUBFLD=UNISFLD,ALIAS=('U') v200
*
DRBPCE IKJKEYWD , v200
IKJNAME 'DIR',SUBFLD=DBSFLD v200
*
INDSFLD IKJSUBF
INDAPCE IKJPOSIT DSNAME, x
PROMPT='THE NAME OF THE DATA SET YOU WANT TO RECEIVE FROx
M'
*
FDSFLD IKJSUBF
FDAPCE IKJPOSIT DSNAME, x
PROMPT='THE NAME OF THE DATA SET YOU WANT TO RECEIVE INTx
O'
*
VOLSFLD IKJSUBF
VOLPCE IKJPOSIT DSTHING,VOLSER, x
PROMPT='THE VOLUME SERIAL OF THE VOLUME WHERE YOU WANT Tx
HE DATASET ALLOCATED'
*
UNISFLD IKJSUBF , v200
UNIPCE IKJIDENT 'UNIT NAME',MAXLNTH=8,FIRST=ALPHANUM, v200x
OTHER=ALPHANUM v200
*
DBSFLD IKJSUBF , v200
DIRPCE IKJIDENT 'DIRECTORY BLOCKS', v200x
MAXLNTH=5,FIRST=NUMERIC,OTHER=NUMERIC, v200x
INTEG v200
*
IKJENDP
*
*-- RECEIVE parameters from prompt:
*
* DATASET(ddd) VOLSER(vvv) UNIT(uuu) DIR(nnn) PURGE/END
*
* Where:
*
* ddd is an alternate dataset name to RECEIVE intp
* vvv is an optional VOLSER of where to allocate the RECEIVEd data
* uuu is an optional UNIT of where to allocate the RECEIVEd data
* nnn is an optional number of directory blocks to assign
* PURGE indicates the spool file is purged immediately and the
* RECEIVE operation is aborted.
* END indicates the RECEIVE operation is aborted with no action.
*
PRMTOPS IKJPARM DSECT=PRMSECT
*
ACTPCE IKJKEYWD DEFAULT=
IKJNAME PURGE PCE value = 1
IKJNAME END PCE value = 2
*
DSPCE IKJKEYWD
IKJNAME 'DATASET',SUBFLD=DAFLD,ALIAS='DSNAME'
*
VSPCE IKJKEYWD
IKJNAME 'VOLSER',SUBFLD=VLFLD,ALIAS='VOLUME'
*
USPCE IKJKEYWD , v200
IKJNAME 'UNIT',SUBFLD=UNFLD,ALIAS=('U') v200
*
DBPCE IKJKEYWD , v200
IKJNAME 'DIR',SUBFLD=DRFLD v200
*
DAFLD IKJSUBF
DAPCE IKJPOSIT DSNAME, x
PROMPT='THE NAME OF THE DATA SET YOU WANT TO RECEIVE INTx
O'
*
VLFLD IKJSUBF
VLPCE IKJPOSIT DSTHING,VOLSER, x
PROMPT='THE VOLUME SERIAL OF THE VOLUME WHERE YOU WANT Tx
HE DATASET ALLOCATED'
*
UNFLD IKJSUBF , v200
UNPCE IKJIDENT 'UNIT NAME',MAXLNTH=8,FIRST=ALPHANUM, v200x
OTHER=ALPHANUM v200
*
DRFLD IKJSUBF , v200
DRPCE IKJIDENT 'DIRECTORY BLOCKS', v200x
MAXLNTH=5,FIRST=NUMERIC,OTHER=NUMERIC, v200x
INTEG v200
*
IKJENDP
*
*
IKJPPL
IKJPPLSZ EQU (*-PPL)/4 # words in PPL
*
LTORG
*
* *
***********************************************************************
** **
** TASK ESTAE EXIT **
** **
** This csect handles all abends trapped by ESTAE during the normal **
** execution of the subtask. This exit does not attempt **
** any recovery other than to terminate processing. **
** An SVC dump is taken on abends. **
** **
** On entry: R0=ESTAE provide entry code **
** R1=SDWA address **
** R2=parameter passed on ESTAE macro **
** **
** **
** On exit: If SDWACLUP is 1, then no retry is allowed and this **
** exit will allow percolation back to system routines **
** to terminate the task. **
** **
** If SDWACLUP is 0, then retry is allowed. **
** **
** Security: N/A. **
** **
** Register usage: **
** **
** R1 = SDWA address **
** R3 = SDWA address **
** R10 = Dynamic storage area base **
** R12 = This program base **
** **
** **
** **
***********************************************************************
*
NJEDMP CSECT
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDMP'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
*
LR R12,R15 SET UP BASE REG
USING NJEDMP,R12 ESTABLISH ADDRESSABILITY
LR R8,R14 SAVE RETURN ADDRESS TO SYSTEM
*
L R10,0(,R1) GET VALUE PASSED TO US (WORKA)
USING NJEWK,R10
L R11,=A(NJECOM) -> common csect
USING NJECOM,R11
*
LR R3,R1 SAVE R1 ENTRY CONTENTS
USING SDWA,R3
LR R5,R0 Save R0 entry code
*
LTR R3,R3 Do we have an SDWA?
BZ NOSDWA Exit if no SDWA
LA R13,MVSSAVE Save area
ESTAE 0
*
MODESET MODE=SUP, Run this ESTAI exit privileged x
KEY=ZERO to access PSW -> storage
*
MVC MACLIST(WTOMSGL),WTOMSG
L R6,PSATOLD-PSA(0) -> my TCB
L R5,TCBTIO-TCB(,R6) -> TIOT
MVC MACLIST+9(8),0(R5) Plug in job name
MVC MACLIST+4(4),=C'USER'
MVC MACLIST+19(7),=C'RECEIVE' Plug in command name
*
*
LNK020 EQU *
MVC MACLIST+29(5),=C'ABEND'
L R5,SDWAABCC GET ABEND CODE INFO WORD
N R5,=X'00FFF000' KEEP ONLY THE SYSTEM CODE
BZ USERCDE NONE THERE, MUST BE A USER CODE
SRL R5,12 Put sys code in low order v201
C R5,=X'00000222' Operator cancel, no dump? v201
BE SDUMP040 Yes, suppress dump
CLM R5,1,=X'3E' Was it an x3E (DETACH) ? v201
BE SDUMP040 Yes, suppress dump v201
*
MVI MACLIST+35,C'S' INDICATE SYSTEM CODE
UNPK FWORK(5),SDWACMPC(3) GET SYSTEM CMP CODE
TR FWORK(3),HEXTRAN-240
MVC FWORK+3(5),=CL5' ' CLEAR REST OF ABEND CODE
B NOREAS
*
USERCDE EQU *
MVI MACLIST+35,C'U' INDICATE USER ABEND CODE
L R5,SDWAABCC GET ABEND CODE
N R5,=X'00000FFF' KEEP USER ABEND CODE
CVD R5,FSAVE CONVERT CODE TO DECIMAL
UNPK FWORK(4),FSAVE UNPK THE CODE
OI FWORK+3,X'F0' FIX SIGN
MVC FWORK+4(2),=CL2' ' BLANKS AT END OF ABEND CODE
*
NOREAS EQU *
MVC MACLIST+36(6),FWORK MOVE ABEND-REASON TO LINE
MVC ABCODE,MACLIST+36 Save a copy of formatted abcode
*
WTO ,MF=(E,MACLIST) Write to console
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(3),=C'PSW'
UNPK FSAVE(9),SDWAEC1(5) Add zones to PSW word 1
TR FSAVE(8),HEXTRAN-240
MVC MACLIST+10(8),FSAVE
UNPK FSAVE(9),SDWAEC1+4(5) Add zones to PSW word 2
TR FSAVE(8),HEXTRAN-240
MVC MACLIST+19(8),FSAVE
*
SR R5,R5 CLEAR FOR IC
IC R5,SDWAILC1 GET THE ILC
CVD R5,FWORK MAKE DECIMAL
MVC MACLIST+29(3),=C'ILC'
UNPK MACLIST+33(2),FWORK UNPK
OI MACLIST+34,X'F0' FIX THE SIGN
*
MVC MACLIST+37(4),=C'INTC'
UNPK FWORK(5),SDWAINC1(3) MAKE INTC DISPLAYABLE
TR FWORK(4),HEXTRAN-240
MVC MACLIST+42(4),FWORK MOVE INTC TO LINE
*
WTO ,MF=(E,MACLIST)
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(13),=C'DATA NEAR PSW'
MVC MACLIST+19(8),=CL8'UNAVAIL' ASSUME WE CANT GET DATA
L R4,SDWAEC1+4 Get PSW IA
LA R4,0(,R4) Clear high bit
C R4,=F'8' 1st 8 bytes of storage?
BH LOC010 No, its higher than that
SR R4,R4 Yes, just use 0
B LOC020
*
LOC010 EQU *
S R4,=F'8' BACK UP BEFORE INTERRUPT ADDR
*
LOC020 EQU *
LRA R0,0(,R4) Do we have access?
BNZ UNAVAIL No translation, better not
LRA R0,14(,R4) Do we have access?
BNZ UNAVAIL No translation, better not
*
ST R4,FWORK SAVE FOR CONVERSION
UNPK FSAVE(9),FWORK(5) ADD ZONES TO ADDRESS
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+19(8),FSAVE MOVE DISPLAYABLE
*
MVC FWORK(4),0(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+29(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),4(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+38(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),8(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+47(8),FSAVE MOVE TO LINE
*
MVC FWORK(4),12(R4) MOVE 4 WORDS AT PSW
UNPK FSAVE(9),FWORK(5) ADD ZONES
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC MACLIST+56(8),FSAVE MOVE TO LINE
*
UNAVAIL EQU *
WTO ,MF=(E,MACLIST)
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
*----
LA R4,4 4 ROWS OF REGISTERS
LA R5,SDWAGR00 POINT TO ABEND REGS
LA R6,REGLIST POINT TO REGISTER ID LITERALS
*
REG000 EQU *
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(8),0(R6) MOVE REGISTERS ID
LA R15,MACLIST+13 WHERE 1ST REG GOES ON LINE
LA R14,4 4 REGS PER LINE
*
REG010 EQU *
UNPK FSAVE(9),0(5,R5) UNPK A REGISTER
TR FSAVE(8),HEXTRAN-240 MAKE DISPLAYABLE HEX
MVC 0(8,R15),FSAVE MOVE TO THE LINE
LA R15,10(,R15) NEXT SPOT ON PRINT LINE
LA R5,4(,R5) NEXT REGISTER
BCT R14,REG010 KEEP DOING REGS
WTO ,MF=(E,MACLIST)
LA R2,MACLIST
BAL 14,PUTLINE Echo to TSO terminal
LA R6,8(,R6) NEXT REGISTER ID
BCT R4,REG000 GO DISPLAY THE NEXT ROW
*
*
SDUMP000 EQU *
L R5,SDWAABCC Get abend code info word
N R5,=X'00FFF000' Keep only the system code
SRL R5,12 Right justify the code
C R5,=X'00000222' Operator cancel, no dump?
BE SDUMP040 Yes, skip dump
CLM R5,1,=X'37' x37 abend code?
BE SDUMP040 Skip the dump
*
MVI DHDR,C' '
MVC DHDR+1(29),DHDR
MVI DHDR,29 IBM length of header
L R5,PSATOLD-PSA(0) -> my TCB
L R5,TCBTIO-TCB(,R5) -> TIOT
MVC DHDR+1(8),0(R5) Use jobname in description
MVC DHDR+11(7),=C'RECEIVE' Use command name
MVC DHDR+21(7),ABCODE
*
MVC MACLIST(SDUMPL),SDUMP MOVE SDUMP LIST TO WORK
LA R1,MACLIST
SDUMP HDRAD=DHDR, ISSUE SDUMP TO RECORD STATUS x
BUFFER=NO, x
QUIESCE=NO, x
SDATA=(RGN,CSA,LPA,SUM), x
MF=(E,(1))
*
*
SDUMP040 EQU *
*
SDUMP090 EQU *
LR R1,R3 SDWA BACK TO R1
L R15,=A(NJERCV) Main csect addr
ST R15,SDWASRSV+4*R12 Plug it to R12
L R15,=A(EXIT08) -> RECEIVE exit point
*
SETRP RC=4, Retry - try to shut down RECEIVE x
DUMP=NO, Suppress any further dumps x
FRESDWA=YES, Free the SDWA x
RETREGS=YES, Restore original regs x
RETADDR=(15) Return to Receive exit point
*
NOSDWA EQU * ** NO RETRY AVAILABLE (OR DESIRED)
SR R15,R15 REQUEST PERCOLATION
LR R14,R8 RESTORE RETURN ADDRESS
BR R14 RETURN TO SYSTEM
*
LTORG
*
SDUMP SDUMP MF=L
SDUMPL EQU *-SDUMP
*
REGLIST DC CL8'GR 0-3'
DC CL8'GR 4-7'
DC CL8'GR 8-11'
DC CL8'GR 12-15'
*
WTOMSG WTO ' x
',MF=L
WTOMSGL EQU *-WTOMSG
*
LTORG
*
*
**** Main work area common NJE00290
**** to all NJExxx CSECTs. NJE00290
* NJE00290
NJEWK DSECT
NJEEYE DS CL4'NJER' Eyecatcher
NJEWKLEN DS F Getmain size of this area
*
DBLE DS D Work area NJE00310
TWRK DS 2D Work area
LCLNODE DS CL8 Local node id
DEFUSER DS CL8 Default 'no security' userid
USERID DS CL8 TSO Userid
PREFIX DS CL8 TSO PREFIX
*
*
MACLIST DS CL96 Macro expansion area
STAXLIST DS CL20 STAX parameter list
* NET02360
CPARMS DS A -> input CPPL (entry parms)
PUTECB DS F ECB for PUTLINE/PUTGET
IOPLAREA DS 4A IOPL for PUTLINE/PUTGET
DEVINFO DS A -> Entry selected from disks tbl
SV14CTL DS A R14 save area NET02370
SV14GB DS A R14 save area NET02370
SV14GET DS A R14 save area NET02370
SV14LN DS A R14 save area NET02370
SV14PUR DS A R14 save area NET02370
SVR0CTL DS F R0 save of # value for a key NET02370
*
GBREM DS F # bytes remaining in phys rec NET02380
GBPOS DS A -> current position in BUFF NET02390
GBRPS DS A -> current position in phys rec NET02400
GBRBA DS F for debug RBA of last GETBYTES call NET02400
GBPBA DS F for debug RBA of prior GETBYTES call NET02400
RBUFF DS A -> Record build area
RBPOS DS A -> current position in RBUFF NET02390
*
BLOCKLEN DS F Length of block buffer
BLOCK DS A -> Block of physical records
NEWLEN DS F Length of NEWDS RECFM=U buffer
NEWBLK DS A -> NEWDS RECFM=U build buffer
*
OLD DS F For PUTGET, # segments
OLDMSGAD DS A -> msg len/text
*
PARSECB DS F IKJPARS ECB
ANSWER DS F IKJPARS Answer area
PPLSTG DS (IKJPPLSZ)A Space for PPL
FILEID DS F User specified spool id #
USRDIR DS F User specified # of dir blks v200
USRVOL DS CL6 User specified VOLSER
USRUNIT DS CL8 User specified UNIT name v200
USRINDS DS CL44 User specified INDATASET
USRMEM DS CL8 User specified INDATASET member
FINALDS DS CL44 Final dataset name
*
*
FLAGS1 DS X Flag bits
F1INMR01 EQU X'80' 1... .... INMR01 fields processed
F1INMR2A EQU X'40' .1.. .... 1st INMR02 fields processed
F1INMR2B EQU X'20' ..1. .... 2nd INMR02 fields processed
F1INMR03 EQU X'10' ...1 .... INMR03 fields processed
F1BATCH EQU X'08' .... 1... Running in BATCH TSO
F1ACEE EQU X'04' .... .1.. Security is available on system
F1AUSR EQU X'02' .... ..1. Special user
F1APF EQU X'01' .... ...1 Authorized at invocation
*
FLAGS2 DS X Flag bits
F2NETOPN EQU X'80' 1... .... NETDATA DCB open
F2NCBOPN EQU X'40' .1.. .... NETSPOOL NCB open
F2NEWOPN EQU X'20' ..1. .... NEWDS DCB open
F2TERM EQU X'10' ...1 .... INMTERM text unit detected
F2DIR EQU X'08' .... 1... DIR (CMD -OR- PROMPT) spec. v200
F2FLAT EQU X'04' .... .1.. Incoming file is a flat file
F2UNIT EQU X'02' .... ..1. UNIT (CMD -OR- PROMPT) spec.v200
F2FEND EQU X'01' .... ...1 Force END in batch after 1st pmt
* .... .... available bits
*
FLAGS3 DS X Flag bits from CMD line parse
F3FILEID EQU X'80' 1... .... Spool file id specified
F3PURGE EQU X'40' .1.. .... 1=PURGE, 0=NOPURGE
F3VOLSER EQU X'20' ..1. .... VOLSER specified
F3INDS EQU X'10' ...1 .... INDATASET specified
F3INMEM EQU X'08' .... 1... INDATASET MEMBER specified
F3DS EQU X'04' .... .1.. DATASET specified
F3NPRMPT EQU X'02' .... ..1. NOPROMPT was specified
F3QUIET EQU X'01' .... ...1 QUIET was specified
*
FLAGS4 DS X Flag bits from prompt parse
F4MEMINV EQU X'80' 1... .... DATASET MEMBER specified (inval)
F4PURGE EQU X'40' .1.. .... PURGE (delete spool file & exit)
F4VOLSER EQU X'20' ..1. .... VOLSER specified
F4DS EQU X'10' ...1 .... DATASET specified
F4END EQU X'08' .... 1... END (take no action and exit)
F4ATTN EQU X'01' .... ...1 User pressed ATTN key v201
* .... .xx. available bits
* NET02470
INMF01 DS (INMFSZ)X Fields from INMR01 record
INMF02A DS (INMFSZ)X Fields from 1st INMR02 record
INMF02B DS (INMFSZ)X Fields from 2nd INMR02 record
INMF03 DS (INMFSZ)X Fields from INMR03 record
* NET02590
DS 0F
BUFF DS CL256 GB buffer containing request data NET02600
LIST DS CL133 Print line v200
REC DS CL133 Physical record from spool
*
*----
LS99PTR DS A PTR TO S99RB
LS99RB DS XL20 SPACE FOR S99RB
*
TXTPTRS DS 15A -> Text unit ptr list
*
DS 0H
UTXT DS 0XL06,Y,AL2,AL2 DDNAME Unallocation
UDDNAME DS CL8 DDNAME
*
DS 0H
TXT01 DS 0XL06,Y,AL2,AL2 Return DDNAME
TDDNAME DS CL8 DDNAME
*
DS 0H
TXT02 DS 0XL06,Y,AL2,AL2 DSN=
TDSNAME DS CL44 DSNAME
*
DS 0H
TXT03 DS 0XL07,Y,AL2,AL2,X DISP=(NEW,
*
DS 0H
TXT04 DS 0XL07,Y,AL2,AL2,X DISP=(,CATLG)
*
DS 0H
TXT05 DS 0XL06,Y,AL2,AL2 SPACE BLOCK LEN
TBLKLEN DS XL3 BLKLEN
*
DS 0H
TXT06 DS 0XL06,Y,AL2,AL2 SPACE PRIMARY
TPRIME DS XL3 Primary
*
DS 0H
TXT07 DS 0XL06,Y,AL2,AL2 SPACE SECONDARY
TSECND DS XL3 Secondary
*
DS 0H
TXT08 DS 0XL06,Y,AL2,AL2 SPACE DIRECTORY BLOCKS
TDIRBLKS DS XL3 DIR BLKS
*
DS 0H
TXT09 DS 0XL06,Y,AL2,AL2 VOLUME
TVOLSER DS CL6 VOLSER
*
DS 0H
TXT10 DS 0XL14,Y,AL2,AL2 UNIT v200
TUNIT DS CL8 UNITNAME v200
*
DS 0H
TXT11 DS 0XL06,Y,AL2,AL2 EXPDT
TEXPDT DS CL5 EXPDT=yyddd
*
DS 0H
TXT12 DS 0XL06,Y,AL2,AL2 BLKSIZE
TBLKSIZE DS XL2 BLKSIZE
*
DS 0H
TXT13 DS 0XL06,Y,AL2,AL2 DSORG
TDSORG DS XL2 DSORG
*
DS 0H
TXT14 DS 0XL06,Y,AL2,AL2 LRECL
TLRECL DS XL2 LRECL
*
DS 0H
TXT15 DS 0XL06,Y,AL2,AL2 RECFM
TRECFM DS XL1 RECFM
*
DS 0H
TXT16 DS 0XL04,Y,AL2 DUMMY
*
DS 0H
TXT17 DS 0XL04,Y,AL2 SYSOUT
*
DS 0H
TXT18 DS 0XL04,Y,AL2 TERM
*
DS 0H
TXT19 DS 0XL04,Y,AL2 CYLINDER
*
DS 0H
TXT20 DS 0XL04,Y,AL2 FREE=CLOSE
*---
*
CTL DS X Segment descriptor byte
*
*
DS 0F
TAGDATA DS XL108 TAG data area
TYPPRT EQU X'40' PRT dev
TYPPUN EQU X'80' PUN dev
*
NCB1 DS XL48 NCB for Spool Access
NETDATA DS (DMYNPSL)X NETDATA DCB
NEWDS DS (DMYSEQL)X New dataset DCB
DECB DS (READL)X DECB for NETDATA
*
CPYPLIST DS XL(COPYPRML) IEBCOPY PARM FIELD
*
DS 0H
DDLISTL DS AL2(DDLISTSZ) DDNAME LIST LENGTH
DDLIST DS 4XL8'00' FOUR DDNAMES UNDEFINED
DDSYSIN DS CL8 DDNAME representing IEBCOPY's SYSIN
DDSYSPR DS CL8 DDNAME representing IEBCOPY's SYSPRINT
DS XL8'00' UNDEFINED DD
DDSYSUT1 DS CL8 DDNAME of ds created by INMRCOPY INMR02 (SYSUT1)
DDSYSUT2 DS CL8 DDNAME representing IEBCOPY's SYSUT2
DDSYSUT3 DS CL8 DDNAME representing IEBCOPY's SYSUT3
DS XL8'00' SYSUT4 UNUSED
DDLISTSZ EQU *-DDLIST LENGTH OF DDLIST for IEBCOPY
DDNETDAT DS XL8'00' INDATASET DDNAME
DDNETSPL DS XL8'00' NETSPOOL DDNAME
UNLISTSZ EQU *-DDLIST TOTAL of all DDs in list
*
*-- ESTAE exit used areas
*
FSAVE DS 2D
FWORK DS D
DHDR DS CL30
ABCODE DS CL7
MVSSAVE DS 18F ESTAE exit OS save
*-- End of ESTAE area
*
*
NJESA DS 18F NJERCV OS save area NJE00300
NETSA DS 18F NJENET OS save area NJE00300
DYNSA DS 18F NJEDYN OS save area NJE00300
PARSA DS 18F NJEPAR OS save area NJE00300
NOTSA DS 18F NJENOT OS save area NJE00300
*
DS 0D Force doubleword size
NJEWKSZ EQU *-NJEWK
* NJE00930
CVT DSECT=YES,PREFIX=NO
IEFZB4D0
IEFZB4D2
DCBD DSORG=PS,DEVD=DA
*
IEFUCBOB DSECT
IEFUCBOB LIST=YES
IHAPSA
IKJTCB
IHASDWA
IEFTIOT DSECT
IEFTIOT1
IHAASCB
IHAASXB
IKJUPT
IKJCPPL
IKJPGPB
IKJIOPL
*
ACEE DSECT Maps a portion of ACEE in MVS3.8
ACEEEYE DS CL4'ACEE'
DS 16X
ACEEUSRL DS X Length of userid
ACEEUSR DS CL8 Userid
*
COPY NETSPOOL NJE00940
COPY TAG
*
END NJERCV NJE01000
@@
//*
//* These steps will assemble all components of NJE38 and link it
//* into SYSGEN.NJE38.AUTHLIB
//*
//* All steps should receive COND CODE 0
//*
//ASSEM PROC R=RENT,M=
//ASSEMBLE EXEC PGM=IFOX00,REGION=4096K,
// PARM=('XREF(FULL),OBJ,SYSPARM((ON,GEN,NODATA,YES,YES))',
// 'NODECK,&R')
//SYSLIB DD DSN=SYSGEN.NJE38.MACLIB,DISP=SHR,DCB=BLKSIZE=32720
// DD DSN=SYS1.SMPMTS,DISP=SHR
// DD DSN=SYS1.SMPSTS,DISP=SHR
// DD DSN=SYS1.MACLIB,DISP=SHR
// DD DSN=SYS1.AMODGEN,DISP=SHR
//SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1700,(5600,500))
//SYSUT2 DD DSN=&&SYSUT2,UNIT=SYSDA,SPACE=(1700,(1300,500))
//SYSUT3 DD DSN=&&SYSUT3,UNIT=SYSDA,SPACE=(1700,(1300,500))
//SYSPRINT DD SYSOUT=*
//SYSPUNCH DD SYSOUT=B
//SYSGO DD DSN=&&NJE38OBJ(&M),DISP=(MOD,PASS),
// SPACE=(800,(2000,1000,10)),UNIT=SYSDA
//SYSIN DD DSN=SYSGEN.NJE38.ASMSRC(&M),DISP=SHR
// PEND
//* ***********************************
//* EXEC ASSEM,M=NJEINIT,R=RENT
//* EXEC ASSEM,M=NJECMX,R=RENT
//* EXEC ASSEM,M=NJEDRV,R=RENT
//* EXEC ASSEM,M=NJEFMT,R=RENT
// EXEC ASSEM,M=NJERCV,R=RENT
//* EXEC ASSEM,M=NJERLY,R=RENT
//* EXEC ASSEM,M=NJESCN,R=RENT
// EXEC ASSEM,M=NJESPOOL,R=RENT
// EXEC ASSEM,M=NJESYS,R=RENT
// EXEC ASSEM,M=NJETRN,R=RENT
//* EXEC ASSEM,M=NJE38,R=RENT
//* EXEC ASSEM,M=NJ38RECV,R=RENT
//* EXEC ASSEM,M=NJ38XMIT,R=RENT
//* EXEC ASSEM,M=DMTXJE,R=NORENT
//* EXEC ASSEM,M=DMTMSG,R=RENT
//* ***********************************
//*
//LKCMDLIB EXEC PGM=IEWL,PARM='XREF,LET,LIST,NCAL,RENT',COND=(4,LT)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1024,(50,20))
//SYSLMOD DD DSN=SYS2.CMDLIB,DISP=SHR
//NJEOBJ DD DSN=&&NJE38OBJ,DISP=(OLD,PASS)
//SYSLIN DD *
ORDER NJERCV(P)
INCLUDE NJEOBJ(NJERCV)
INCLUDE NJEOBJ(NJESYS)
INCLUDE NJEOBJ(NJESPOOL)
ENTRY NJERCV
SETCODE AC(1)
ALIAS RECV
NAME RECEIVE(R)
ORDER NJETRN(P)
INCLUDE NJEOBJ(NJETRN)
INCLUDE NJEOBJ(NJESYS)
INCLUDE NJEOBJ(NJESPOOL)
ENTRY NJETRN
SETCODE AC(1)
ALIAS XMIT
NAME TRANSMIT(R)
//*
//* Edit SYS1.UMODSRC(IKJEFTE2) Adding NJE38 programs
//* that need auth
//*
//EDITUMOD EXEC PGM=IKJEFT01,REGION=1024K,DYNAMNBR=50
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTERM DD SYSOUT=*
//SYSTSIN DD *
EDIT 'SYS1.UMODSRC(IKJEFTE2)' DATA
LIST
TOP
FIND /TERMINATOR/
UP
INSERT DC C'RECEIVE ' NJE38 RECEIVE
INSERT DC C'RECV ' NJE38 RECEIVE Alias
INSERT DC C'TRANSMIT' NJE38 TRANSMIT
INSERT DC C'XMIT ' NJE38 TRANSMIT Alias
LIST
END SAVE
/*
//*
//* Add Help files
//*
//HELP EXEC PGM=PDSLOAD
//STEPLIB DD DSN=SYSC.LINKLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD DSN=SYS2.HELP,DISP=SHR
//SYSUT1 DD DATA,DLM=@@
./ ADD NAME=TRANSMIT
)F FUNCTION - NJE38 - TSO TRANSMIT used to create XMIT files
)X SYNTAX -
TRANSMIT DATASET('DSN') OUTDATASET('DSN')
[VOLSER(PUB000)] [UNIT(3390)] [PDS]|[SEQ] [QUIET]
REQUIRED - DATASET() OUTDATASET()
DEFAULTS - VOLSER(PUBLIC) UNIT(SYSDA) SEQ
ALIAS - XMIT
EXAMPLE - a user is logged on to TSO with userid FRED:
Encode dataset HERC02.COBOL.LISTING into FRED.NETLIB:
TRANSMIT da('herc02.cobol.listing') out(netlib)
)O OPERANDS -
))node.userid - optional. specifies the destination of the
transmission
DATASET( ) - specifies the dsname of the dataset to be
transmitted. May optionally specify a member.
OUTDATASET( ) - required. Specifies the encoded file is to be
written to this dataset instead of being
transmitted. 'node.userid' may be omitted if
OUTDATASET is specified, but if it is present
then the specified node and userid will be part
of the encoded data instead of meaningless
defaults. If OUTDATASET is specified, the
named dataset will be used if it exists, other-
wise it will be created.
The contents of OUTDATASET can be input to a
RECEIVE command by the use of RECEIVE INDATASET.
))VOLSER( ) - optional. Specifies a volume where OUTDATASET
should be created. If not specified, a PUBLIC
volume will be selected.
))UNIT( ) - optional. Specifies a unit name where OUTDATASET
should be created. If not specified, SYSDA is
the default unit name.
))PDS - If specified, indicates that the member name
specified with DATASET is to be transmitted
with IEBCOPY unload, thereby preserving the
user directory data in the source PDS.
))SEQUENTIAL - DEFAULT. Indicates that any member name specified
with DATASET is to be transmitted as a sequential
file; no directory information is part of the
transmission. SEQL must be specified or defaulted
if the destination host is a VM system.
))QUIET - If specified, indicates that all informational
messages from TRANSMIT are suppressed. Error
messages will always be displayed.
./ ADD NAME=RECEIVE
)F FUNCTION - NJE38 - TSO RECEIVE
)X SYNTAX -
RECEIVE DATASET('DSN') INDATASET('DSN')
[VOLSER(PUB000)] [UNIT(3390)]
[PURGE]|[NOPURGE] [PROMPT]|[NOPROMPT] [QUIET]
REQUIRED - DATASET() INDATASET()
DEFAULTS - VOLSER(PUBLIC) UNIT(SYSDA) PURGE PROMPT
ALIAS - RECV
EXAMPLE - a user is logged on to TSO with userid FRED:
Decode dataset FRED.NETLIB to HERC02.COBOL.LISTING:
RECEIVE INDATASET('herc02.cobol.listing') DATASET(netlib)
)O OPERANDS -
DATASET( ) - specifies the dsname of the dataset to be
created; the received data will be placed within.
If not specified, the dataset name will be
derived from the incoming dataset name, with
the first qualifer being replaced by the
receiver's TSO userid.
VOLSER( ) - specifies a volume where DATASET should be
created. If not specified, a PUBLIC volume will
be chosen based on the receiving dataset's
attributes.
UNIT( ) - specifies a unit name where DATASET should be
created. If not specified, SYSDA is the default
unit name.
DIR( ) - specifies a number of directory blocks if
incoming file was a PDSE.
INDATASET( ) - optional. Specifies that the encoded named
dataset is to be received. The encoded dataset
was previously created by TRANSMIT using
OUTDATASET. May optionally specify a membername.
PURGE - DEFAULT. Indicates that RECEIVE is to purge
the spool file after successful retrieval. Has
no meaning if INDATASET is specified.
NOPURGE - Indicates that RECEIVE is to retain the spool
file. The file can be received again or must be
removed from the spool by other means. Has
no meaning if INDATASET is specified.
PROMPT - DEFAULT. Indicates that RECEIVE is to prompt
the TSO user to respecify DATASET or VOLSER
after learning the incoming dataset name. The
user can then choose to change the name or
volume.
NOPROMPT - Indicates that no prompts are to be issued. If
errors are encountered, such as the incoming
dataset name already existing, then RECEIVE is
terminated without any opportunity to change
the parameters.
QUIET - If specified, indicates that all informational
messages from RECEIVE are suppressed. Error
messages will always be displayed. QUIET also
forces on NOPROMPT.
@@
/*
//*
//* Install NJE001 Usermod to IKJEFTE2
//*
//NJSMPASM EXEC SMPASML,M=IKJEFTE2,COND=(0,NE)
//*
//NJERECV EXEC SMPAPP,COND=(0,NE),WORK=SYSALLDA
//SMPPTFIN DD *
++USERMOD(NJE0001)
.
++VER(Z038)
FMID(EBB1102)
PRE(JLM0003)
.
++MOD(IKJEFTE2)
DISTLIB(AOST4)
LKLIB(UMODLIB)
.
/*
//SMPCNTL DD *
RECEIVE
SELECT(NJE0001)
.
APPLY
SELECT(NJE0001)
DIS(WRITE)
.
/*
//*
//
This file has been truncated, but you can view the full file.
//NJE38 JOB (TSO),
// 'Install NJE38',
// CLASS=A,
// MSGCLASS=H,
// MSGLEVEL=(1,1),
// USER=HERC01,
// PASSWORD=CUL8TR
/*JOBPARM LINES=1000
//*
//* This JCL does 4 things:
//* 1) Creates SYSGEN.NJE38.MACLIB and adds the NJE38 maclibs to it
//* 2) Creates SYSGEN.NJE38.ASMSRC and adds the needed source files
//* 3) Assembles the required and adds them to SYS2.CMDLIB
//* 4) Updates and adds TRANSMIT/RECEIVE to SYS1.UMODSRC(IKJEFTE2)
//* 5) Installs the IKJEFTE2 changes with SMP
//*
//* ********
//* **
//* ** You must Re-IPL with CLPA or you will get a TSO error
//* **
//* ** This JCL is for TK4- ONLY
//* **
//* ********
//*
//* Type HELP TRANSMIT or HELP RECEIVE for information how to use
//* these commands.
//*
//* *******************************************************************
//*
//* Installs SYSGEN.NJE38.MACLIB
//*
//NJE38MAC EXEC PGM=PDSLOAD
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD DSN=SYSGEN.NJE38.MACLIB,DISP=(NEW,CATLG),
// VOL=SER=PUB001,
// UNIT=3375,SPACE=(CYL,(1,1,5)),
// DCB=(BLKSIZE=3120,RECFM=FB,LRECL=80)
//SYSUT1 DD DATA,DLM=@@
./ ADD NAME=AUTHLIST
AUTHLIST DSECT
AUTHPTR DS A -> next AUTHLIST entry or 0
DS A Reserved
AUTHUSER DS CL8 Authorized userid
AUTHNODE DS CL8 Authorized node of above userid
AUTHSIZE EQU *-AUTHLIST Length of an authlist entry
./ ADD NAME=LINKTABL
LINKTABL DSECT
*
*** LINKTABL - LINK TABLE ENTRY
*
* 0 +-----------------------------------------------+
* | LINKID |
* 8 +-----------------------+-----------------------+
* | LDEFTNME | LACTTNME |
* 10 +-----------------------+-----------------------+
* | LDEFDRVR |
* 18 +-----------------------------------------------+
* | LACTDRVR |
* 20 +-----------+-----------+-----------------------+
* | LDEFLINE | LACTLINE | LDRVRVAR |
* 28 +-----+-----+-----+-----+-----+-----+-----+-----+
* | L*1 | L*2 | L*3 | L*4 | L*5 | L*6 | L*7 | L*8 |
* 30 +-----+-----+-----+-----+-----+-----+-----+-----+
* | L*9 |LFLAG| LBUFF | LPENDING | LTAKEN |
* 38 +-----+-----+-----------+-----------+-----------+
* | LPOINTER | LMSGQ |
* 40 +-----------+-----------+-----------+-----------+
* | LTRNSCNT | LERRCNT | LTOCNT |
* 48 +-----------+-----------+-----------+-----------+
* | LNKCLOCK |
* 50 +-----------------------------------------------+
*
*
*** LINKTABL - LINK TABLE ENTRY
*
LINKID DS CL8 EBCDIC LINK ID
LDEFTNME DS CL4 DEFAULT TASK NAME
LACTTNME DS CL4 ACTIVE TASK NAME
LDEFUSER DS 0CL8 DEFAULT USERID IF NO SECURITY v130
LDEFDRVR DS CL8 DEFAULT DRIVER ID
LACTDRVR DS CL8 ACTIVE DRIVER ID
LDEFLINE DS XL2 DEFAULT VIRTUAL LINE ADDRESS *XJE
LACTLINE DS XL2 ACTIVE VIRTUAL LINE ADDRESS *XJE
LDRVRVAR DS 1F LINE DRIVER VARIABLE INFO
LDEFCLS1 DS CL1 L*1 DEFAULT SPOOL FILE CLS 1
LDEFCLS2 DS CL1 L*2 DEFAULT SPOOL FILE CLS 2
LDEFCLS3 DS CL1 L*3 DEFAULT SPOOL FILE CLS 3
LDEFCLS4 DS CL1 L*4 DEFAULT SPOOL FILE CLS 4
LACTCLS1 DS CL1 L*5 ACTIVE SPOOL FILE CLS 1
LACTCLS2 DS CL1 L*6 ACTIVE SPOOL FILE CLS 2
LACTCLS3 DS CL1 L*7 ACTIVE SPOOL FILE CLS 3
LACTCLS4 DS CL1 L*8 ACTIVE SPOOL FILE CLS 4
LTIMEZON DS 1X L*9 2 COMP TIME ZONE DISP FROM GMT
LFLAG DS 1X LINK FLAG BYTE
LACTIVE EQU X'80' LINK ACTIVE
*LALERT EQU X'40' ************AXS ALERT EXIT SET-not used in XJE
LAUTO EQU X'40' LINK TO BE AUTOSTARTED *XJE
LHOLD EQU X'20' LINK HOLD SET
LDRAIN EQU X'10' LINK DRAIN IN PROGRESS
LTRALL EQU X'08' LINK TRANSACTION TRACING (ALL)
LTRERR EQU X'04' LINK TRANSACTION TRACING (ERROR)
LCONNECT EQU X'02' Link successfully signed onHRC031DT
LHALT EQU X'01' LINK TO BE FORCED INACTIVE
LBUFF DS 1H Max buffer size for line *XJE
LNEGO DS 1H Negotiated actual buffer size *XJE
LTAKEN DS 1H COUNT OF TAG SLOTS IN USE
LPOINTER DS 1F LINK QUEUE ADDR
LMSGQ DS 1F MSG QUEUE POINTER
LTRNSCNT DS 1H LINK TRANSACTION COUNT
LERRCNT DS 1H ERROR COUNT
LTOCNT DS 1H TIMEOUT COUNT
LSPARE DS 1H SPARE HALF WORD
LNKCLOCK DS 8X CLOCK COMP VALUE FOR THIS LINK @VA03349
*
*- New fields for NJE/MVS use; below *XJE
*
LNEXT DS A -> next LINKTABL entry or 0
LTCBA DS A -> TCB for this link
LTRMECB DS F Link subtask termination ECB
LECB DS F ECB for main task notific'n to link
LNJEW DS A -> local work area for this link
DS F Available
LWRESWAP DS 0D CDS swap doubleword
LWREQIN DS A Incoming WREs Q chain anchor
LWREQCT DS F Incoming synchronization count
LINKLEN EQU *-LINKTABL LENGTH OF LINK TABLE ENTRY
SPACE
./ ADD NAME=MSGX
MACRO
&LABEL MSGX &NUM,&VAR
.* REENTERABLE FORM OF MSG MACRO
LCLA &TOFF,&TVARS
LCLC &COFF
&LABEL MVC MSGXNUM,=AL2(&NUM)
AIF (N'&SYSLIST(2) EQ 0).NOVAR
&TOFF SETA N'&SYSLIST(2)
&COFF SETC '&TOFF'
.NOVAR ANOP
AIF (N'&SYSLIST(2) EQ 0).NOVAR1
&TOFF SETA 0
&TVARS SETA 1
.MLOP ANOP
&COFF SETC '&TOFF'
MVC MSGXVAL+&COFF.(8),&SYSLIST(2,&TVARS)
&TOFF SETA &TOFF+8
&TVARS SETA &TVARS+1
AIF (&TVARS LE N'&SYSLIST(2)).MLOP
.NOVAR1 ANOP
LA 1,MSGXNUM
LA 0,&TOFF+4
BAL 14,MSG
SPACE 1
MEND
./ ADD NAME=NETSPOOL
*
* Change log:
*
* 23 Jul 20 - Add NCBPCT to return spool file percentage v200
* 02 Jul 20 - Default userid to CSA in support of TRANSMIT/RECEOVE v200
* 21 May 20 - Add update directory entry funcation v120
* 04 May 20 - Show CONFIG assembly date and time on start up. v102
*
*
NCB DSECT NETSPOOL CONTROL BLOCK
NCBEYE DS CL4'NCB' NCB id
NCBTKN DS F Token identifier (caller unique)
NCBFL1 DS X Flag bits
NCBPRT EQU X'40' PRT type data
NCBPUN EQU X'80' PUN type data
NCBREQ DS X Request type
NCBOPEN EQU X'01' Open NETSPOOL dataset
NCBCLOSE EQU X'02' Close NETSPOOL dataset
NCBPUT EQU X'03' Write a logical record
NCBGET EQU X'04' Read a logical record
NCBPURGE EQU X'05' Delete a file
NCBLOC EQU X'06' Locate a file
NCBCON EQU X'07' Get directory contents
NCBUDIR EQU X'08' Update directory entry v120
NCBRTNCD DS X RC from VSAM macro (same as R15)
NCBERRCD DS X Error code from VSAM macro
NCBMACAD DS A Addr of failing VSAM macro
NCBTAG DS A Addr of associated TAG block
NCBEODAD DS A Addr of End of Data routine
NCBAREAL DS F Length of record area
NCBAREA DS A Addr of record area
NCBRECLN DS AL2 Length of record
NCBRECCT DS AL2 Record count
NCBPCT DS 0AL2 Spool percentage full (NCBCON) v200
NCBFID DS AL2 File id # (avail on new file CLOSE)
NCBRESV1 DS AL2 Available bytes
NCBRESV2 DS A Available bytes
DS 0D Force doubleword boundary
NCBSZ EQU *-NCB Size of NCB
*
*
NSDIR DSECT NETSPOOL directory entry
NSLEN DS AL2(NSDIRLN) Length of this record incl len
NSRESV1 DS AL2 Resv
NSBLK DS AL4 Block number of file's ptr block
NSINLOC DS CL8 Originating location
NSLINK DS CL8 Next location for transmission
NSINTOD DS CL8 Time of file origin
NSINVM DS CL8 Originating virtual machine
NSRECNM DS 1F Number of records in file
NSRECLN DS 1H Maximum file data record length
NSINDEV DS 1X Device code of originating dev
NSCLASS DS CL1 File output class
NSID DS 1H File number at origin location
NSCOPY DS 1H Number of copies requested
NSFLAG DS 1X VM/370 SFBLOK control flags
NSFLAG2 DS 1X VM/370 SFBLOK control flags
NSSPARE DS 1H Spare
NSNAME DS CL12 File name
NSTYPE DS CL12 File type
NSDIST DS CL8 File distribution code
NSTOLOC DS CL8 Destination location id
NSTOVM DS CL8 Destination virtual machine id
NSPRIOR DS 1H Transmission priority
NSDEV DS 2X Active file's virt dev addr
NSRESV2 DS AL4 Resv
NSDIRLN EQU *-NSDIR
*
NJ38CSA DSECT NJE38 CSA STORAGE BLOCK
NJ38NODE DS CL8 Node name of this NJE38
NJ38ASCB DS A ASCB address of NJE38 addr space
NJ38ECB DS F NJE38 ECB for cross memory post
NJ38SWAP DS 0D CDS swap doubleword
NJ38WRIN DS A Incoming WREs Q chain anchor
NJ38WRCT DS F Incoming synchronization count v200
NJ38DUSR DS CL8 Default 'no security' userid v200
NJ38CSAZ EQU *-NJ38CSA Size of CSA area
*
CMDBLOK DSECT Map cmd area used by DMTXJE
CMDBLEN DS AL1 CMDBLOK length
CMDBTYP DS AL1(0) Type 0 = CMDBLOK request
DS AL1
DS AL1
CMDLINK DS CL8 LINKID
CMDVMID DS CL8 VIRTUAL MACHINE ID
CMDTEXT DS CL120' ' text of command
CMDBLOKL EQU *-CMDBLOK Size of dsect
*
STACKMSG DSECT Stacked message format
STKOWN DS A RQE owner
STKNEXT DS A -> next STACKMSG or zero
STKLEN DS AL1 Stacked msg length
STKZERO DS AL1(0) Must be 0
STKNODE DS CL8 Node of receiver of this msg
STKID DS CL8 userid of receiver of this msg
STKMSG DS CL238 Area for msg text
STKSZ EQU *-STACKMSG Total size should be 264=RQESZ
*
*
*
RQE DSECT
RQEOWN DS A ->LINKTABL entry of owner (0=free)
RQEDATA DS XL260 TANK or MSG data as used by DMTXJE
RQESZ EQU *-RQE Size of RQE area
*
*
./ ADD NAME=NJE
*
* DSECTs defining NJE headers
*
* Prefix section common to all headers
*
NJEPDSEC DSECT NJE header prefix
NJEPLEN DS AL2 NJE header segment length
NJEPFLGS DS XL1 NJE header segment flags
NJEPSEQ DS XL1 NJE header segment sequence
NJEPSIZE EQU *-NJEPDSEC NJE header prefix size
*
* NJE job header general section
*
NJHGDSEC DSECT NJE job hdr general section
NJHGLEN DS AL2 NJE job gen. sect. length
NJHGTYPE DS XL1 NJE job gen. sect. type
NJHGMOD DS XL1 NJE job gen. sect. modifier
NJHGJID DS AL2 NJE job gen. sect. identif.
NJHGJCLS DS CL1 NJE job gen. sect. class
NJHGMCLS DS CL1 NJE job gen. sect. msg cls
NJHGFLG1 DS XL1 NJE job gen. sect. flags
NJHGPRIO DS XL1 NJE job gen. sect. priority
NJHGORGQ DS XL1 NJE job gen. sect. qualifier
NJHGJCPY DS XL1 NJE job gen. sect. copy
NJHGLNCT DS XL1 NJE job gen. sect. lpp
DS XL1 NJE job gen. sect. reserved
NJHGHOPS DS AL2 NJE job gen. sect. hop count
NJHGACCT DS CL8 NJE job gen. sect. acct
NJHGJNAM DS CL8 NJE job gen. sect. name
NJHGUSID DS CL8 NJE job gen. sect. userid
NJHGPASS DS XL8 NJE job gen. sect. password
NJHGNPAS DS XL8 NJE job gen. sect. new pass
NJHGETS DS XL8 NJE job gen. sect. TOD time
NJHGORGN DS CL8 NJE job gen. sect. org node
NJHGORGR DS CL8 NJE job gen. sect. org user
NJHGXEQN DS CL8 NJE job gen. sect. exe node
NJHGXEQU DS CL8 NJE job gen. sect. exe user
NJHGPRTN DS CL8 NJE job gen. sect. prt dest
NJHGPRTR DS CL8 NJE job gen. sect. prt user
NJHGPUNN DS CL8 NJE job gen. sect. pun dest
NJHGPUNR DS CL8 NJE job gen. sect. pun user
NJHGFORM DS CL8 NJE job gen. sect. form
NJHGICRD DS XL4 NJE job gen. sect. inp cards
NJHGETIM DS XL4 NJE job gen. sect. job time
NJHGELIN DS XL4 NJE job gen. sect. prt lines
NJHGECRD DS XL4 NJE job gen. sect. pun cards
NJHGPRGN DS CL20 NJE job gen. sect. programmr
NJHGROOM DS CL8 NJE job gen. sect. room no
NJHGDEPT DS CL8 NJE job gen. sect. dept
NJHGBLDG DS CL8 NJE job gen. sect. building
NJHGNREC DS XL4 NJE job gen. sect. rec. cnt
NJHGSIZE EQU *-NJHGDSEC NJE job gen. sect. size
NJHSIZE EQU NJEPSIZE+NJHGSIZE NJE job header total size
*
* NJE data set header general section
*
NDHGDSEC DSECT NJE data set general sect.
NDHGLEN DS AL2 NJE ds gen sect. length
NDHGTYPE DS XL1 NJE ds gen sect. type
NDHGMOD DS XL1 NJE ds gen sect. type modif
NDHGNODE DS CL8 NJE ds gen sect. dest node
NDHGRMT DS CL8 NJE ds gen sect. dest user
NDHGPROC DS CL8 NJE ds gen sect. proc name
NDHGSTEP DS CL8 NJE ds gen sect. step type
NDHGDD DS CL8 NJE ds gen sect. ddname
NDHGDSNO DS AL2 NJE ds gen sect. count
DS XL1 Reserved
NDHGCLAS DS CL1 NJE ds gen sect. class
NDHGNREC DS XL4 NJE ds gen sect. Record cnt
NDHGFLG1 DS XL1 NJE ds gen sect. flags
NDHGRCFM DS XL1 NJE ds gen sect. record fmt
NDHGLREC DS AL2 NJE ds gen sect. record len
NDHGDSCT DS XL1 NJE ds gen sect. copy count
NDHGFCBI DS XL1 NJE ds gen sect. print index
NDHGLNCT DS XL1 NJE ds gen sect. lpp
DS XL1 Reserved
NDHGFORM DS CL8 NJE ds gen sect. form
NDHGFCB DS CL8 NJE ds gen sect. FCB
NDHGUCS DS CL8 Universal char set name
NDHGXWTR DS CL8 Data set external writer
NDHGNAME DS CL8 Data set name qualifier
NDHGFLG2 DS XL1 Second flag byte
NDHGUCSO DS XL1 NJE ds gen sect. UCS options
DS XL2 Reserved
NDHGPMDE DS CL8 NJE ds gen sect. proc mode
NDHGSIZE EQU *-NDHGDSEC Ds hdr general section size
*
* NJE data set header RSCS section
*
NDHVDSEC DSECT Data set header RSCS sect.
NDHVLEN DS AL2 Ds header RSCS sect. length
NDHVTYPE DS AL1 Ds header RSCS sect. type
NDHVMOD DS AL1 Ds header RSCS sec modifier
NDHVFLG1 DS AL1 Ds header RSCS sect flags
NDHVCLAS DS CL1 Ds header RSCS sect class
NDHVIDEV DS AL1 Ds header RSCS sect dev typ
NDHVPGLE DS AL1 Ds header RSCS 3800 page ln
NDHVDIST DS CL8 Ds header RSCS dist code
NDHVFNAM DS CL12 Ds header RSCS filename
NDHVFTYP DS CL12 Ds header RSCS filetype
NDHVPRIO DS AL2 Ds header RSCS trn priority
NDHVVRSN DS AL1 Ds header RSCS version no
NDHVRELN DS AL1 Ds header RSCS release no
NDHVSIZE EQU *-NDHVDSEC Ds header RSCS section size
NDHSIZE EQU NJEPSIZE+NDHGSIZE+NDHVSIZE Total ds header size
*
* NJE job trailer general section
*
NJTGDSEC DSECT Job trailer general section
NJTGLEN DS AL2 Job trailer gen sect length
NJTGTYPE DS AL1 Job trailer gen sect type
NJTGMOD DS AL1 Job trailer gen sc modifier
NJTGFLG1 DS AL1 Job trailer gen sect flags
NJTGXCLS DS CL1 Job trailer execution class
DS XL2 Reserved
NJTGSTRT DS XL8 Job trailer job start TOD
NJTGSTOP DS XL8 Job trailer job stop TOD
DS XL4 Reserved
NJTGALIN DS XL4 Job trailer print lines
NJTGACRD DS XL4 Job trailer card images
DS XL4 Reserved
NJTGIXPR DS XL1 Job trailer init exec prior
NJTGAXPR DS XL1 Job trailer actul exe prior
NJTGIOPR DS XL1 Job trailer init job prior
NJTGAOPR DS XL1 Job trailer actual job prio
NJTGSIZE EQU *-NJTGDSEC Job trailer gen. sect. size
NJTSIZE EQU NJEPSIZE+NJTGSIZE Job trailer total size
*
* NMR record
*
NMRDSECT DSECT
NMRFLAG DS XL1 NMR flags
NMRLVPR DS XL1 NMR level / priority
NMRTYPE DS XL1 NMR type
NMRML DS XL1 Length of contents of NMRMSG
NMRTO DS 0XL9 Destination system
NMRTONOD DS CL8 NMR destination node
NMRTOQUL DS XL1 Destination node system identifier
NMROUT DS CL8 Userid / remote id / console id
NMRFM DS 0XL9 NMR originating system
NMRFMNOD DS CL8 NMR originating node
NMRFMQUL DS XL1 Originating node system identifier
NMRHSIZE EQU *-NMRDSECT Size of NMR header only
NMRECSID DS 0CL8 Message origination node
NMRMSG DS CL148 NMR message / command
NMRSIZE EQU *-NMRDSECT NMR size including message / command
*
* Fields in NMRFLAG
*
NMRFLAGC EQU X'80' NMR is a command
NMRFLAGW EQU X'40' NMROUT has remote workstation id
NMRFLAGT EQU X'20' NMROUT contains a userid
NMRFLAGU EQU X'10' NMROUT contains console identifier
NMRFLAGR EQU X'08' Console is remote-authorized only
NMRFLAGJ EQU X'04' Console is not job-authorized
NMRFLAGD EQU X'02' Console is not device-authorized
NMRFLAGS EQU X'01' Console is not system-authorized
*
* Fields in NMRTYPE
*
NMRTYPE4 EQU X'08' Source userid embedded in NMRMSG
NMRTYPET EQU X'04' Timestamp is not embedded in NMRMSG
NMRTYPEF EQU X'02' NMR comtains a formatted command
NMRTYPED EQU X'02' Contains a delete operator message
*
* SYSIN RCBs
*
RRCB1 EQU X'98' Stream 1 sysin records
RRCB2 EQU X'A8' Stream 2 sysin records
RRCB3 EQU X'B8' Stream 3 sysin records
RRCB4 EQU X'C8' Stream 4 sysin records
RRCB5 EQU X'D8' Stream 5 sysin records
RRCB6 EQU X'E8' Stream 6 sysin records
RRCB7 EQU X'F8' Stream 7 sysin records
*
* SYSOUT RCBs
*
PRCB1 EQU X'99' Stream 1 sysout records
PRCB2 EQU X'A9' Stream 2 sysout records
PRCB3 EQU X'B9' Stream 3 sysout records
PRCB4 EQU X'C9' Stream 4 sysout records
PRCB5 EQU X'D9' Stream 5 sysout records
PRCB6 EQU X'E9' Stream 6 sysout records
PRCB7 EQU X'F9' Stream 7 sysout records
./ ADD NAME=NJEPARMS
MACRO
&X NJEPARMS
.*
.* Change log:
.*
.*
.* 04 Dec 20 - Expanded internal trace table support v212
.* 29 Nov 20 - Use text-based configuration; alternate routes v211
.* 29 Nov 20 - Initial creation. v211
.*
*--this area mapped as INITPARM; passed to NJEDRV/NJECMX/NJESCN v211
DS 0D v211
INITPARM DS 0XL72 v220
* Offset Owner Area to be passed v211
* ------ ------- --------------------------------v211
LCLNODE DS CL8 0 NJEINIT Local node name v211
CPUID DS D 8 NJEINIT CPUID of this system v211
ANJECMX DS A 10 NJEINIT -> entry of NJECMX cmd processorv211
ANJESPL DS A 14 NJEINIT -> NJESPOOL interface v211
RQENUM DS F 18 NJEINIT # RQEs in stg area v211
ARQESTG DS A 1C NJEINIT -> RQE stg area v211
CSABLK DS A 20 NJEINIT -> CSA communication area v211
ALINKS DS A 24 NJEINIT -> LINKS (LINKTABL anchor) v211
AROUTES DS A 28 NJEINIT -> ROUTES (RTE list anchor) v211
AAUTHS DS A 2C NJEINIT -> AUTHS (AUTHLIST anchor) v211
ACMDBLOK DS A 30 NJEINIT -> CMDBLOK dsect (CMNDBLOK) v211
MSGQ DS A 34 NJEDRV Stacked msg Q anchor v211
XJELINK DS A 38 NJEDRV -> task's LINKTABL v211
ATRACE DS A 3C NJEINIT -> Trace table control v212
AREGUSER DS A 40 NJEINIT -> REGUSER (REGUSER anchor) v220
RESV1 DS F 44 Available word v220
* 48 Total length v220
INITPRML EQU *-INITPARM Length of this parm list v211
*--end of passed area v211
MEND
./ ADD NAME=NJEQUMSG
MACRO
&X NJEQUMSG
.*
.* Change log:
.*
.* 11 Dec 20 - Initial creation. v220
.*
QUMSG DSECT Queued user message
QUMNEXT DS A -> next QUMSG or 0
QUMOWNER DS A -> REGUSER that owns this msg
QUMSGTXT DS CL120 Message text
QUMSIZE EQU *-QUMSG Size of dsect
MEND
./ ADD NAME=NJERUSER
MACRO
&X NJERUSER
.*
.* Change log:
.*
.* 10 Dec 20 - Initial creation. v220
.*
*
REGUSERB DSECT Registered userid block
REGNEXT DS A -> next REGUSER or 0
REGEYE DS CL4'REGU' Eyecatcher
REGWRE DS A -> user's registration WRE in CSA
REGMSGQ DS A -> user's queued msgs WRE chain
REGUSRID DS CL8 Userid
REGSIZE EQU *-REGUSERB Size of dsect
MEND
./ ADD NAME=NJETRACE
MACRO
&X NJETRACE &TYPE=
.*
.* Change log:
.*
.* 10 Dec 20 - Support for registered users and message queuing v220
.* 10 Dec 20 - Create NJETRACE macro from old in-line TRACE macro v220
.*
AIF ('&TYPE' EQ 'DSECT').DSECT
.*
&X STM R15,R2,16(R13) R0-R2 restored by trace rtn
L R2,ATRACE -> trace table
L R15,TRCRTN-TRCCTL(,R2) -> trace routine
BALR R14,R15 Go get a new trace entry
L R15,16(,R13) Restore R15
MVI 0(R14),&TYPE Move in trace type code
MEXIT
.*
.DSECT ANOP
TRCCTL DSECT
TRCEYE DS CL8'TRACETAB' Eyecatcher
TRCRTN DS A -> Trace routine
DS A Reserved
TRCSTRT DS A -> Start of trace table
TRCCURR DS A -> Current trace entry
TRCEND DS A -> End of trace table
DS A Reserved
TRCSZ EQU 32 Size of each trace entry
*
*-- TRACE TABLE TYPES
*
TRCEXCP EQU X'01' EXCP operation
TRCWAIT EQU X'02' Wait completed
TRCDYNA EQU X'03' Dynamic Allocation
TRCMSG EQU X'04' Message
TRCRCMD EQU X'05' remote command
TRCGET EQU X'06' Getmain
TRCFREE EQU X'07' Freemain
TRCOPNO EQU X'08' Open output request
TRCCLSO EQU X'09' Close output request
TRCOPNI EQU X'0A' Open input request
TRCCONT EQU X'0B' Spool contents request
TRCCLSI EQU X'0C' Close input request
TRCPURG EQU X'0D' File Purge request
TRC0E EQU X'0E' Available
TRCGLQ EQU X'0F' GLINKREQ
TRCGRQ EQU X'10' GROUTREQ
TRCALQ EQU X'11' ALERTREQ
TRCGMQM EQU X'12' GMSGREQ from MSGQ
TRCGMQR EQU X'13' GMSGREQ from RQE
TRCIWRE EQU X'14' Incoming WRE
TRCOWRE EQU X'15' Outgoing WRE
TRCGWRE EQU X'16' Getmain WRE
TRCFWRE EQU X'17' Freemain WRE
*
MEND
./ ADD NAME=NJEVER
MACRO
NJEVER
GBLC &VERS
&VERS SETC 'v2.3.0' -> Current version
B 34(,R15)
DC AL1(29)
DC CL9'&SYSECT'
DC CL6'&VERS'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
MEND
./ ADD NAME=NJEWRE
MACRO
&X NJEWRE
.*
.* Change log:
.*
.* 10 Dec 20 - Support for registered users and message queuing v220
.*
WRE DSECT
WRENEXT DS A -> next WRE or 0
WRETYPE DS X WRE type
WRENEW EQU X'04' New file added to NETSPOOL
WRECMD EQU X'08' CMD type
WREMSG EQU X'0C' MSG type
WRESTAR EQU X'10' START type
WREREG EQU X'14' Registration request v220
WREDREG EQU X'18' Deregistration request v220
WREQRM EQU X'1C' Queue registered user msg v220
WREDRM EQU X'20' Dequeue registered user msg v220
WRECODE DS X Command code for link driver
WRETXTLN DS X CMD or MSG text length
WRESP DS X Getmained subpool number v220
WRELINK DS CL8 Target link name for this WRE
WREUSER DS CL8 Target user name for this WRE
WREORIG DS 0CL8 Originating userid of MSG v220
WREASCB DS A Originating ASCB addr v220
WREECB DS F Originator ECB for CM POST v220
WRETXT DS CL120 Command or message text
WRESIZE EQU *-WRE Size of WRE v220
*
*- Error codes for registered user services (POST code in WREECB) v220
ERNOERR EQU 0 No errors v220
ERNOMSG EQU 4 No more messages v220
ERSTOP EQU 8 STOP command issued v220
ERINVREQ EQU 12 Invalid request v220
ERINACT EQU 16 NJE38 is not active v220
ERPOST EQU 20 CM POST to NJE38 failure v220
ERDUPUSR EQU 24 User already registered v220
ERUSERNF EQU 28 Userid is not registered v220
ERECBPST EQU 32 User ECB was posted v220
MEND
./ ADD NAME=NSIO
MACRO MAC00010
&L NSIO &TYPE=, XMAC00020
&NCB=NCB, XMAC00030
&TAG=, XMAC00040
&EODAD=, XMAC00050
&AREALEN=, XMAC00060
&AREA=, XMAC00070
&RECLEN=, v210XMAC00080
&ENTRY= v210 MAC00080
.*
.* Change log:
.*
.* 10 AUG 20 - Add alternate entry point via ENTRY= v210
.* 21 May 20 - Add update directory entry functionality v120
.*
.* MAC00100
LCLA &OFFREQ MAC00110
LCLA &OFFTAG MAC00120
LCLA &OFFEOD MAC00130
LCLA &OFFARL MAC00140
LCLA &OFFARA MAC00150
LCLA &OFFRCL MAC00160
LCLA &NSIZE MAC00180
LCLA &REQ MAC00190
LCLC &W MAC00200
.* MAC00210
.* Offsets within NCB block MAC00220
&OFFREQ SETA 9 Offset of NCBREQ MAC00230
&OFFTAG SETA 16 Offset of NCBTAG MAC00240
&OFFEOD SETA 20 Offset of NCBEODAD MAC00250
&OFFARL SETA 24 Offset of NCBAREAL MAC00260
&OFFARA SETA 28 Offset of NCBAREA MAC00270
&OFFRCL SETA 32 Offset of NCBRECLN MAC00280
* MAC00300
.* Assembled size of NCB DSECT MAC00310
&NSIZE SETA 48 Size of an NCB MAC00320
.* MAC00330
AIF (T'&NCB NE 'O').NCB1 MAC00340
MNOTE 8,'NCB= PARAMETER REQUIRED' MAC00350
AGO .TYPE MAC00360
.* MAC00370
.NCB1 ANOP MAC00380
AIF ('&NCB'(1,1) EQ '(').NCB1R MAC00390
&L LA 1,&NCB -> NCB MAC00400
AGO .TYPE MAC00410
.NCB1R ANOP MAC00420
&W SETC '&NCB'(2,K'&NCB-2) MAC00430
&L LR 1,&W -> NCB MAC00440
.* MAC00450
.ISTYPE ANOP MAC00460
AIF (T'&TYPE NE 'O').TYPE MAC00470
MNOTE 8,'TYPE= PARAMETER REQUIRED' MAC00480
MEXIT MAC00490
.* MAC00500
.TYPE ANOP MAC00510
AIF ('&TYPE' EQ 'OPEN').OPEN MAC00520
AIF ('&TYPE' EQ 'CLOSE').CLOSE MAC00530
AIF ('&TYPE' EQ 'PUT').PUT MAC00540
AIF ('&TYPE' EQ 'GET').GET MAC00550
AIF ('&TYPE' EQ 'PURGE').PURGE MAC00560
AIF ('&TYPE' EQ 'FIND').FIND MAC00570
AIF ('&TYPE' EQ 'CONTENTS').CONTENT MAC00580
AIF ('&TYPE' EQ 'UDIR').UDIR v120 MAC00570
MNOTE 8,'TYPE=&TYPE IS NOT A VALID FUNCTION TYPE' MAC00590
MEXIT MAC00600
.* MAC00610
.OPEN ANOP MAC00620
&REQ SETA 1 MAC00630
XC 0(&NSIZE,1),0(1) Initialize NCB MAC00640
MVC 0(4,1),=CL4'NCB' Set NCB identifier MAC00650
AGO .SETREQ MAC00660
.* MAC00670
.CLOSE ANOP MAC00680
&REQ SETA 2 MAC00690
AGO .SETREQ MAC00700
.* MAC00710
.PUT ANOP MAC00720
&REQ SETA 3 MAC00730
AGO .SETREQ MAC00740
.* MAC00750
.GET ANOP MAC00760
&REQ SETA 4 MAC00770
AGO .SETREQ MAC00780
.* MAC00790
.PURGE ANOP MAC00800
&REQ SETA 5 MAC00810
AGO .SETREQ MAC00820
.* MAC00830
.FIND ANOP MAC00840
&REQ SETA 6 MAC00850
AGO .SETREQ MAC00860
.* MAC00870
.CONTENT ANOP MAC00880
&REQ SETA 7 MAC00890
AGO .SETREQ v120 MAC00860
.* MAC00830
.UDIR ANOP v120 MAC00840
&REQ SETA 8 v120 MAC00850
.* MAC00900
.SETREQ ANOP MAC00910
MVI &OFFREQ.(1),&REQ Set NCBREQ type MAC00920
.* MAC00930
.TAG ANOP MAC00940
AIF (T'&TAG EQ 'O').EODAD MAC00950
AIF ('&TAG'(1,1) EQ '(').TAG1R MAC00960
LA 0,&TAG -> TAG data MAC00970
ST 0,&OFFTAG.(,1) Store in NCB MAC00980
AGO .EODAD MAC00990
.TAG1R ANOP MAC01000
&W SETC '&TAG'(2,K'&TAG-2) MAC01010
ST &W,&OFFTAG.(,1) Store tag ptr in NCB MAC01020
.* MAC01030
.EODAD ANOP MAC01040
AIF (T'&EODAD EQ 'O').AREALEN MAC01050
AIF ('&EODAD'(1,1) EQ '(').EODAD1R MAC01060
LA 0,&EODAD -> End of data routine MAC01070
ST 0,&OFFEOD.(,1) Store in NCB MAC01080
AGO .AREALEN MAC01090
.EODAD1R ANOP MAC01100
&W SETC '&EODAD'(2,K'&EODAD-2) MAC01110
ST &W,&OFFEOD.(,1) Set EODAD address in NCB MAC01120
.* MAC01130
.AREALEN ANOP MAC01140
AIF (T'&AREALEN EQ 'O').AREA MAC01150
AIF ('&AREALEN'(1,1) EQ '(').AREAL1R MAC01160
MVC &OFFARL.(4,1),=A(&AREALEN) Set area length value in NCB MAC01170
AGO .AREA MAC01180
.AREAL1R ANOP MAC01190
&W SETC '&AREALEN'(2,K'&AREALEN-2) MAC01200
ST &W,&OFFARL.(,1) Set area length in NCB MAC01210
.* MAC01220
.AREA ANOP MAC01230
AIF (T'&AREA EQ 'O').RECLEN MAC01240
AIF ('&AREA'(1,1) EQ '(').AREA1R MAC01250
LA 0,&AREA -> Record buffer area MAC01260
ST 0,&OFFARA.(,1) Store in NCB MAC01270
AGO .RECLEN MAC01280
.AREA1R ANOP MAC01290
&W SETC '&AREA'(2,K'&AREA-2) MAC01300
ST &W,&OFFARA.(,1) Set area address in NCB MAC01310
.* MAC01320
.RECLEN ANOP MAC01330
AIF (T'&RECLEN EQ 'O').ENTRY v210 MAC01340
AIF ('&RECLEN'(1,1) EQ '(').REC1R MAC01350
MVC &OFFRCL.(2,1),=Y(&RECLEN) Set record length in NCB MAC01360
AGO .ENTRY v210 MAC01370
.REC1R ANOP MAC01380
&W SETC '&RECLEN'(2,K'&RECLEN-2) MAC01390
STH &W,&OFFRCL.(,1) Set record length in NCB MAC01400
.* MAC01500
.ENTRY ANOP MAC01510
AIF (T'&ENTRY EQ 'O').VCON v210
AIF ('&ENTRY'(1,1) EQ '(').ENT1R v210 MAC01350
L 15,&ENTRY Load NJESPOOL entry addr v210
AGO .LAUNCH v210
.* MAC01500
.ENT1R ANOP v210 MAC01510
&W SETC '&ENTRY'(2,K'&ENTRY-2) v210 MAC01390
AIF ('&W' EQ '15').LAUNCH v210 MAC01350
LR 15,&W Entry addr to R15 v210 MAC01400
AGO .LAUNCH v210
.*
.VCON ANOP v210
L 15,=V(NJESPOOL)
.*
.LAUNCH ANOP v210
BALR 14,15
.*
.MEND ANOP v210 MAC01510
MEND MAC01520
./ ADD NAME=REGEQU
MACRO REG00010
&X REGEQU REG00020
* DEFINES GENERAL REGISTERS REG00030
R0 EQU 0 REG00040
R1 EQU 1 REG00050
R2 EQU 2 REG00060
R3 EQU 3 REG00070
R4 EQU 4 REG00080
R5 EQU 5 REG00090
R6 EQU 6 REG00100
R7 EQU 7 REG00110
R8 EQU 8 REG00120
R9 EQU 9 REG00130
R10 EQU 10 REG00140
R11 EQU 11 REG00150
R12 EQU 12 REG00160
R13 EQU 13 REG00170
R14 EQU 14 REG00180
R15 EQU 15 REG00190
* DEFINES CONTROL REGISTERS REG00200
C0 EQU 0 REG00210
C1 EQU 1 REG00220
C2 EQU 2 REG00230
C3 EQU 3 REG00240
C4 EQU 4 REG00250
C5 EQU 5 REG00260
C6 EQU 6 REG00270
C7 EQU 7 REG00280
C8 EQU 8 REG00290
C9 EQU 9 REG00300
C10 EQU 10 REG00310
C11 EQU 11 REG00320
C12 EQU 12 REG00330
C13 EQU 13 REG00340
C14 EQU 14 REG00350
C15 EQU 15 REG00360
* DEFINES FLOATING PT REGISTERS REG00370
F0 EQU 0 REG00380
F2 EQU 2 REG00390
F4 EQU 4 REG00400
F6 EQU 6 REG00410
MEND REG00420
./ ADD NAME=ROUTE
MACRO
&LABEL ROUTE &PARM1,&PARM2, X
&TYPE=ENTRY
GBLA &RTETOT
AIF ('&TYPE' EQ 'FINAL').FINAL
LCLC &DEST,&NEXT
&RTETOT SETA &RTETOT+1
AIF (&RTETOT NE 1).NOT1
ROUTES DS 0D
.NOT1 ANOP
&DEST SETC ' '
&NEXT SETC ' '
AIF (T'&PARM1 EQ 'O').NOID
&DEST SETC '&PARM1'
AIF (T'&PARM2 EQ 'O').NOID
&NEXT SETC '&PARM2'
.NOID ANOP
&LABEL DC CL8'&DEST',CL8'&NEXT' DESTINATION, NEXT LINK
MEXIT
.FINAL ANOP
NUMRTES EQU &RTETOT
AIF (&RTETOT NE 0).MEND
ROUTES DS 0D
.MEND ANOP
MEND
./ ADD NAME=RSSEQU
PUSH PRINT
AIF ('&SYSPARM' NE 'SUP').RSS01
PRINT OFF,NOGEN
.RSS01 ANOP
*
*** RSS EQUATE SYMBOLS - MACHINE USAGE
*
SPACE 1
* BITS DEFINED IN STANDARD/EXTENDED PSW
EXTMODE EQU X'08' BIT 12 - EXTENDED MODE
MCHEK EQU X'04' BIT 13 - MACHINE CHECK ENABLED
WAIT EQU X'02' BIT 14 - WAIT STATE
PROBMODE EQU X'01' BIT 15 - PROBLEM STATE
SPACE 1
* BITS DEFINED IN CHANNEL STATUS WORD - CSW
ATTN EQU X'80' BIT 32 - ATTENTION
SM EQU X'40' BIT 33 - STATUS MODIFIER
CUE EQU X'20' BIT 34 - CONTROL UNIT END
BUSY EQU X'10' BIT 35 - BUSY
CE EQU X'08' BIT 36 - CHANNEL END
DE EQU X'04' BIT 37 - DEVICE END
UC EQU X'02' BIT 38 - UNIT CHECK
UE EQU X'01' BIT 39 - UNIT EXCEPTION
*
PCI EQU X'80' BIT 40 - PROGRAM-CONTROL INTERRUPT
IL EQU X'40' BIT 41 - INCORRECT LENGTH
PRGC EQU X'20' BIT 42 - PROGRAM CHECK
PRTC EQU X'10' BIT 43 - PROTECTION CHECK
CDC EQU X'08' BIT 44 - CHANNEL DATA CHECK
CCC EQU X'04' BIT 45 - CHANNEL CONTROL CHECK
IFCC EQU X'02' BIT 46 - INTERFACE CONTROL CHECK
CHC EQU X'01' BIT 47 - CHAINING CHECK
SPACE 1
* BITS DEFINED IN CHANNEL COMMAND WORD - CCW
CD EQU X'80' BIT 32 - CHAIN DATA
CC EQU X'40' BIT 33 - COMMAND CHAIN
SILI EQU X'20' BIT 34 - SUPPRESS INCORRECT LENGTH IND.
SKIP EQU X'10' BIT 35 - SUPPRESS DATA TRANSFER
PCIF EQU X'08' BIT 36 - PROGRAM-CONTROL INTERRUPT FETCH
IDA EQU X'04' BIT 37 - INDIRECT DATA ADDRESS
SPACE 1
* BITS DEFINED IN SENSE BYTE 0 -- COMMON TO MOST DEVICES
CMDREJ EQU X'80' BIT 0 - COMMAND REJECT
INTREQ EQU X'40' BIT 1 - INTERVENTION REQUIRED
BUSOUT EQU X'20' BIT 2 - BUS OUT
EQCHK EQU X'10' BIT 3 - EQUIPMENT CHECK
DATACHK EQU X'08' BIT 4 - DATA CHECK
EJECT
*
*** CP370 EQUATE SYMBOLS - CP USAGE
*
* SYMBOLIC REGISTER EQUATES
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7 GENERAL
R8 EQU 8 REGISTER
R9 EQU 9 DEFINITIONS
R10 EQU 10
R11 EQU 11
R12 EQU 12
R13 EQU 13
R14 EQU 14
R15 EQU 15
*
Y0 EQU 0 FLOATING
Y2 EQU 2 POINT
Y4 EQU 4 REGISTER
Y6 EQU 6 DEFINITIONS
EJECT
POP PRINT
SPACE
./ ADD NAME=RTE
RTE DSECT
ROUTPTR DS A -> next RTE entry or 0
DS A Reserved
ROUTNAME DS CL8 Route destination node
ROUTNEXT DS CL8 Link id for indirect routing
ROUTALT1 DS CL8 Alternate link id for indirect rt'g
ROUTALT2 DS CL8 Alternate link id for indirect rt'g
ROUTALT3 DS CL8 Alternate link id for indirect rt'g
ROUTSIZE EQU *-RTE Length of a routing table entry
./ ADD NAME=TAG
PUSH PRINT
AIF ('&SYSPARM' NE 'SUP').TAG01
PRINT OFF,NOGEN
.TAG01 ANOP
TAG DSECT
SPACE 1
*** TAG - FILE TAG
*
* 0 +-----------------------+-----------------------+
* | TAGNEXT | TAGBLOCK |
* 8 +-----------------------+-----------------------+
* | TAGINLOC |
* 10 +-----------------------------------------------+
* | TAGLINK |
* 18 +-----------------------------------------------+
* | TAGINTOD |
* 20 +-----------------------------------------------+
* | TAGINVM |
* 28 +-----------------------+-----------+-----+-----+
* | TAGRECNM | TAGRECLN | T*1 | T*2 |
* 30 +-----------+-----------+-----------+-----+-----+
* | TAGID | TAGCOPY | T*3 | T*4 | SPARE |
* 38 +-----------+-----------+-----------------------+
* | TAGNAME |
* 40 | +-----------------------+
* | | |
* 48 +-----------------------+ |
* | TAGTYPE |
* 50 +-----------------------------------------------+
* | TAGDIST |
* 58 +-----------------------------------------------+
* | TAGTOLOC |
* 60 +-----------------------------------------------+
* | TAGTOVM |
* 68 +-----------------------------------------------+
* | TAGPRIOR | TAGDEV |
* 70 +-----------+-----------+
*
*** TAG - FILE TAG
SPACE 1
TAGNEXT DS 1F ADDR OF NEXT ACTIVE QUEUE ENTRY
TAGBLOCK DS 1F ADDR OF ASSOCIATED I/O AREA
SPACE
TAGINLOC DS CL8 ORIGINATING LOCATION
TAGLINK DS CL8 NEXT LOCATION FOR TRANSMISSION
TAGINTOD DS CL8 TIME OF FILE ORIGIN
TAGINVM DS CL8 ORIGINATING VIRTUAL MACHINE
TAGRECNM DS 1F NUMBER OF RECORDS IN FILE
TAGRECLN DS 1H MAXIMUM FILE DATA RECORD LENGTH
TAGINDEV DS 1X T*1 DEVICE CODE OF ORIGINATING DEV
TAGCLASS DS CL1 T*2 FILE OUTPUT CLASS
TAGID DS 1H FILE NUMBER AT ORIGIN LOCATION
TAGCOPY DS 1H NUMBER OF COPIES REQUESTED
TAGFLAG DS 1X T*3 VM/370 SFBLOK CONTROL FLAGS
TAGFLAG2 DS 1X T*4 VM/370 SFBLOK CONTROL FLAGS
DS 1H SPARE
TAGNAME DS CL12 FILE NAME
TAGTYPE DS CL12 FILE TYPE
TAGDIST DS CL8 FILE DISTRIBUTION CODE
TAGTOLOC DS CL8 DESTINATION LOCATION ID
TAGTOVM DS CL8 DESTINATION VIRTUAL MACHINE ID
TAGPRIOR DS 1H TRANSMISSION PRIORITY
TAGDEV DS 2X ACTIVE FILE'S VIRT DEV ADDR
SPACE
TAGUSELN EQU *-TAGINLOC USABLE TAG INFO LEN *XJE
TAGLEN EQU *-TAGNEXT LENGTH OF THE FILE TAG
EJECT
POP PRINT
SPACE
@@
//*
//* Installs SYSGEN.NJE38.ASMSRC
//*
//ASMSRC EXEC PGM=PDSLOAD
//SYSPRINT DD SYSOUT=*
//SYSUT2 DD DSN=SYSGEN.NJE38.ASMSRC,DISP=(NEW,CATLG),
// VOL=SER=PUB001,
// UNIT=3375,SPACE=(CYL,(2,1,10)),
// DCB=(BLKSIZE=6160,LRECL=80,RECFM=FB)
//SYSUT1 DD DATA,DLM=@@
./ ADD NAME=NJESYS
*
*
*-- NJE38 - Locate NJE38 information from an ENQ resource
*
*
* Called by NJEINIT,NJERCV,NJETRN,NJE38,NJ38XMIT,NJ38RECV
*
*
* Change log:
*
* 01 Oct 20 - Initial creation v210
*
*
GBLC &VERS
REGEQU
NJESYS CSECT
NJEVER
STM R14,R12,12(R13) Save regs
LR R12,R15
USING NJESYS,R12
*
*-- Determine if NJE38 is already active in another address space
*
CHK000 EQU *
L R2,16 Get CVT ptr
USING CVT,R2
LA R2,CVTFQCB -> ENQ QCB chain anchor
USING QCB,R2
*
CHK010 EQU *
ICM R2,15,MAJNMAJ -> next major QCB
BZ CHK080 Our guy not found
CLC MAJNAME,NJE38Q Look for our QNAME "NJE38"
BNE CHK010 Nope, go to next QCB
*
L R3,MAJFMIN -> first minor QCB
USING MIN,R3
*
CHK020 EQU *
LA R4,MINNAME -> minor name
CLC NJERCON,0(R4) Does minor name match?
BE CHK030 Yes. NJE38 is active
C R3,MAJLMIN Is this the last minor QCB?
BE CHK080 Yes, we're done. NJE38 is not active
ICM R3,15,MINNMIN -> next minor name
BZR R14 Just in case no address
B CHK020 Spin through the minor QCBs
*
CHK030 EQU *
LTR R1,R1 Store spool DSN?
BZ CHK040 No
MVC 0(44,R1),12(R4) Save off NETSPOOL dsname
*
CHK040 EQU *
L R1,8(,R4) Get CSABLK ptr from QCB minor
SR R15,R15 RC=0, ENQ data was found
B CHK090
*
CHK080 EQU *
LA R15,4 RC=4, no ENQ located
*
CHK090 EQU *
ST R1,24(,R13) Return R1 value
ST R15,16(,R13) Return R15 RC
*
LM R14,R12,12(R13) Reload regs
BR R14 Return
*
DS 0D
NJE38Q DC CL8'NJE38'
NJERCON DC CL8'NJEINIT'
*
LTORG ,
*
CVT DSECT=YES,PREFIX=NO
IHAQCB
*
END
./ ADD NAME=NJESPOOL
*
*
*-- NJE38 - "Spool" Services
*
*
* Called by NJEINIT and NJEDRV for spool-like services
*
*
*
* Change log:
*
* 23 Jul 20 - Make CONTENTS return spool full percentage v200
* 21 Jul 20 - Only part of record buffer area was FREEMAINed v200
* 01 Jun 20 - Exclusive control error because ENDREQ not issued v130
* on CONTENTS function against an empty spool. v130
* 21 May 20 - Add update directory entry functionality v120
* 08 May 20 - RC 12 errors need error addr in NCBMACAD v110
*
*
* NJESPOOL - Provide a spooling mechanism "access method" for use by
* NJE38 to hold data files queued for transmission, or to
* hold data files that have been received via transmission
* but not yet retrieved by the destination user.
*
* The main goal of NJESPOOL is to provide a simple way to read and
* write files by the NJE line driver without the line driver having
* to know the vagaries of i/o, record formats, directories, and so on.
* NJESPOOL does the heavier lifting and spool management under the
* covers and unknown to the line driver.
*
* The spool dataset, "NETSPOOL", is a VSAM RRDS-type dataset. All
* blocks in the dataset are one control interval in size. The CI size
* must be 4096, which gives a usable record size of 4089 bytes. The
* NETSPOOL internal format is based on these sizes.
*
* NETSPOOL contains a directory which describes the data files
* present within. There are two directories; one is the current
* directory which describes the true state of NETSPOOL, the other is
* the current-minus-1 diectory, which is the state of NETSPOOL just
* prior to the very last directory update. When new data files are
* added or removed from NETSPOOL, the current directory is copied onto
* current-minus-1 and then the addition or deletion is applied. This
* then becomes the current directory and the directory that was most
* recently current becomes current-minus-1. Thus the directories
* alternate back and forth. The first block of each directory are
* blocks 2 and 3, respectively. If the directory size expands to
* additional blocks, they can be anywhere in the dataset, but the
* very first block of either directory is ALWAYS 2 or 3.
*
* Block #1 contains a fullword pointer that contains the block number
* of whichever directory is current. Thus, it will contain a 2 or 3.
* Alternating directories ensures that in the event of a failure while
* adding or deleting a data file, the changes do not clobber the
* current directory. Only when those updates complete successfully
* is the block 1 pointer to the new current directory updated.
*
*
* The format of the NETSPOOL dataset is very simple.
* Block 1 - contains the block # of the current directory block and
* a few other items.
* Blocks 2-3 - contain the 1st directory block for the current
* and current-minus-1 directories.
* Blocks 4-7 - contains the free space bit map.
* Blocks 8-n - data blocks available for data files or directory blks.
*
* The free space bitmap is simply a 4-block long (4089 * 4 = 16356
* bytes) string of bits that represent whether a given CI in the
* dataset is used or available. Upon initial formatting, the blocks
* 1-7 are marked as used. The rest of the data blocks are free until
* the last block number that is physically present in the VSAM RRDS
* dataset. The maximum number of blocks supported by this scheme is
* 130,848. This is 873 cylinders of 3380 DASD space, for example.
* For VSAM RRDS NETSPOOL sizes of fewer cylinders, blocks higher than
* the highest available physical block number are marked as used out
* to the end of the bitmap so they will never be allocated.
*
*
* ACCESSING NETSPOOL VIA PROGRAMMING
*
* You may access the NETSPOOL dataset via programming the same way
* that the NJE line driver and NJE38 utilities do: via a NETSPOOL
* CONTROL BLOCK (NCB) and the NSIO macro.
*
* The NCB is a small control block that is something akin to a VSAM
* RPL. It simply contains information about the file being read or
* written and contains pointers to the user buffer, and file
* attributes.
*
* The NSIO macro is used to open or close the NETSPOOL dataset. It is
* also used to read or write data records, and obtain directory
* information.
*
* The NCB and the NSIO macro are used together and provide the
* functions for spool access:
*
* NSIO TYPE=OPEN - Opens the NETSPOOL dataset for i/o
* CLOSE - Closes NETSPOOL and updates directory
* PUT - Writes a single record to the spool
* GET - Reads a single record from the spool
* PURGE - Deletes a data file from the spool
* FIND - Locates a data file by file number
* CONTENTS - Returns the current directory contents
* UDIR - Update a directory entry v120
*
* All NSIO macros must specify the NCB that it is associated with.
* The spool is not opened for "input" or for "output" in the
* traditional sense. Rather, the first TYPE=GET or TYPE=PUT
* issued establishes the mode. Once the mode is established you
* may not change from PUT to GET, or GET to PUT, without first
* closing the spool and re-opening. The PURGE, FIND, and CONTENTS
* functions do not establish any mode, and can be used any time
* the spool is open.
*
* If you need to open the spool file by two or more tasks or modes
* simultaneously, use multiple NCBs.
*
* VSAM errors are returned via the NCBRTNCD and NCBERRCD fields which
* are analagous to the VSAM RPLRTNCD and RPLERRCD fields. If an
* actual VSAM error occurs, NCBRTNCD will be set to 8 and the NCBERRCD
* field contains the actual VSAM RPLERRCD value. If NCBRTNCD is 12,
* the error code value is an internal value used by NJESPOOL. These
* are:
*
* NCBRTNCD=X'0C' Internal NJESPOOL error
* NCBERRCD=X'01' Invalid function code (not open, close, get, etc).
* X'02' VSAM RRDS ACB is not open
* X'03' NETSPOOL dataset is full
* X'04' File # not found in directory (TYPE=FIND/PURGE)
* X'05' GET attempted in PUT mode, or,
* PUT attempted in GET mode
* X'06' No files in directory (TYPE=CONTENTS)
*
* Refer to the utilities NJ38XMIT and NJ38RECV for examples using
* NCB and NSIO to access the spool.
*
PRINT GEN NJE00030
REGEQU REGISTER EQUATES NJE00040
*
* NETSPOOL Internal values
*
ALLOCBLK EQU 4 Starting BLK# of allocation map
ALLOCNUM EQU 4 Number of allocation map blocks
*
*
NJESPOOL CSECT NJE00020
NJEVER
STM R14,R12,12(R13) SAVE CMS REGS NJE00050
LR R12,R15 BASE NJE00060
USING NJESPOOL,R12 ADDRESS IT NJE00070
LTR R9,R1 NCB ptr to R9
BZ EXIT16 Exit if no ptr
USING NCB,R9
CLC NCBEYE,=CL4'NCB' Is it an NCB?
BNE EXIT16 Exit if not
XC NCBRTNCD(2),NCBRTNCD Clear prior error codes
CLI NCBREQ,NCBOPEN Is this an OPEN function?
BE INIT000 Yes, ignore token
L R10,NCBTKN Get caller token
CLC 0(4,R10),=CL4'NSPL' Token point to NSPL work area?
BE INIT010 Yes, looks good
B EXIT16 Exit if token invalid
*
*
INIT000 EQU *
GETMAIN RU, Get local stg area X
LV=4096, X
BNDRY=PAGE
LR R10,R1
ST R10,NCBTKN Set area addr as token
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the page
*
USING NJEWK,R10
MVC NJEEYE,=CL4'NSPL' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
*
INIT010 EQU *
USING NJEWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
L R11,=A(NJECMN) -> common csect
ST R11,ANJECMN Save addr
USING NJECMN,R11
*
*
INIT100 EQU *
LA R14,* -> location of error source v110
SR R1,R1 Clear for IC
IC R1,NCBREQ Get request type
SLL R1,2 Multiply by 4 to make index
C R1,=A(INIT120-INIT110) Size of branch table
BH ERR1201 Exit if req type invalid
B INIT110(R1) Branch to requested function
*
INIT110 B ERR1201 00 Invalid function
B OPN000 01 Open NETSPOOL dataset
B CLS000 02 Close NETSPOOL dataset
B PUT000 03 Write a logical record
B GET000 04 Read a logical record
B PUR000 05 Purge a file from NETSPOOL
B FID000 06 Locate a file by file id
B CON000 07 Get a list of files in NETSPOOL
B UDR000 08 Update directory entry v120
*
INIT120 EQU * Must mark end of branch table
*
* NJE00920
******************** NJE00920
* * NJE00920
* OPEN DATASET * NJE00920
* NCBREQ = X'01' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
*
*- Get storage for NETSPOOL block
*
OPN000 EQU *
GETMAIN RU, Get stg for NETSPOOL blocks X
LV=3*4096, X
BNDRY=PAGE
ST R1,BLOCK This is the VSAM AREA
LR R3,R1 R3 for now
LA R2,4089(,R1) -> end of BLOCK record size
ST R2,BLOCKEND Save it
A R1,=F'4096' -> 2nd page
ST R1,PTRBUF This is an internal rec'd buffer
ST R1,PTRPOS Save also as internal write pos
LA R2,4084(,R1) -> end of ptr part of PTRBUF
ST R2,PTRBUFEN Save it (bytes 4084-4089 special
A R1,=F'4096' -> 2nd page
ST R1,BUFF This is an internal rec'd buffer
ST R1,PUTPOS Save also as internal write pos
LA R1,4089(,R1) -> end of BUFF record size
ST R1,BUFFEND Save it
XC PTRBLK,PTRBLK Initialize
XC NEWBLK,NEWBLK Initialize
XC PUTCNT,PUTCNT Initialize (to be placed in TAG)
XC GETCNT,GETCNT Initialize (only used for debug)
*
GENCB BLK=ACB, x
DDNAME=NETSPOOL, x
MACRF=(OUT,KEY,DIR), x
MF=(G,MACLIST)
STM R0,R1,ACBL Save len, addr
*
LA R4,KEY -> block number argument
GENCB BLK=RPL, x
ACB=(*,ACB), x
AREA=(R3), -> block area x
AREALEN=4089, x
RECLEN=4089, x
ARG=(R4), x
OPTCD=(KEY,DIR,MVE,UPD), x
MF=(G,MACLIST)
STM R0,R1,RPLL Save len, addr
*
BAL R14,ENQ000 Get exclusive control
*
L R7,ACB -> ACB
MVC MACLIST(OPENL),OPEN Move macro model
OPEN ((R7)), Open NETSPOOL x
MF=(E,MACLIST)
*
BAL R14,CHKOC Check open/close result
BNZ EXIT08 Exit with VSAM error
OI NJFL1,NJF1OACB Indic ACB open
*
*-- Get NETSPOOL directory block ptr from block 1; determine if
*-- NETSPOOL has been formatted.
*
OPN040 EQU *
MVC KEY,=F'1'
L R7,RPL
GET RPL=(R7)
BAL R14,CHKRPL Check RPL result
BNZ EXIT08 Exit with VSAM error
*
ENDREQ RPL=(R7) Cancel the update request
BAL R14,CHKRPL Check RPL result
BNZ EXIT08 Exit with VSAM error
*
BAL R14,DEQ000 Release control
B EXIT00 Otherwise OPEN is complete
* NJE00920
* NJE00920
******************** NJE00920
* * NJE00920
* CLOSE DATASET * NJE00920
* NCBREQ = X'02' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
CLS000 EQU *
SR R5,R5 Clear possible RC
TM NJFL1,NJF1OACB Is ACB open?
BZ CLS090 No
BAL R14,ENQ000 Get exclusive control
*
TM NJFL1,NJF1PUT Processing PUTs against file?
BZ CLS050 N, skip close related PUT funcs.
*
CLC NCBTAG,=A(0) Is tag data present?
BE CLS050 0, Cant write a directory
*
TM NJFL1,NJF1WPND Is physical write pending?
BZ CLS030 No
NI NJFL1,255-NJF1WPND No physical write pending
*
MVC KEY,NEWBLK Prep for update of blk to write
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R3,PUTPOS -> logical record position
LA R3,2(,R3) Account for FFFF EOF marker
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,BUFF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
*
CLS030 EQU *
NC PTRBLK,PTRBLK Is ptr block write pending?
BZ CLS040
MVC KEY,PTRBLK Prep for update of blk to write
XC PTRBLK,PTRBLK Clear block number for recursion
OI NJFL1,NJF1DPND Indic directory add pending
*
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R3,PTRPOS -> ptr record position
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,PTRBUF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
*
CLS040 EQU *
TM NJFL1,NJF1DPND Directory add pending?
BZ CLS050 No
NI NJFL1,255-NJF1DPND Remove directory add pending
*
L R1,NCBTAG -> tag data
USING TAG,R1
MVC TAGRECNM,PUTCNT Save # records actually written
DROP R1
*
LA R0,DIRADD Add directory entry function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File to add is in NCB
LR R5,R15 Any RC to R5
*
CLS050 EQU *
L R7,ACB -> ACB
MVC MACLIST(CLOSEL),CLOSE Move close list
CLOSE ((R7)), Close the ACB x
MF=(E,MACLIST)
*
NI NJFL1,255-NJF1OACB ACB now closed
BAL R14,DEQ000 Release control
*
CLS090 EQU *
L R1,BLOCK -> NETSPOOL record areas
FREEMAIN RU,LV=3*4096,A=(1) Release it v200
*
LM R0,R1,RPLL
FREEMAIN RU,LV=(0),A=(1)
*
LM R0,R1,ACBL
FREEMAIN RU,LV=(0),A=(1)
*
XC NCBTKN,NCBTKN Clear token
B QUIT000 Exit with RC in R5
* NJE00920
* NJE00920
******************** NJE00920
* * Write a logical record (not a physical block) NJE00920
* PUT * NJE00920
* NCBREQ = X'03' * No ENQ is required when writing the physical NJE00920
* * blocks as these blocks are allocated exclusively NJE00920
******************** to the calling task. NJE00920
* NJE00920
PUT000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
TM NJFL1,NJF1GET Processing GETs against file?
BO ERR1205 Yes, cant do PUT now
OI NJFL1,NJF1PUT Indicate PUT in progress
*
NC PTRBLK,PTRBLK Do we have a ptr block?
BNZ PUT020 Yes
BAL R14,GETBLK Allocate a new physical block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,PTRBLK Save block number of ptr blk
ST R0,INITBLK Save first block # used in PUT
L R0,PTRBUF -> ptr block area
LA R1,4089 Size of physical block
LR R3,R1 Compute length to write out
MVCL R0,R2 Clear the ptr block
MVC PTRPOS,PTRBUF Set write position in block
*
BAL R14,GETBLK Allocate a new physical block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,NEWBLK Save allocated blk #
MVC PUTPOS,BUFF Set write position in block
L R1,PTRPOS Get current ptr block position
ST R0,0(,R1) Save new blk# in ptr block
LA R1,4(,R1) Next ptr block slot
ST R1,PTRPOS Update position
*
PUT020 EQU *
L R3,PUTPOS Get current position
L R1,BUFFEND -> end of buffer
SR R1,R3 Determine remaining space in blk
LH R4,NCBRECLN Get size of record to write
LA R2,2+2(,R4) Add in overhead
* +2 for length halfword
* +2 for next block marker
CR R1,R2 Is there room to add record?
BL PUT100 No, better get another block
*
L R15,NCBAREA -> to logical record
BCT R4,*+10 Adjust len for execute
PUTREC MVC 2(0,R3),0(R15)
EX R4,PUTREC Move record to block
LA R4,1+2(,R4) Get record len + overhead
* +1 to get back true length
* +2 for length halfword itself
STCM R4,3,0(R3) Store the length
*
TM NCBFL1,NCBPUN Is this PUN type data?
BO PUT050 Y, no special action
TM 2(R3),X'03' Is carriage ctl an immediate?
BO PUT060 Y, Don't count these records
*
PUT050 EQU *
L R1,PUTCNT Get count of records written
LA R1,1(,R1) Bump it
ST R1,PUTCNT Update count
*
PUT060 EQU *
AR R3,R4 Compute next avail byte in blk
MVC 0(2,R3),=X'FFFF' Set current EOF marker in case
* we write no more records
ST R3,PUTPOS Save write position for next
* record; would overwrite the
* FFFF marker on next PUT.
OI NJFL1,NJF1WPND Indicate physical write req'd
B EXIT00
*
PUT100 EQU *
L R5,NEWBLK Get current blk # we need to wrt
BAL R14,GETBLK Allocate a new physical block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,NEWBLK Save newly allocated blk #
MVC 0(2,R3),=X'FFFE' Insert ptr indic for next blk
LA R3,2(,R3) -> next write position
*
ST R5,KEY Prep for update of blk to write
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,BUFF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
MVC PUTPOS,BUFF Reset write position in new blk
NI NJFL1,255-NJF1WPND No physical write pending
*
*-- Now ensure newly allocated block is also pointed to by ptr block
*
L R3,PTRPOS Get current ptr block position
MVC 0(4,R3),NEWBLK Save new blk# in ptr block
LA R3,4(,R3) Next ptr block slot
C R3,PTRBUFEN Is ptr block full?
BNL PUT200 Yes
ST R3,PTRPOS Update position
B PUT020 Now retry to add next logical
*
*-- Here if we need another ptr block (chain them together)
*
PUT200 EQU *
L R5,PTRBLK Get current blk # we need to wrt
BAL R14,GETBLK Allocate a new phys ptr block
BNZ EXIT08 Exit with VSAM error
LTR R0,R0 Is there a block number?
BZ ERR1203 NETSPOOL dataset full
ST R0,PTRBLK Save newly allocated blk #
ST R0,0(,R3) Insert ptr to next ptr blk in
* full ptr block
MVI 0(R3),X'FE' Indic "ptr to next ptr blk" and
* not ptr to a data block
LA R3,4(,R3) -> next write position
*
ST R5,KEY Prep for update of blk to write
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R2,PTRBUF -> buffer to write out
SR R3,R2 Compute length to write out
MVCL R0,R2 Move data and pad remaining
*
PUT RPL=(R7) Update the physical block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R0,PTRBUF -> ptr block area
LA R1,4089 Size of physical block
LR R3,R1 Compute length to write out
MVCL R0,R2 Clear the ptr block
MVC PTRPOS,PTRBUF Reset ptr position in new blk
B PUT020 Now retry to add next logical
* NJE00200
*
* NJE00920
******************** NJE00920
* * Read a logical record (not a physical block) NJE00920
* GET * NJE00920
* NCBREQ = X'04' * No ENQ is required when reading the physical NJE00920
* * blocks as these blocks are allocated exclusively NJE00920
******************** to the calling task. The file id to read must NJE00920
* be in NSID in the tag data pointed to by NCBTAG
* NJE00920
GET000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
TM NJFL1,NJF1PUT Processing PUTs against file?
BO ERR1205 Yes, cant do GET now
OI NJFL1,NJF1GET Indicate GET in progress
*
L R7,RPL -> RPL
NC PTRBLK,PTRBLK Do we have a ptr block in prog?
BNZ GET060 Yes, read next logical rec
*
LA R0,DIRLOC Locate file function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File id is in tag field TAGID
*
LTR R15,R15 Was file found?
BZ GET010 Yes
C R15,=F'12' Errors processing directory?
BL EXIT08 Exit here if 4 or 8=VSAM errors
B EXIT12 All others Exit12
*
GET010 EQU *
MODCB RPL=(R7), x
OPTCD=(KEY,DIR,MVE,NUP), No update needed on GETs x
MF=(G,MACLIST)
*
L R3,NCBTAG -> tag data
USING TAG,R3
MVC GETLIM,TAGRECNM Save off # of records in file
DROP R3
*
L R3,INITBLK Get 1st block # of file
*
GET020 EQU * ** Get a ptr block
ST R3,KEY Set block retrieval key
GET RPL=(R7) Get the ptr block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
ST R3,PTRBLK Save ptr blk #
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer containing repl dir
LR R15,R1 Copy length
MVCL R14,R0 Put ptr data in ptrbuf
*
L R4,PTRBUF -> ptr block ptrs
ST R4,PTRPOS Maintain ptr position
*
GET030 EQU *
C R4,PTRBUFEN Out of ptrs this block?
BL GET040 No
*
* ** Here if ptr block chains to
* another ptr block
CLI 0(R4),X'FE' ptr to ptrblk indicator?
BNE GET200 EOF No, done with ptrs
SR R3,R3 Clear for IC
ICM R3,7,1(R4) Get ptr to next ptr block
ST R3,KEY Set up for retrieval
B GET020 Go get it
*
GET040 EQU *
ICM R2,15,0(R4) Get a data block #
BZ GET200 EOF Done with ptrs
*
ST R2,KEY Set block retrieval key
GET RPL=(R7) Get the ptr block
BAL R14,CHKRPL Deal with errors
BNZ EXIT08 Exit with VSAM error
*
L R5,BLOCK -> VSAM i/o area
ST R5,GETPOS Maintain read position
*
GET060 EQU *
L R5,GETPOS -> next logical record to read
CLC 0(2,R5),=X'FFFF' Is this end of file?
BE GET200 Yes
CLC 0(2,R5),=X'FFFE' Skip to next ptr indication?
BE GET100 Yes
*
SR R14,R14 Clear for IC
ICM R14,3,0(R5) Get the record length
BCTR R14,0 Reduce length of length
BCTR R14,0 Reduce length of length
STH R14,NCBRECLN Return length to caller
*
L R15,NCBAREA -> to caller's record buffer
BCT R14,*+10 Adjust len for execute
GETREC MVC 0(0,R15),2(R5)
EX R14,GETREC Move record to user area
LA R5,1+2(R14,R5) Get record len + overhead
* +1 to get back true length
* +2 for length halfword itself
ST R5,GETPOS Save read position
L R1,GETCNT Get count of records read
LA R1,1(,R1) Bump it
ST R1,GETCNT Update count for debug purposes
B EXIT00 Exit with record in NCBAREA
*
GET100 EQU *
L R4,PTRPOS Get ptr position
LA R4,4(,R4) -> next ptr field
ST R4,PTRPOS Maintain ptr position
B GET030 Go process next ptr
*
GET200 EQU *
MVI NCBERRCD,X'04' Indicate EOF
B EXIT08
* NJE00920
* NJE00920
******************** NJE00920
* * Delete a file from the NETSPOOL dataset NJE00920
* PURGE * NJE00920
* NCBREQ = X'05' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
PUR000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
*
LA R0,DIRDEL Del file function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File to del is in NCB ???
LR R5,R15 Any RC to R5
B QUIT000
*
* NJE00920
******************** NJE00920
* * Locate a file in the directory by file id NJE00920
* LOCATE * NJE00920
* NCBREQ = X'06' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
FID000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
*
LA R0,DIRLOC Locate file function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15 File id is in tag field TAGID
LR R5,R15 Any RC to R5
B QUIT000
*
* NJE00920
******************** NJE00920
* * Return a list of files in NETSPOOL dataset NJE00920
* CONTENTS * NJE00920
* NCBREQ = X'07' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
CON000 EQU *
LA R14,* -> location of error source v110
TM NJFL1,NJF1OACB Is ACB open?
BZ ERR1202 No
*
LA R0,DIRLST List files function
L R15,=A(NJEDIR) Call directory mgmt
BALR R14,R15
LR R5,R15 Any RC to R5
B QUIT000
*
* NJE00920
******************** NJE00920
* * Update a directory entry by file id v120 NJE00920
* UDIR * NJE00920
* NCBREQ = X'08' * NJE00920
* * NJE00920
******************** NJE00920
* NJE00920
UDR000 EQU * v120
LA R14,* -> location of error source v120
TM NJFL1,NJF1OACB Is ACB open? v120
BZ ERR1202 No v120
* v120
LA R0,DIRUPD Update dir function v120
L R15,=A(NJEDIR) Call directory mgmt v120
BALR R14,R15 v120
LR R5,R15 Any RC to R5 v120
B QUIT000 v120
*
*
ERR1201 EQU * Invalid NCBREQ function code
MVI NCBERRCD,X'01' Set error code
B EXIT12
*
ERR1202 EQU * ACB is not open
MVI NCBERRCD,X'02' Set error code
B EXIT12
*
ERR1203 EQU * NETSPOOL dataset is full
MVI NCBERRCD,X'03' Set error code
B EXIT12
*
ERR1204 EQU * File # not found in directory
MVI NCBERRCD,X'04' Set error code
B EXIT12
*
ERR1205 EQU * GET attempted in PUT mode, or,
* PUT attempted in GET mode
MVI NCBERRCD,X'05' Set error code
B EXIT12
*
ERR1206 EQU * No files in directory (NCBCON)
MVI NCBERRCD,X'06' Set error code
B EXIT12
*
* NJE00200
* Exit points NJE00200
* NJE00200
* NJE00200
* NJE00200
EXIT00 EQU * NJE00210
SR R5,R5 Set RC=0
B QUIT000
*
* Exit04 reasons:
* All VSAM OPEN/CLOSE and RPL errors.
*
EXIT04 EQU * NJE00210
LA R5,4 Set RC=4
B QUIT000
*
* Exit08 reasons:
* All VSAM OPEN/CLOSE and RPL errors.
*
EXIT08 EQU * NJE00210
C R15,=F'4' Is is really RC 4?
BE EXIT04 Reflect the truth
LA R5,8 Set RC=8
B QUIT000
*
* Exit12 reasons:
* NETSPOOL dataset is full (no available blocks)
* NCBREQ contains invalid/unsupported function code
* File is not open
* File # is not found in directory
* GET issued during PUT activity
* PUT issued during GET activity
*
EXIT12 EQU * NJE00210
ST R14,NCBMACAD Save error address v110
LA R5,12 Set RC=12
B QUIT000
*
* Exit16 reasons:
* R1 = zero on entry
* R1 doesnt point to NCB ('NCB ' in 1st four bytes)
* NCBTKN is zero but NCBREQ is not NCBOPEN
* NCBTKN doesnt point to area containing 'NSPL'
*
EXIT16 EQU * NJE00210
L R13,4(,R13) -> caller's sa NJE00210
LA R5,16 Set RC=16
B QUIT090
*
QUIT000 EQU *
STC R5,NCBRTNCD Set R15 return code
BAL R14,DEQ000 Remove any ENQ
L R13,4(,R13) -> caller's sa NJE00210
CLC NCBREQ(3),=AL1(NCBGET,8,4) EOF on a NCBGET function?
BNE QUIT020 No
ICM R15,15,NCBEODAD Get EODAD address
BZ QUIT020 If none, let 8,4 rtn cd pass
ST R15,12(,R13) Set R14 return to EODAD address
XC NCBRTNCD(2),NCBRTNCD Remove EOF error indicators
SR R5,R5 Set RC=0
*
QUIT020 EQU *
CLI NCBREQ,NCBCLOSE Is this a close request?
BNE QUIT090 No. Exit without free stgs
*
LR R1,R10 -> NJEWK main work area page
FREEMAIN RU, x
LV=4096, x
A=(1)
*
QUIT090 EQU *
ST R5,16(,R13) Set RC in R15
LM R14,R12,12(R13) Reload callers's regs NJE00220
BR R14 Return NJE00240
* NJE00250
LTORG NJE00280
*
*
OPEN OPEN 0,MF=L
OPENL EQU *-OPEN
CLOSE CLOSE 0,MF=L
CLOSEL EQU *-CLOSE
*
*
DROP R12
*
* NJE00920
********************* NJE00920
* N J E C M N * NJECMN hosts small routines and NJE00920
* * frequently used constants NJE00920
* Common routines * NJE00920
* and constants * via base register 11 NJE00920
* * NJE00920
********************* NJE00920
* NJE00920
NJECMN CSECT NJE00020
DC A(0) No branch around constants
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECMN'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
USING NJECMN,R11
USING NJEWK,R10
*
*-- Check result of VSAM OPEN or CLOSE macro
*
CHKOC EQU *
LTR R15,R15 Did request succeed?
BZR R14 Yes return
ST R14,NCBMACAD Save addr of failing macro
STC R15,NCBRTNCD Set return code
MVC NCBERRCD,ACBERFLG-IFGACB(R7) error code
BR R14 Return with VSAM error
*
*-- Check result of VSAM RPL macros
*
CHKRPL EQU *
LTR R15,R15 Did request succeed?
BZR R14 Yes return
ST R14,NCBMACAD Save addr of failing macro
STC R15,NCBRTNCD Set return code
MVC NCBERRCD,RPLERRCD-IFGRPL(R7) error code
BR R14 Return with VSAM error
*
*
ENQ000 EQU *
TM NJFL1,NJF1ENQ Is ENQ active?
BOR R14 Return if so
*
ST R14,SV14 Save return addr
ENQ (NJE38Q,NJEDSN,E,44,SYSTEM), X
RET=NONE
*
OI NJFL1,NJF1ENQ ENQ active
L R14,SV14 Reload return addr
BR R14 Return
*
*
DEQ000 EQU *
TM NJFL1,NJF1ENQ Is ENQ active?
BZR R14 Return if not
*
ST R14,SV14 Save return addr
DEQ (NJE38Q,NJEDSN,44,SYSTEM), X
RET=NONE
NI NJFL1,255-NJF1ENQ ENQ off
L R14,SV14 Reload return addr
BR R14 Return
* NJE00200
* NJE00200
*-- ADDBLK / GETBLK routines NJE00200
* NJE00200
*-- Allocate a new physical block. Scan the allocation map for a free NJE00200
*-- block and mark it as taken, and return the new block number to the NJE00200
*-- caller.
*
*-- ADDBLK and GETBLK are functionally identical except that ADDBLK
*-- does not ENQ or DEQ on NETSPOOL; it is assumed that the caller
*-- already has done that (the DIR functions).
*
*-- Uses R14-R4,R7. R1-R4 are preserved across call
* NJE00200
*-- Entry: None NJE00200
* NJE00200
*-- Exit: R15 = 0 if ok, else RC from VSAM macro. NJE00200
* R0 = block # of new block. If R0=0, no blocks available. NJE00200
* NJE00200
ADDBLK EQU *
ST R14,SV14GB Save return addr
STM R1,R4,SVGB Save caller's regs
BAL R14,GETB000 Go allocate the block
LTR R15,R15 VSAM RC in R15, set CC
LR R0,R4 Return block # in R0
LM R1,R4,SVGB Load caller's regs
L R14,SV14GB Load return addr
BR R14 Return
* NJE00200
GETBLK EQU *
ST R14,SV14GB Save return addr
STM R1,R4,SVGB Save caller's regs
BAL R14,ENQ000 Get exclusive control
BAL R14,GETB000 Go allocate the block
LR R3,R15 Save R15 across DEQ
BAL R14,DEQ000 Release control
LTR R15,R3 Return VSAM RC in R15, set CC
LR R0,R4 Return block # in R0
LM R1,R4,SVGB Load caller's regs
L R14,SV14GB Load return addr
BR R14 Return
*
GETB000 EQU *
ST R14,SV14B0 Save return addr
LA R2,ALLOCNUM Get # of alloc map blocks
LA R3,ALLOCBLK Get 1st alloc map block #
LA R4,1 Starting relative block #
*
GETB010 EQU *
ST R3,KEY Set retrieval key
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ GETB090 Exit with VSAM error
*
L R14,BLOCK -> allocation map
LA R15,4089 # of entries in map
L R1,=X'FF000000' Set pad char=X'FF'
CLCL R14,R0 Look for a non-FF entry
BE GETB030 all FFs: We're full up in this block
*
LR R1,R14 Copy ptr to map byte
S R1,BLOCK Compute offset from start
SLL R1,3 Each map byte is 8 records
AR R4,R1 Adjust relative block number for
* byte position we located
ICM R1,8,0(R14) Get map byte with the free bit
LA R2,X'80' Create possible opposing bit
*
GETB020 EQU *
SR R0,R0 Clear for shift use
SLDL R0,1 Shift off one bit into R0
LTR R0,R0 Is this the zero bit?
BZ GETB040 Yes
SRL R2,1 Next opposing bit position
LA R4,1(,R4) Compute next rel blk #
B GETB020 Find that 0 bit
*
GETB030 EQU *
LA R4,4089(,R4) Incr starting relative block #
LA R3,1(,R3) Next map block key
BCT R2,GETB010 Read next map block
*
ENDREQ RPL=(R7) No update
SR R4,R4 Return no block #: ALL FULL
SR R15,R15 No VSAM errors
B GETB090 Done
*
SETMAP OI 0(R14),X'00' Executed instr
*
GETB040 EQU *
EX R2,SETMAP Set the bit in allocation map
*
PUT RPL=(R7) Update the allocation map
BAL R14,CHKRPL Deal with errors
*
GETB090 EQU *
L R14,SV14B0 Load return addr
BR R14 Return
*
*
LTORG
*
WTOMSG WTO ' x
',MF=L
WTOMSGL EQU *-WTOMSG
*
ENQ ENQ (0),MF=L
ENQL EQU *-ENQ
*
DEQ DEQ (0),MF=L
DEQL EQU *-DEQ
*
DS 0D
NJE38Q DC CL8'NJE38'
NJEDSN DC CL44'NJE38.NETSPOOL'
*
BLANKS DC CL120' '
NONBLANK DC 64X'FF',X'00',191X'FF' TR Table to locate nonblank
BLANK DC 64X'00',X'FF',100X'00' TR Table to locate blanks
TRTAB$ DC 91X'00',X'FF',164X'00' TR Table to locate '$'
HEXTRAN DC CL16'0123456789ABCDEF' Translate table
* NJE00920
* NJE00920
********************* NJE00920
* * NJE00920
* N J E D I R * NJE00920
* * NJE00920
* Directory * NJE00920
* Management * NJE00920
* * NJE00920
********************* NJE00920
* NJE00920
*
NJEDIR CSECT NJE00020
B 28(,R15) BRANCH AROUND EYECATCHERS
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJEDIR'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
STM R14,R12,12(R13) SAVE CMS REGS NJE00050
LR R12,R15 BASE NJE00060
USING NJEDIR,R12 ADDRESS IT NJE00070
USING NJEWK,R10
USING NCB,R9
*
ST R13,NJEDIRSA+4 SAVE prv S.A. ADDR NJE00080
LA R1,NJEDIRSA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
L R11,=A(NJECMN) -> common csect
ST R11,ANJECMN Save addr
USING NJECMN,R11
*
DIRADD EQU 0 Add new file to directory
DIRDEL EQU 4 Purge a file from directory
DIRLOC EQU 8 Locate a file by ID
DIRLST EQU 12 List directory contents
DIRUPD EQU 16 Update directory entry v120
*
LR R2,R0 Copy entry code
B *+4(R2) Branch into branch table
B ADD000 0 Add a new directory entry
B DEL000 4 Delete a directory entry
B LOC000 8 Locate a file by ID
B LST000 C List directory contents
B UPD000 10 Update directory entry v120
*
ADD000 EQU *
LA R0,(10000/8)+1 Byte size of 10,000 bits
ST R0,SPLIDLEN Save the length
GETMAIN RU, Get stg for spool id bitmap x
LV=(0)
ST R1,SPLIDMAP Save stg addr
LR R0,R1 Copy starting addr
L R1,SPLIDLEN Get the length
SR R15,R15 Set pad char
MVCL R0,R14 Initialize the map
*
BAL R14,ENQ000 Get exclusivity
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
MVC SPLID,SPLNUM Save the last assigned id #
L R2,DIRBLK Get blk# of current directory
DROP R2
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
*
*-- R2 = starting block number of current directory
*-- R3 = starting block number of replacement directory
*
*
ST R2,KEY Get a current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
ST R3,KEY Get a replacement dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
*-- Copy all of the directory entries in the current directory over
*-- to the (new) replacement directory (where we will eventually add
*-- a new directory entry). Along the way, build a bit map of all
*-- of the spool file numbers that are in use (they're in the
*-- directory entries) so that we can assign a new unique file # to
*-- the new file in its new directory entry.
*
L R4,BUFF -> current directory
L R5,BLOCK -> replacement directory
L R8,NSRECNM-NSDIR(,R4) Get # directory entries current
LA R1,1(,R8) +1 for new dir ent to be added
ST R1,NSRECNM-NSDIR(,R4) Store (will get copied to repl)
ST R3,NSBLK-NSDIR(,R4) Store starting blk of dir (will
* get copied to replacement dir)
*
ADD050 EQU *
CLC NSLEN-NSDIR(,R4),=X'FFFE' Ptr to next block?
BE ADD100 yes
MVC 0(NSDIRLN,R5),0(R4) Copy existing dir entry to repl
*
LH R7,NSID-NSDIR(,R4) Get file id # for this file
SR R6,R6 Clear for divide
D R6,=F'8' Get byte offset remainder bits
*
A R7,SPLIDMAP -> byte containing bit for
* this file #
LA R1,X'80' Create a bit
SRL R1,0(R6) Adjust to bit for this file #
EX R1,SPLSET Set the bit in the spool id map
*
LA R4,NSDIRLN(,R4) -> next current dir entry
LA R5,NSDIRLN(,R5) -> next replacement dir entry
BCT R8,ADD050 Keep copying dir entries
B ADD200 Go add the new dir entry
*
SPLSET OI 0(R7),X'00' Executed instr
*
*
*-- Here if the directory continues onto another block. Get these
*-- blocks, and continue processing individual entries.
*
ADD100 EQU *
L R7,RPL -> RPL
PUT RPL=(R7) Update the replacement block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
CLC NSLEN-NSDIR(,R5),=X'FFFE' Repl dir ptr to next block?
BNE ADD190 No; we need to add a block
*
ADD120 EQU *
ICM R2,15,2(R4) Get ptr to next current dir blk
ICM R3,15,2(R5) Get ptr to next repl dir blk
*
ST R2,KEY Get next current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
ST R3,KEY Get next replacement dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R4,BUFF -> current directory
L R5,BLOCK -> replacement directory
B ADD050 Continue processing
*
ADD190 EQU *
L R3,KEY Get current blk # we just wrote
*
BAL R14,ADDBLK Allocate a new physical block
BNZ ADD900 Exit with VSAM error
LTR R6,R0 Is there a block number?
BZ ADD910 No, NETSPOOL dataset full v130
*
ST R3,KEY Gotta update blk again with ptr
GET RPL=(R7) Get the physical block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
MVC 0(2,R5),=X'FFFE' Insert ptr indic for next blk
STCM R6,15,2(R5) Insert next block #
B ADD100 Now go jump to next dir blks
*
*-- Here when all current directory entries have been copied to the
*-- new (replacement) directory. Add the new directory entry for
*-- the file just written out via PUT actions.
*
ADD200 EQU *
L R1,BLOCKEND -> end of buffer
SR R1,R5 Determine remaining space in blk
LA R4,NSDIRLN Get size of directory entry
LA R4,2+4(,R4) Add in overhead
* +2 for n block marker
* +4 for next block ptr
CR R1,R4 Is there room to add entry?
BL ADD300 No, better get another block
*
USING NSDIR,R5
XC NSDIR(NSDIRLN),NSDIR Init new entry
MVC NSLEN,=Y(NSDIRLN) Set entry length
MVC NSBLK,INITBLK Set starting blk# of the file
L R6,NCBTAG -> TAG block for file
USING TAG,R6
MVC NSINLOC(TAGUSELN),TAGINLOC Tag data to dir entry
*
L R1,SPLID Get last assigned file id #
L R0,=F'10000' 10,000 possible spool ids
*
ADD250 EQU *
LA R15,1(,R1) Choose next number
C R15,=F'10000' At the limit?
BL *+8 No
LA R15,1 Reset to 1
LR R1,R15 Save next possible number
*
SR R14,R14 Clear for divide
D R14,=F'8' Get byte offset remainder bits
*
A R15,SPLIDMAP -> byte containing bit for
* this spool id #
LA R7,X'80' Create a bit
SRL R7,0(R14) Adjust to bit for this id #
EX R7,TMBIT Check bit status in the bitmap
BZ ADD260 Spool id not in use. take it
BCT R0,ADD250 Else try next number
SR R1,R1 Otherwise use id=0000
B ADD260
*
TMBIT TM 0(R15),X'00' Executed instr
*
*
*
ADD260 EQU *
ST R1,SPLID Save newly assigned spool id
STCM R1,3,NSID Assign the file id # to file
STCM R1,3,NCBFID Also put it in the NCB
STCM R1,3,TAGID Also, put it in the tag data
DROP R5,R6 NSDIR,TAG
*
LA R4,NSDIRLN(,R5) Skip past entry just added
L R5,BLOCKEND -> end of block
SR R5,R4 Compute length remaining in blk
SR R15,R15 Set pad
MVCL R4,R14 Clear to end of block
*
L R7,RPL -> RPL
PUT RPL=(R7) Update final replacement block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
*-- Now update block 1 to activate the replacement directory
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R1,BLOCK -> blk #1 in stg
USING BLKONE,R1
L R2,DIRBLK Get blk# of current directory
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
ST R3,DIRBLK Plug in alternate
MVC SPLNUM,SPLID Save last assigned spool id
DROP R1
*
L R7,RPL -> RPL
PUT RPL=(R7) Update block 1
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
B XITDIR Exit with RC=0
*
*-- Here if there is no room in a directory block to add the new
*-- file's directory entry. An additional block will be allocated and
*-- chained to the directory entries.
*
ADD300 EQU *
L R7,RPL -> RPL
PUT RPL=(R7) Write back the dir block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
L R4,KEY Get current blk # we just wrote
*
BAL R14,ADDBLK Allocate a new physical block
BNZ ADD900 Exit with VSAM error
LTR R6,R0 Is there a block number?
BZ ADD910 No, NETSPOOL dataset full v130
*
ST R4,KEY Gotta update blk again with ptr
GET RPL=(R7) Get the physical block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
MVC 0(2,R5),=X'FFFE' Insert ptr indic for next blk
STCM R6,15,2(R5) Insert next block #
*
L R7,RPL -> RPL
PUT RPL=(R7) Write back the dir block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
ST R6,KEY Now point to newly obtained blk
GET RPL=(R7) Get the physical block
BAL R14,CHKRPL Deal with errors
BNZ ADD900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
SR R3,R3 Pad
MVCL R0,R2 Clear it
*
L R5,BLOCK -> new block stg
B ADD200 Try again to add new dir entry
*
ADD900 EQU * VSAM Error return
* Error codes in NCB already
B XITDIR Exit with RC in R15
*
ADD910 EQU * No space in NETSPOOL
MVC NCBRTNCD(2),=X'0C03' Set to 12,3 code
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
LA R15,12 Set RC
B XITDIR Return that notice
*
*
*
*
*
DEL000 EQU *
GETMAIN RU, Get stg for alloc bitmap x
LV=16384
STM R0,R1,SPLIDLEN Save len,addr
*
L R7,RPL -> RPL
MODCB RPL=(R7), x
OPTCD=(KEY,DIR,MVE,UPD), Update mode x
MF=(G,MACLIST)
*
BAL R14,ENQ000 Get exclusivity
*
LA R2,ALLOCNUM Get # of alloc map blocks
LA R3,ALLOCBLK Get 1st alloc map block #
L R4,SPLIDMAP -> receiving stg area
*
DEL020 EQU *
ST R3,KEY Set retrieval key
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R14,BLOCK -> block just read
LA R15,4089 # of bytes in block
LR R5,R15 Copy len
MVCL R4,R14 Move alloc bitmap to stg area
*
LA R3,1(,R3) Next block number of alloc map
BCT R2,DEL020 Go read them all
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
L R2,DIRBLK Get blk# of current directory
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
DROP R2
*
*-- R2 = starting block number of current directory
*-- R3 = starting block number of replacement directory
*
*
ST R2,KEY Get a current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
ST R3,KEY Get a replacement dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
*
*-- Current directory is in BUFF
*-- Replacement directory will be in PTRBUF
*
*
*-- Copy all of the directory entries in the current directory over
*-- to the (new) replacement directory (where we will eventually delete
*-- a directory entry). Along the way, look for the entry to be
*-- purged.
*
L R4,BUFF -> current directory
L R5,PTRBUF -> replacement directory
L R8,NSRECNM-NSDIR(,R4) Get # directory entries current
LR R1,R8 Copy count
BCTR R1,0 Reduce for to-be-deleted file
ST R1,NSRECNM-NSDIR(,R4) Store (will get copied to repl)
ST R3,NSBLK-NSDIR(,R4) Store starting blk of dir (will
* get copied to replacement dir)
L R6,NCBTAG -> TAG data
LH R6,TAGID-TAG(,R6) Get file id number
XC INITBLK,INITBLK Clear file's starting blk #
*
DEL050 EQU *
CLC NSLEN-NSDIR(,R4),=X'FFFE' Ptr to next block?
BE DEL100 yes
CH R6,NSID-NSDIR(,R4) Is this the file to be purged?
BE DEL070
CLC NSLEN-NSDIR(,R5),=X'FFFE' Ptr to next block?
BE DEL120 yes
MVC 0(NSDIRLN,R5),0(R4) Copy existing dir entry to repl
LA R5,NSDIRLN(,R5) -> next replacement dir entry
*
DEL060 EQU *
LA R4,NSDIRLN(,R4) -> next current dir entry
BCT R8,DEL050 Keep copying dir entries
B DEL200 Done with copy
*
DEL070 EQU *
MVC INITBLK,NSBLK-NSDIR(R4) Save starting block # of file
B DEL060 Continue copy
*
*
*-- Get next current dir block (move it to BUFF)
*
DEL100 EQU *
ICM R2,15,2(R4) Get ptr to next current dir blk
*
ST R2,KEY Get next current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,BUFF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
L R4,BUFF -> current directory
B DEL050 Continue with copy
*
*-- Get next replacement dir block
*-- 1. Write back the replacement we've been copying to (from PTRBUF)
*-- 2. Get next block
*-- 3. Move it to PTFBUF
*
DEL120 EQU *
ST R3,KEY Set blk# of repl dir block
L R7,RPL -> RPL
GET RPL=(R7) Get the block for update
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer containing repl dir
LR R15,R1 Copy length
MVCL R0,R14 Move data to i/o buffer
*
L R7,RPL -> RPL
PUT RPL=(R7) Update the replacement block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
ICM R3,15,2(R5) Get ptr to next current dir blk
*
ST R3,KEY Get next current dir block
L R7,RPL -> RPL
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer to place block
LR R15,R1 Copy length
MVCL R14,R0 Move data
L R5,PTRBUF -> replacement directory
B DEL050 Continue with copy
*
*-- Fix up the last replacement dir block
*
DEL200 EQU *
L R1,PTRBUF -> start of buffer
LA R15,4088(,R1) -> end of that buffer - 1
*
DEL210 EQU *
CR R1,R15 Past end of buffer?
BH DEL230 Y, done searching
CLC 0(2,R1),=X'FFFE' Left over pointer indicator?
BE DEL220 Yes
LA R1,NSDIRLN(,R1) Next dir entry position
B DEL210
*
DEL220 EQU *
ICM R7,15,2(R1) Pick up the left over block #
BAL R14,FREBLK Go free the block in R7
*
DEL230 EQU *
LR R0,R5 -> end of used part of ptrbuf
L R1,PTRBUF -> start of buffer
LA R1,4089(,R1) -> end of that buffer
SR R1,R5 Compute length to clear
SR R15,R15 Compute length to write out
MVCL R0,R14 Clear to end of block
*
ST R3,KEY Set blk# of repl dir block
L R7,RPL -> RPL
GET RPL=(R7) Re-get for update
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R0,BLOCK -> VSAM i/o area
LA R1,4089 Size of physical block
L R14,PTRBUF -> buffer containing repl dir
LR R15,R1 Copy length
MVCL R0,R14 Move repl data to i/o buffer
*
PUT RPL=(R7) Update the last repl block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
*-- DEL300 is used to free all of the blocks used by the file itself
*
DEL300 EQU *
ICM R7,15,INITBLK Get 1st block # of deleted file
BZ DEL910 If 0, file # wasn't found
*
DEL310 EQU *
ST R7,KEY Set block retreival key
BAL R14,FREBLK Mark the block as free in bitmap
*
L R7,RPL -> RPL
GET RPL=(R7) Get the ptr block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R4,BLOCK -> ptr block ptrs
LA R5,4084(,R4) -> end of ptr block ptrs
*
DEL330 EQU *
ICM R7,15,0(R4) Get a block #
BZ DEL350 Done with ptrs
BAL R14,FREBLK Free the block
LA R4,4(,R4) -> next ptr field
CR R4,R5 At end of ptr block?
BL DEL330
* ** Here if ptr block chains to
* another ptr block
CLI 0(R4),X'FE' Ptr to ptr blk indicator?
BNE DEL350 No, we've processed last ptr
SR R7,R7 Clear for IC
ICM R7,7,1(R4) Get ptr to next ptr block
B DEL310
*
*-- Write back the allocation map
*
DEL350 EQU *
LA R2,ALLOCNUM Get # of alloc map blocks
LA R3,ALLOCBLK Get 1st alloc map block #
L R4,SPLIDMAP -> map stg area
*
DEL360 EQU *
ST R3,KEY Set retrieval key
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R14,BLOCK -> block just read
LA R15,4089 # of bytes in block
LR R5,R15 Copy len
MVCL R14,R4 Move alloc bitmap to i/o buffer
*
PUT RPL=(R7) Put the map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
LA R3,1(,R3) Next block number of alloc map
BCT R2,DEL360 Go read them all
*
*-- Now update block 1 to activate the replacement directory
*
DEL400 EQU *
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
*
L R1,BLOCK -> blk #1 in stg
USING BLKONE,R1
L R2,DIRBLK Get blk# of current directory
LA R3,1 Load XOR counterpart
XR R3,R2 Compute alternate directry blk#
ST R3,DIRBLK Plug in alternate
DROP R1
*
L R7,RPL -> RPL
PUT RPL=(R7) Update block 1
BAL R14,CHKRPL Deal with errors
BNZ DEL900 Exit with VSAM error
B XITDIR Exit with RC=0
*
DEL900 EQU * VSAM Error return
* Error codes in NCB already
B XITDIR Exit with RC in R15
*
DEL910 EQU * ** Here if directry entry not found
MVC NCBRTNCD(2),=X'0C04' Set to 12,4 code
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
LA R15,12 Set RC
B XITDIR Exit with RC in R15
*
*-- Free a block (mark it available in the allocation bitmap)
*
*-- Entry: R7 = block #
*
FREBLK EQU *
BCTR R7,0 Make blk # relative to 0
SR R6,R6 Clear for divide
D R6,=F'8' Get byte offset remainder bits
*
A R7,SPLIDMAP -> byte containing bit for
* this block
LA R1,X'80' Create a bit
SRL R1,0(R6) Adjust to bit for this blk #
LA R0,X'FF' Create AND mask
XR R1,R0 Compute mask to turn a bit off
EX R1,FREBIT Turn off the bit in the bitmap
BR R14 Return
*
FREBIT NI 0(R7),X'00' Executed instr
*
*
*
* LOC000 - FIND a file by id in the directory. v120
* UPD000 - UDIR update a directory entry for a specific file. v120
*
*
*-- UDIR functionality only updates the destination node id and v120
*-- destination user id within the directory entry from v120
*-- the TAG data supplied by the caller. No other directory v120
*-- fields are altered. v120
*
*
LOC000 EQU *
UPD000 EQU * v120
BAL R14,ENQ000 Get exclusivity
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ LOC900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
L R2,DIRBLK Get blk# of current directory
DROP R2
*
*
ST R2,KEY Get a current dir block
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LOC900 Exit with VSAM error
*
*
L R4,BLOCK -> current directory
USING NSDIR,R4
L R8,NSRECNM Get # directory entries current
*
L R6,NCBTAG -> TAG data
USING TAG,R6
XC INITBLK,INITBLK Clear file's starting blk #
*
LOC050 EQU *
CLC NSLEN,=X'FFFE' Ptr to next block?
BNE LOC060 No
*
ICM R2,15,2(R4) Get ptr to next current dir blk
ST R2,KEY Get next current dir block
*
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LOC900 Exit with VSAM error
L R4,BLOCK -> next directory block
*
LOC060 EQU *
CLC TAGID,NSID Is this the file we need?
BE LOC070
*
LA R4,NSDIRLN(,R4) -> next current dir entry
BCT R8,LOC050 Keep looking
B LOC100 Done with search
*
LOC070 EQU *
CLI NCBREQ,NCBUDIR Is this UDIR function? v120
BE UPD100 Yes v120
*
MVC INITBLK,NSBLK Save starting block # of file
MVC TAGINLOC(TAGUSELN),NSINLOC Return the tag data to callr
*
*
LOC100 EQU *
ENDREQ RPL=(R7) Release the get-for-update
*
NC INITBLK,INITBLK Did we find a file?
BZ LOC910 No, exit with not found error
SR R15,R15 Set RC to 0
B XITDIR
*
*
UPD100 EQU * v120
MVC NSTOLOC,TAGTOLOC Update destination node id v120
MVC NSTOVM,TAGTOVM Update destination user id v120
MVC TAGINLOC(TAGUSELN),NSINLOC Rtrn tag data to caller v120
MVC INITBLK,NSBLK Save file's startinblock # v120
*
PUT RPL=(R7) Update the directory v120
BAL R14,CHKRPL Deal with errors v120
BNZ LOC900 Exit if VSAM error v120
B XITDIR
*
DROP R6 TAG v120
DROP R4 NSDIR v120
*
*
LOC900 EQU * VSAM Error return
* Error codes in NCB already
B XITDIR Exit with RC in R15
*
LOC910 EQU * ** Here if directry entry not found
MVC NCBRTNCD(2),=X'0C04' Set to 12,4 code
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
LA R15,12 Set RC
B XITDIR Exit with RC in R15
*
*
*
*
*
LST000 EQU *
XC LISTLEN,LISTLEN Ensure no stray len
XC LISTADDR,LISTADDR Ensure no stray address
BAL R14,ENQ000 Get exclusivity
*
MVC KEY,=F'1' Get the first block
L R7,RPL -> RPL
GET RPL=(R7) Get a map block
BAL R14,CHKRPL Deal with errors
BNZ LST900 Exit with VSAM error
*
L R2,BLOCK -> blk #1 in stg
USING BLKONE,R2
L R3,ALMBLK Get blk# of alloc map v200
L R8,MAXBLK Get blk# in dataset v200
L R2,DIRBLK Get blk# of current directory
DROP R2
*
*-- Compute spool percentage full from alloc map v200
*
SR R5,R5 Init blks used counter v200
LR R6,R8 Copy max blocks in dataset v200
SRL R6,3 divide by 8 # map bytes represent'g blksv200
*
LST010 EQU * v200
ST R3,KEY Get a block of map v200
L R7,RPL -> RPL v200
GET RPL=(R7) Get a map block v200
BAL R14,CHKRPL Deal with errors v200
BNZ LST900 Exit with VSAM error v200
* v200
SR R0,R0 Clear for IC work v200
L R15,BLOCK -> record v200
LA R14,4089 # bytes to process v200
*
LST020 EQU * v200
CLI 0(R15),X'00' Map byte unallocated? v200
BE LST050 Dont count any v200
CLI 0(R15),X'FF' Map byte fully allocated? v200
BE LST060 Yes, count 8 blocks v200
LA R4,8 # bits in a byte v200
IC R0,0(,R15) Get a map byte v200
*
LST030 EQU * v200
SR R1,R1 Clear for shift v200
SRDL R0,1 Move a bit into R1 v200
LTR R1,R1 Was the bit=1? v200
BZ LST040 No, dont count it v200
LA R5,1(,R5) Count the block bit v200
*
LST040 EQU * v200
BCT R4,LST030 Scan whole byte v200
*
LST050 EQU * v200
BCT R6,LST070 # map bytes remaining to scnv200
B LST080 Done counting v200
*
LST060 EQU * v200
LA R5,8(,R5) All 8 blocks allocated v200
B LST050 Decr remaining and continue v200
*
LST070 EQU * v200
LA R15,1(,R15) -> next map byte v200
BCT R14,LST020 Keep scanning v200
LA R3,1(,R3) Bump alloc map block number v200
B LST010 Get another map block v200
*
LST080 EQU * v200
MH R5,=Y(100) Blocks used: prep for % calcv200
SR R4,R4 Clear for divide v200
DR R4,R8 Compute % full v200
AR R4,R4 Double remainder v200
CR R4,R8 Do we need to round up? v200
BL LST090 No v200
LA R5,1(,R5) Round up percent full v200
*
LST090 EQU * v200
STH R5,NCBPCT Return % full in NCB v200
*
*-- Retrieve directory contents v200
*
LST100 EQU *
ST R2,KEY Get a current dir block
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LST900 Exit with VSAM error
*
*
L R4,BLOCK -> current directory
USING NSDIR,R4
L R8,NSRECNM Get # directory entries
BCTR R8,0 Less 1 for directory itself
STCM R8,3,NCBRECCT Set entries count in NCB
LTR R8,R8 Were there any entries?
BZ LST910 No
SR R0,R0 Clear for multiply
LA R1,NSDIRLN Length of directory entry
MR R0,R8 Compute size of area needed
LR R0,R1 Copy size to r0
GETMAIN RU, Get stg area to hold entries x
LV=(0)
STM R0,R1,LISTLEN
LR R5,R1 -> where to place entries
LA R4,NSDIRLN(,R4) Skip over directory's own entry
*
*
LST150 EQU * v200
CLC NSLEN,=X'FFFE' Ptr to next block?
BNE LST160 No v200
*
ICM R2,15,2(R4) Get ptr to next current dir blk
ST R2,KEY Get next current dir block
*
GET RPL=(R7) Get a block
BAL R14,CHKRPL Deal with errors
BNZ LST900 Exit with VSAM error
L R4,BLOCK -> next directory block
*
LST160 EQU * v200
MVC 0(NSDIRLN,R5),0(R4) Move directory entry to stg area
LA R4,NSDIRLN(,R4) -> next dir entry
LA R5,NSDIRLN(,R5) -> next stg area slot
BCT R8,LST150 Keep loading v200
*
DROP R4 NSDIR
*
*
LST200 EQU * v200
ENDREQ RPL=(R7) Release the get-for-update
*
MVC NCBAREA,LISTADDR Return list stg addr
MVC NCBAREAL,LISTLEN Return list stg len
MVC NCBRECLN,=Y(NSDIRLN) Return size of each dir entry
SR R15,R15 Set RC to 0
B XITDIR
*
*
LST900 EQU * VSAM Error return
* Error codes in NCB already
LM R0,R1,LISTLEN Get stg area len, addr
LTR R0,R0 Is there an area?
BZ XITDIR No
FREEMAIN RU,LV=(0),A=(1) Else free it
SR R15,R15 Clear for RC
IC R15,NCBRTNCD Reinsert RC
B XITDIR Exit with RC in R15
*
LST910 EQU * ** Here if no files queued
ENDREQ RPL=(R7) Release the get-for-update v130
XC NCBAREA,NCBAREA No directory list obtained v110
MVC NCBRTNCD(2),=X'0C06' Set to 12,6 code
LA R15,12 Set RC
LA R14,* -> location of error source v110
ST R14,NCBMACAD Store into NCB v110
B XITDIR Exit with RC in R15
*
*
XITDIR EQU *
LR R5,R15 Any RC value to R5
BAL R14,DEQ000 Release the ENQ
*
ICM R1,15,SPLIDMAP Get spool id bitmap stg addr
BZ XITDIR10 Don't have a map
L R0,SPLIDLEN Size of bitmap
FREEMAIN RU,LV=(0),A=(1) Free the bitmap
XC SPLIDMAP,SPLIDMAP Clear unsed ptr
*
XITDIR10 EQU *
L R13,4(,R13) -> caller's sa NJE00210
*
ST R5,16(,R13) Set RC in R15
LM R14,R12,12(R13) Reload callers's regs NJE00220
BR R14 Return NJE00240
* NJE00290
LTORG
DROP R12
* NJE00290
**** Main work area common NJE00290
**** to all NJExxx CSECTs. NJE00290
* NJE00290
NJEWK DSECT
NJEEYE DS CL4'NSPL' Eyecatcher
NJEWKLEN DS F Getmain size of this area
NSOWN DS A -> TCB of caller
ANJECMN DS A -> NJECNM common csect NJE00320
*
DBLE DS D Work area NJE00310
TWRK DS 2D Work area
*
MACLIST DS XL160 Macro expansion area
*
SV14 DS A R14 save area
SV14GB DS A R14 save area
SV14B0 DS A R14 save area
SVGB DS 4F R1-R4 save area
SPLIDLEN DS F Length of spool id bitmap stg
SPLIDMAP DS A -> Spool file id bitmap
SPLID DS F Last assigned spool id number
LISTLEN DS F Length of contents stg area
LISTADDR DS A -> directory contents stg area
*
BLOCK DS A -> buffer for NETSPOOL VSAM i/o
BLOCKEND DS A -> end of BLOCK (BLOCK+4089)
PTRBUF DS A -> buffer for NJESPOOL ptr use
PTRBUFEN DS A -> end of PTRBUF (PTRBUF+4089)
BUFF DS A -> buffer for NJESPOOL use
BUFFEND DS A -> end of BUFF (BUFF+4089)
*
*
INITBLK DS F Blk # of first block to be written
* for a new file
PTRBLK DS F Blk # of current phys record for
* pointer block (NCBGET/NCTPUT)
NEWBLK DS F Blk # of current phys record for
* logical i/o (NCBGET/NCTPUT)
PUTPOS DS A Current write position in BUFF (next
* available write position)
GETPOS DS A Current read position in BLOCK (next
* available read position)
PTRPOS DS A Current write position in PTRBUF
* (next available write position)
PUTCNT DS F Number of logical records written
GETCNT DS F Number of logical records read
GETLIM DS F Max logical records in GET file
*
KEY DS F Relative block number key
ACBL DS F ACB length
ACB DS A -> ACB
RPLL DS F RPL length
RPL DS A -> RPL
*
NJFL1 DS X Flag bits
NJF1OACB EQU X'80' 1... .... NETSPOOL ACB is open
NJF1ENQ EQU X'40' .1.. .... Exclusive control of NETSPOOL
NJF1WPND EQU X'20' ..1. .... Physical write is pending
NJF1DPND EQU X'10' ...1 .... Directory add is pending
NJF1PUT EQU X'02' .... ..1. Processing PUTs to file
NJF1GET EQU X'01' .... ...1 Processing GETs from file
* .... xx.. Available
*
NJFL2 DS X Flag bits
NJFL3 DS X Flag bits
NJFL4 DS X Flag bits
*
*
*
*
NJESA DS 18F NJESPOOL OS save area NJE00300
NJEDIRSA DS 18F NJEDIR OS save area NJE00300
*
DS 0D Force doubleword size
NJEWKSZ EQU *-NJEWK
* NJE00930
*
BLKONE DSECT ** Maps block #1 in NETSPOOL
DIRBLK DS F Block number of current directry
ALMBLK DS F Block number of allocation map
MAXBLK DS F Highest block number in NETSPOOL
SPLNUM DS F Last assigned spool file #
BLKONESZ EQU *-BLKONE Size of dsect
* NJE00930
*
TYPPRT EQU X'40' PRT dev
TYPPUN EQU X'80' PUN dev
COPY NETSPOOL
COPY TAG
*
IFGACB
IFGRPL
*
END NJESPOOL NJE01000
./ ADD NAME=NJEINIT
*
*
*-- NJE38 - Initialization and start up
*
*
*
* Change log:
*
*
* 03 Mar 22 - Avoid 0C4 if no links in CONFIG, APF check, F NJE. v230
* 10 Dec 20 - Support for registered users and message queuing v220
* 04 Dec 20 - Expanded internal trace table support v212
* 29 Nov 20 - Use text-based configuration; alternate routes v211
* 02 Oct 20 - Use actual length for MGCR SEND cmds v210
* 01 Oct 20 - Put ENQ existence check in common module v210
* 10 Aug 20 - Use single NJESPOOL load for all STC NJE38 modules. v210
* 22 Jul 20 - Make non-swappable to eliminate long-wait delays v200
* 21 Jul 20 - Slightly delay auto-start of links on start-up. v200
* 02 Jul 20 - Default userid to CSA in support of TRANSMIT/RECEOVE v200
* 20 May 20 - Dont pass new file WREs for local node to cmd proc'g v120
* 05 May 20 - Abend SD23 if SVC 34 parmlist >=130 bytes. v102
* 04 May 20 - Show CONFIG assembly date and time on start up. v102
*
*
*
*
*
*
PRINT GEN
REGEQU REGISTER EQUATES
GBLC &VERS
*
* User abend codes
* U0038 - Unsupported/unrecognized CIB
* U0039 - VSAM error on NETSPOOL
*
* MSG numbers used:
*
* 0-34 used
* 35 - 39 available
* 42-79 used
* 163 used
*
*-- Program limits
*
TRACESZ EQU 64 Size in K of trace table v212
RQELIM EQU 256 # of preallocated RQEs
*
*
NJEINIT CSECT
NJEVER
STM R14,R12,12(R13) SAVE CMS REGS
LR R12,R15 BASE
USING NJEINIT,R12 ADDRESS IT
*
GETMAIN RU, Get local stg area X
LV=4096, X
BNDRY=PAGE
LR R10,R1
LR R1,R0 Copy length
LR R2,R0 Copy length
LR R0,R10 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the page
*
USING NJEMWK,R10
ST R13,NJESA+4 SAVE prv S.A. ADDR
LA R1,NJESA -> my save area
ST R1,8(,R13) Plug it into prior SA
LR R13,R1
*
MVC NJEEYE,=CL4'NJEM' Work area eyecatcher
ST R2,NJEWKLEN Save size of area in area
*
L R11,=A(NJECOM) -> common csect
USING NJECOM,R11
ST R11,ANJECOM Save in main work area
MVC CMDBLNK,BLANKS Init field
MVC RELAYID,=CL8'RELAY' Set RELAY entity id v220
LA R1,LINKS -> LINKTABL anchor word v211
ST R1,ALINKS Plug it into param list v211
LA R1,ROUTES -> RTE anchor word v211
ST R1,AROUTES Plug it into param list v211
LA R1,AUTHS -> AUTHLIST anchor word v211
ST R1,AAUTHS Plug it into param list v211
LA R1,REGUSER -> REGUSER anchor word v220
ST R1,AREGUSER Plug it into param list v220
*
INIT000 EQU * v200
SR R1,R1 Dont return spool DSN v210
L R15,=V(NJESYS) -> ENQ finder v210
BALR R14,R15 Check if NJE38 already act v210
LTR R15,R15 Look for RC=0=ENQ was found v210
BZ ERR999 Branch if NJE38 active v210
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE000I),NJE000I NJE38 v xx.xx
WTO ,MF=(E,MACLIST)
*
TESTAUTH FCTN=1 Are we authorized on entry? v230
LTR R15,R15 Check result v230
BZ INIT005 Branch if authorized v230
WTO 'NJE034I NJE38 is not APF-authorized' v230
B QUIT000 v230
*
INIT005 EQU * v230
SR R1,R1 v200
SYSEVENT TRANSWAP v200
CLM R1,1,=X'00' SYSEVENT RC=0? v200
BE INIT010 Yes v200
WTO 'NJE032I NJE38 could not enter non-swappable state' v200
B INIT020 v200
*
INIT010 EQU * v200
WTO 'NJE031I NJE38 is non-swappable' v200
*
INIT020 EQU * v200
MVC MACLIST(ESTAEL),ESTAE Move ESTAE parm list
L R6,=A(NJEDMP) Point to local ESTAE rtn
ESTAE (R6), Issue ESTAE X
CT, X
TERM=YES, X
PARAM=(R10), PARAM is work area address X
MF=(E,MACLIST)
*
*-- Scan the configuration and build control blocks
*
MODESET MODE=SUP
SR R0,R0 R0=0 scan entire configuration
LA R1,INITPARM -> parm list to pass to NJESCN
L R15,=V(NJESCN)
BALR R14,R15
LTR R15,R15
BNZ QUIT000
*
L R1,LINKS Get LINKTABL anchor v210
USING LINKTABL,R1
MVC LCLNODE,LINKID Set LCLNODE in param list v210
DROP R1
*
*-- Issue STIMER for keep alive to avoid S 522 abends
*
L R0,=A(NJETMR) -> Timer expiration exit
L R1,=A(INTVL) -> interval
STIMER REAL, Set timer X
(0), X
DINTVL=(1)
*
LOAD EP=NJESPOOL Load spool interface v210
ST R0,ANJESPL Store entry addr v210
*
LOAD EP=NJECMX Load command processor
ST R0,ANJECMX Store entry addr of processor
*
BAL R14,NET000 Check NETSPOOL status
BNZ QUIT000 Exit if NETSPOOL is not ready
*
INIT030 EQU *
MODESET MODE=SUP,KEY=ZERO
L R1,PSATOLD-PSA(0) v230
L R1,TCBJSCB-TCB(,R1) v230
L R1,JSCBCSCB-IEZJSCB(,R1) v230
USING CSCB,R1 v230
MVC CHUNIT(3),=C'NJE' v230
DROP R1 v230
*
STIDP CPUID Get the CPU ID
*
GETMAIN RU, Get CSA communication area x
LV=NJ38CSAZ, x
SP=241
*
ST R1,CSABLK Save addr of CSA stg area
USING NJ38CSA,R1
XC 0(NJ38CSAZ,R1),0(R1) Clear area
MVC NJ38NODE,LCLNODE Local node name to CSA
MVC NJ38DUSR,DEFUSER Default userid to CSA v200
MVC NJ38ASCB,PSAAOLD-PSA(0) Move ASCB addr of this space
LA R2,NJ38ECB -> cross memory ECB
ST R2,CSAECBAD Save address locally
DROP R1 NJ38CSA
*
SPKA X'80' Back to user key
*
MVC NJERNAME(8),NJERCON Set rname constant
MVC NJERNAME+8(4),CSABLK CSA stg addr to Rname
* JFCB DSN should already be here
LA R5,NJERNAME
MVC MACLIST(ENQL),ENQ Move macro model
*
ENQ (NJE38Q,(5),E,56,SYSTEM), x
RET=NONE, x
MF=(E,MACLIST)
OI NJFL1,NJF1ENQ Set NJE38 ENQ active
*
GETMAIN RU, Preallocate RQE storage x
LV=RQESZ*RQELIM
ST R1,ARQESTG Save the address
LR R2,R1 Copy length
LR R1,R0 Copy length
LR R0,R2 -> new stg area
SR R15,R15 set pad
MVCL R0,R14 Clear the stg
LA R0,RQELIM Get RQE limit
ST R0,RQENUM Save the value
*
*
*- Build trace table v212
*
GETMAIN RU, Get stg for trace table v212X
LV=TRACESZ*1024, v212X
BNDRY=PAGE v212
ST R1,ATRACE Save ptr to trace table v212
MVC 0(5,R1),=CL5'TRACE' v212
MVI 5(R1),C'T' So eyecatcher TRACETAB v212
MVI 6(R1),C'A' wont show in a dump v212
MVI 7(R1),C'B' in this load module v212
USING TRCCTL,R1 v212
ST R1,TRCSTRT Set start v212
ST R1,TRCCURR Set current v212
AR R0,R1 -> end v212
ST R0,TRCEND Set end v212
L R15,=A(NJETRC) -> Trace CSECT v212
ST R15,TRCRTN Set trace routine EPA v212
DROP R1 v212
*
*
*-- Initialize console processing to allow MVS modify and stop
*-- commands to control this address space
*
INIT040 EQU *
MVC MACLIST(EXTRACTL),EXTRACT Move macro model
LA R3,COMMAREA -> area to place comm area addr
EXTRACT (3), Get ptr to comm area X
FIELDS=COMM, X
MF=(E,MACLIST)
*
L R3,COMMAREA -> ptrs to COMM CIB and ECB
USING IEZCOM,R3 Map the communication area
MVC COMMECBA,COMECBPT Save off addr of COMM ECB
ICM R4,15,COMCIBPT Get addr of CIB ptr
BZ INIT060 No CIB, go get one
USING CIBNEXT,R4 Map the CIB
*
CLI CIBVERB,CIBSTART Is this a START CIB?
BNE INIT060 No, set up CIB count
*
QEDIT ORIGIN=COMCIBPT, Free the CIB from the START cmd X
BLOCK=(4) that started this space
*
INIT060 EQU *
QEDIT ORIGIN=COMCIBPT, Set CIB limit to 1 X
CIBCTR=1
DROP R4 IEZCIB
DROP R3 IEZCOM
*
*
*
*- Initialization Completed
*
INIT090 EQU *
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE001I),NJE001I Move msg text
MVC MACLIST+51(8),LCLNODE
WTO ,MF=(E,MACLIST)
*
*- Start any auto-startable links
*
*
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
ICM R2,15,LNEXT -> first remote link v22x
BZ MAIN000 No auto if no links v22x
*
AUTO000 EQU *
TM LFLAG,LAUTO Is link autostartable?
BZ AUTO010 No
BAL R14,SLNK000 Try to start the link
*
STIMER WAIT,DINTVL=ATTDLY Pause briefly v200
*
AUTO010 EQU *
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ AUTO000 Look for another link
DROP R2 LINKTABL
*
*
*
MAIN000 EQU *
BAL R14,BLDL000 Go build the ECB list
BZ QUIT000 No ECBS in list; terminate
*
SPKA 0 Use key 0 for CSA ECB
WAIT 1,ECBLIST=ECBLIST
*
*-- Identify the ECB that was posted
*
MAIN010 EQU *
LA R1,ECBLIST -> our ECBLIST
*
MAIN050 EQU *
ICM R2,15,0(R1) -> ECB v211
BZ MAIN055 Skip ECB if empty slot v211
TM 0(R2),X'40' Was this ECB posted?
BO MAIN060 Yes
*
MAIN055 EQU * v211
TM 0(R1),X'80' Last ECB addr in list?
BO MAIN000 Nothing to do, go WAIT
LA R1,4(,R1) -> next ECB addr
B MAIN050 Keep looking
*
*
MAIN060 EQU *
CLM R2,7,CSAECBAD+1 Was the WRE work ECB posted?
BE WRK000 Hey! We have something to do
*
SPKA X'80' Back to user key for the rest
CLM R2,7,COMMECBA+1 Was the COMM ECB posted?
BE COMM000 Yes
*
*** L R3,0(,R2) Load the ECB content v211
XC 0(4,R2),0(R2) Clear the ECB
LA R0,LTRMECB-LINKTABL Offset of ECB in LINKTABL v211
SR R2,R0 -> LINKTABL entry v211
USING LINKTABL,R2
*** CLM R3,7,=AL3(255) ECB post code 255? v211
*** BE MAIN080 Yes, LINKTABL entry delete v211
*
DETACH LTCBA Detach the subtask
XC LTCBA,LTCBA Mark task terminated
MVI LFLAG,X'00' Clear status flags
*
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(L'NJE010I),NJE010I Line is drained
UNPK DBLE(4),LACTLINE(3) Convert CUU of line
TR DBLE(3),HEXTRAN-240
MVC MACLIST+17(3),DBLE
WTO ,MF=(E,MACLIST) Line xxx is drained
B MAIN010 Look for more work
*
*-- Here to delete a LINKTABL entry (from LINK OFF command) v211
*-- We arrive here from POST code 255. NJESCN LOFF000 does the POSTv211
*
DROP R2 LINKTABL v211
*
*-- Build a new ECBLIST before the wait
*
BLDL000 EQU *
SR R1,R1 Init: no ECBs in list
LA R15,ECBLIST-4 -> 0th ECB list entry
TM NJFL1,NJF1STOP Is main task termination set?
BO BLDL010 Yes, dont add COMM ECBs to list
LA R15,4(,R15) -> next available ECB list slot
L R1,COMMECBA -> COMM ECB
ST R1,0(,R15) Set addr in ECB list
LA R15,4(,R15) -> next available ECB list slot
L R1,CSAECBAD -> WRE work ECB
ST R1,0(,R15) Set addr in ECB list
*
BLDL010 EQU *
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
L R2,LNEXT -> first remote link v211
*
BLDL020 EQU *
CLC LTCBA,=A(0) Is task active for link?
BE BLDL030 Zero, skip this one
LA R15,4(,R15) -> next available ECB list slot
LA R1,LTRMECB -> task's termination ECB
ST R1,0(,R15) Set ECB addr in ECB list
*
BLDL030 EQU *
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ BLDL020 Scan them all
DROP R2 LINKTABL
LTR R1,R1 Any ECB in the list?
BZR R14 No, return with CC=0 set
OI 0(R15),X'80' Mark end of list
BR R14 Return with ECB list built
*
**********************************************************************
* *
* WRE FLOWS *
* *
**********************************************************************
*
* When WREs are created by out-of-address space tasks (such as by
* modules NJE38 by TSO users, or NJ38XMIT by jobs) they are
* created in CSA and chained off the NJE38 CSA block NJ38CSA. The
* WRE ECB is posted via cross memory post. Any WRE posted in this
* manner will first end up here, at WRK000 below.
*
* WRK000 will pull the entire chain of WREs and get it off that queue
* so that these can be processed one at a time while outside tasks may
* continue to add new WREs to the CSA chain.
*
* Each WRE is examined for its destination. If the WRE has a
* destination link id in the LINKs table, or via a route that can be
* forwarded via a destination link, the WRE will be requeued to that
* particular link task at WRK120.
*
* When the link task gets the WRE, it will be processed by NJEDRV
* label COMM000, which will dequeue it and flow continues to
* label WRK000 in that same module. After processing the WRE stg
* is freed.
*
* Back in NJEINIT, if the WRE is destined for the local link (at
* WRK030) flow proceeds to WRK200 where the command processor NJECMD
* is called to examine and process the action. Upon return, the
* WRE storage is freed and the next WRE on the chain is examined,
* if any.
*
* Notes:
* 1. WREs are created in subpool 2 which is shared by other TCBs.
* (Except for out-of-address-space WREs, which are in CSA).
* 2. WREs are sometimes created internally:
* a). in NJEINIT STOP000 to queue a WRE to each active link task
* in order to stop the link.
* b). in NJEINIT CCD000 in order to queue a command that was
* input from the system console to a remote link task.
* 3. Whether the WRE is created from an outside address space or
* internally, they all flow the same way, via the post to the
* ECB in NJ38CSA and being placed on the queue anchor in NJ38CSA.
*
*
*
* Summary:
*
* 1. WRE gets created and posted to CSA anchor
* 2. NJEINIT WRK000 sees the WRE first
* 3. WRE is requeued to a link or handled by NJEINIT/NJECMD
* 4. WRE is freed.
*
*
*
*
*
*
*
*-- WRE work ECB was posted
*
WRK000 EQU *
SPKA 0 This routine must run key=0
XC 0(4,R2),0(R2) Reinit WRE work ECB
L R2,CSABLK -> CSA communications area
USING NJ38CSA,R2
*
LM R6,R7,NJ38SWAP Get WRE anchor, sync count
*
WRK010 EQU *
LTR R6,R6 Was WRE Q empty?
BZ MAIN010 Yes, nothing else to do
SR R14,R14 Zero out the WRE Q anchor
LR R15,R7 Copy same sync count
CDS R6,R14,NJ38SWAP Try to empty the WRE Q
BC 7,WRK010 Can't yet, try again
DROP R2 NJ38CSA
*
*-- Distribute the WREs to the various links
*
*-- R6 -> start of WRE chain we dequeued from WRE Q
*
USING WRE,R6
*
*
WRK030 EQU *
NJETRACE TYPE=TRCIWRE Trace incoming WRE
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* -> here v220
ST R15,4(,R14) Save addr of trace request v220
ST R6,8(,R14) Trace WRE addr v220
MVC 12(4,R14),WRETYPE Trace type code,len,subpool v220
MVC 16(8,R14),WRELINK link dest v220
MVC 24(8,R14),WREUSER userid dest v220
NJETRACE TYPE=TRCIWRE Trace incoming WRE follow on v220
OI 0(R14),X'80' Indicate follow on v220
STCM R10,7,1(R14) Identify trace entry v220
MVC 4(8,R14),WREORIG Originator userid v220
MVC 12(20,R14),WRETXT Trace WRE content v220
*
CLC WRELINK,LCLNODE Is this WRE for the local node?
BE WRK200 Yes, don't queue it to a link
*
WRK040 EQU *
LA R1,WRELINK -> destination link of WRE
BAL R14,FLNK000 Locate the LINKTABL entry
BZ WRK050 No link found, check routes
*
USING LINKTABL,R2
TM LFLAG,LCONNECT Is link connected?
BO WRK120 Yes, post the link task
*
*-- Otherwise, look at routes. R1-> WRELINK
*
WRK050 EQU *
BAL R14,RLNK000 Find matching route
BZ WRK150 No matching routes
BAL R14,FLNK000 Locate the LINKTABL entry
BZ WRK150 No link found for this WRE
TM LFLAG,LCONNECT Is link connected?
BZ WRK150 No, skip this WRE
*
*
*-- Here to requeue the WRE to the link WRE chain
*
WRK120 EQU *
NJETRACE TYPE=TRCOWRE Trace outgoing WRE
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* -> here v220
ST R15,4(,R14) Save addr of trace request v220
ST R6,8(,R14) Trace WRE addr v220
MVC 12(4,R14),WRETYPE Trace type code,len,subpool v220
MVC 16(8,R14),WRELINK link dest v220
MVC 24(8,R14),WREUSER userid dest v220
NJETRACE TYPE=TRCOWRE Trace outgoing WRE follow on v220
OI 0(R14),X'80' Indicate follow on v220
STCM R10,7,1(R14) Identify trace entry v220
MVC 4(8,R14),WREORIG Originator userid v220
MVC 12(20,R14),WRETXT Trace WRE content v220
*
L R8,WRENEXT -> next WRE in CSA chain
*
LM R0,R1,LWRESWAP Get first WRE ptr, sync count
WRK130 EQU *
ST R0,WRENEXT First WRE becomes next
LR R4,R6 -> WRE to be added as first
LA R5,1(,R1) Incr synchronization count
CDS R0,R4,LWRESWAP Update LINK WRE anchor, sync
BC 7,WRK130 Gotta try again
*
LA R1,LECB -> link task notification ECB
POST (1) Tell task
B WRK290 Go get another WRE
*
*-- Release WRE that we cant distribute to a link
*
WRK150 EQU *
B WRK290
DROP R2 LINKTABL
*
*-- Here if WRE is intended for the local node
*
WRK200 EQU *
SR R15,R15 Clear for IC v220
IC R15,WRETYPE Get WRE type code v220
CLM R15,1,=AL1(WRK210HI) Check against highest code v220
BH WRK280 Dispose of invalid WRE v220
B WRK210(R15) Branch into table v220
*
WRK210 EQU * v220
B WRK280 X'00' Invalid; just delete WRE v220
B WRK280 X'04' WRENEW; ignore for LCL nodev220
B WRK215 X'08' WRECMD v220
B WRK220 X'0C' WREMSG v220
B WRK240 X'10' WRESTAR v220
B WRK300 X'14' WREREG v220
B WRK350 X'18' WREDREG v220
B WRK400 X'1C' WREQRM v220
B WRK450 X'20' WREDRM v220
WRK210HI EQU (*-WRK210-4) Highest code supported v220
*
*
WRK215 EQU *
SPKA X'80'
MVC CMDAREA,BLANKS Init receiving area
SR R2,R2 Clear for IC
IC R2,WRETXTLN Get cmd image length
EX R2,MVTXT1 Move cmd image
STC R2,CMNDBLEN IBM length of image to CMDBLOK
MVC CMNDLINK,LCLNODE This node is the issuer
MVC CMNDUSER,WREUSER Copy TSO id of issuer
*
L R15,=A(NJECMD) -> command processor
BALR R14,R15 Go there
SPKA X'00'
B WRK280
*
MVTXT1 MVC CMDAREA(0),WRETXT Executed instr
*
*-- Send the msg response to a local TSO user
*
WRK220 EQU *
CLC WREUSER,=CL8'OP' Message destined for operator?
BE WRK230 Yes
LA R15,WREUSER -> userid to locate
BAL R14,REG000 See if user registered v220
BNZ WRK280 Yes it was; we queued it v220
BAL R14,USR800 See if TSO user logged on
BZ WRK280 Skip msg if not
MVC MACLIST(80),BLANKS Init first part
MVC MACLIST+4(9),=C'SE ''From '
MVC MACLIST+13(8),WREORIG
TRT MACLIST+13(9),BLANK Look for end of orig userid
MVI 0(R1),C':'
LA R1,2(,R1) -> area for msg
MVC 0(104,R1),WRETXT Move msg text v102
LA R2,MACLIST+111 -> last byte from MTEXT area v210
LA R0,32 # char to check backwards v210
*
WRK223 EQU * Only look backwards to col 80 v210
CLI 0(R2),C' ' Try to find last non-blank v210
BNE WRK226 Found it v210
BCTR R2,0 -> prev char v210
BCT R0,WRK223 Keep scanning v210
*
WRK226 EQU * v210
LA R2,1(,R2) -> first blank after last char v210
MVC 0(8,R2),=C''',USER=(' v210
MVC 8(12,R2),BLANKS Ensure trailer initted v210
MVC 8(7,R2),WREUSER Max for TSO userid is 7 v210
LA R1,8+7(,R2) -> max end of trt v210
TRT 8(7,R2),BLANK Look for end of userid v210
MVI 0(R1),C')' Move closing v210
MVI 1(R1),C' ' Plus 1 blank v210
LA R0,MACLIST -> start of msg area v210
SR R1,R0 Compute length of msg v210
LA R1,1(,R1) Account for blank at end v210
XC MACLIST(4),MACLIST Clear len, flags v210
STH R1,MACLIST Insert the msg length v210
*
LA R1,MACLIST
SR R0,R0
SVC 34 Issue MGCR SVC
B WRK280
*
*-- Send the msg response to the system operator
*
WRK230 EQU *
MVC MACLIST(WTOMSGL),WTOMSG
MVC MACLIST+4(4),=C'From'
MVC MACLIST+9(8),WREORIG Move originating userid
TRT MACLIST+9(9),BLANK Look for end of orig userid
MVI 0(R1),C':'
LA R1,2(,R1) -> area for msg
MVC 0(104,R1),WRETXT Move msg text v102
WTO ,MF=(E,MACLIST)
B WRK280
*
*-- Start a link (via a local or remote command)
*
WRK240 EQU *
L R2,WREUSER -> LINKTABL entry of START cmd
BAL R14,SLNK000 Attach the link driver
B WRK280
*
*-- Clean up spent WRE
*
WRK280 EQU *
SPKA 0 In case WRE isin CSA v220
L R8,WRENEXT -> next WRE in chain
SR R15,R15 Clear for IC v220
IC R15,WRESP Get subpool number v220
LA R0,WRESIZE Size of this WRE v220
*
NJETRACE TYPE=TRCFWRE v220
STCM R10,7,1(R14) Identify trace entry v220
LA R2,* v220
STCM R2,7,5(R14) Addr of Freemain to trace v220
ST R0,8(,R14) Len to trace v220
ST R6,12(,R14) addr to trace v220
STC R15,8(,R14) Trace subspool v220
MVI WRESP,X'FF' Mark stg as freed v220
*
FREEMAIN RU, Free the WRE x
LV=(0), x
A=(6), x
SP=(15) v220
SPKA X'80' v220
*
*-- Done processing a WRE; get another
*
WRK290 EQU *
LTR R6,R8 Get next WRE to distribute
BNZ WRK030 Yes have an addr v220
B MAIN010 All done with WREs
*
*
* Registered User Service Support Notes v220
*
* The registered user service allows an outside address space
* operating in the same MVS system as NJE38, to 'register' or
* establish a relationship with NJE38 where messages that would
* ordinarily be sent to a user terminal are instead queued in
* storage and presented to the outside address space upon request.
*
* Users wishing to use this service call the NJERLY interface which
* is responsible for establishing the relationship with NJE38. This
* is done using WREs and cross-memory POST. In this way, a batch,
* TSO, or STC address space can capture message traffic destined
* for it before it would arrive at a terminal, and thereby process
* this message or display it in the manner of their choosing.
*
* WREs created by NJERLY are always in CSA. When they are used to
* request service of NJE38, they place the WRE on the NJ38SWAP
* compare and swap chain just like any other outside requester and
* post NJEINIT's CSA ECB. NJEINIT then acts on the request.
*
* NJEINIT never frees the WRE created by NJERLY. That is NJERLY's
* responsibility.
*
* For some functions of the service, the request is ignored if
* important information is missing (unlikely) such as ASCB address
* of NJERLY, or the WRE address. Ignoring the request is all that
* can be done since without either of those pieces, NJEINIT cannot
* issue CM POST back to the NJERLY space to let it know of the error.
*
* When a user joins the service, he registers. NJEINIT will create
* a REGUSERB control block to establish the registration and hold
* the NJERLY requester'e WRE and ASCB address.
*
* Once a user (userid) has registered, any message traffic inbound
* destined for that user will be queued in NJE38 storage and chained
* from REGUSERB, The user can then request a message be returned
* one per request. A post code of 4 (ERNOMSG) is used to indicate
* no messages are queued.
*
* When the user wants to stop using the service, it 'deregisters',
* causing NJEINIT to freemain any queued messages for the user and
* releasing the REGUSERB. Message traffic destined for that user
* resumes being presented to the terminal as before.
*
* In the comments below, the 'registered user WRE' refers to the
* WRE created by NJERLY in CSA by the user address space.
*
*
*
*- WREREG
*- Register a user for queued message services
*
*- Who requests this service: user address space via NJERLY
*
*- Steps:
* 1. Ensure userid is not already registered on REGUSERB chain.
* 2. Create a new REGUSERB for this user
* 3. Issue CM POST to registered user space, function complete.
*
*
* Notes: - On entry, registered user WRE is in R6.
* - Registered users WREs are not freemained; we are not the
* owner.
* - If the registered user WRE has no ASCB addr, we have no
* choice but to ignore the request.
*
WRK300 EQU *
L R8,WRENEXT -> next WRE v220
XC WRENEXT,WRENEXT Clear next next ptr because v220
* this is a registration WRE v220
* and wont be freemained herev220
CLC WREASCB,=A(0) Is ASCB present? v220
BE WRK810 No, invalid. Can't respond v220
*
ICM R1,15,REGUSER -> first REGUSER v220
BZ WRK320 None, let's start a chain v220
USING REGUSERB,R1 v220
LA R0,ERDUPUSR Assume duplicate user error v220
*
WRK310 EQU * v220
CLC REGUSRID,WREUSER Is this user already reg? v220
BE WRK800 Yes, post the error in R0 v220
ICM R1,15,REGNEXT Keep looking v220
BNZ WRK310 v220
*
WRK320 EQU * v220
GETMAIN RU, Get storage for a REGUSER v220x
LV=REGSIZE, v220x
SP=2 v220
XC 0(REGSIZE,R1),0(R1) Init stg v220
MVC REGEYE,=CL4'REGU' Set eye v220
MVC REGUSRID,WREUSER Userid to be registered v220
ST R6,REGWRE Save ptr to registration WREv220
MVC REGNEXT,REGUSER Chain other REGUSERs to thisv220
ST R1,REGUSER This REGUSER is first v220
DROP R1 REGUSERB v220
SR R0,R0 Set RC=0 success v220
B WRK800 User successfully registeredv220
*
*- WREDREG
*- Deregister a user from queued message services
*
*- Who requests this service: user address space via NJERLY
*
*- Steps:
* 1. Locate the REGUSERB for the userid
* 2. Get the chain anchor for queued message WREs, if any
* 3. Freemain the REGUSERB.
* 4. Freemain each queued message WRE
* 5. Issue CM POST to registered user space, function complete.
*
* Notes: - On entry, registered user WRE is in R6.
* - Registered users WREs are not freemained; we are not the
* owner.
* - If the registered user WRE has no ASCB addr, we have no
* choice but to ignore the request.
*
WRK350 EQU *
L R8,WRENEXT -> next WRE v220
XC WRENEXT,WRENEXT Clear next next ptr because v220
* this is a registration WRE v220
* and wont be freemained herev220
CLC WREASCB,=A(0) Is ASCB present? v220
BE WRK810 No, invalid. Can't respond v220
*
LA R0,ERUSERNF Assume user not found v220
LA R2,REGUSER -> 0th REGUSER entry v220
ICM R1,15,REGUSER -> first REGUSER v220
BZ WRK800 None, user indeed isnt foundv220
USING REGUSERB,R1 v220
*
WRK360 EQU * v220
CLC REGUSRID,WREUSER Is this user we want? v220
BE WRK370 Yes v220
LR R2,R1 Save this REGUSER ptr v220
ICM R1,15,REGNEXT Get next REGUSER and continuv220
BNZ WRK360 v220
B WRK800 Exit with user not found v220
*
WRK370 EQU * v220
MVC REGNEXT-REGUSERB(,R2),REGNEXT unchain R1 REGUSER v220
L R2,REGMSGQ -> MSG WRE chain for user v220
DROP R1 REGUSERB v220
*
FREEMAIN RU, Free storage for a REGUSERB v220x
LV=REGSIZE, v220x
A=(1), v220x
SP=2 v220
*
WRK380 EQU * v220
LTR R1,R2 Were any WREs chained? v220
BZ WRK390 No, we're done v220
L R2,WRENEXT-WRE(,R2) -> next WRE v220
LA R0,WRESIZE Get size of WRE v220
*
NJETRACE TYPE=TRCFWRE v220
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* v220
STCM R15,7,5(R14) Addr of Freemain to trace v220
STM R0,R1,8(R14) Len, stg addr to trace v220
MVI 8(R14),2 Trace subspool v220
MVI WRESP-WRE(R1),X'FF' Mark stg as freed v220
*
FREEMAIN RU, Free storage for a WRE v220x
LV=(0), v220x
A=(1), v220x
SP=2 v220
B WRK380 Free entire chain v220
*
WRK390 EQU * v220
SR R0,R0 Set RC=0 success v220
B WRK800 User successfully deregisterv220
*
*
*- WREQRM
*- Queue a message destined for a registered user
*
*- Who requests this service: Internal by NJEINIT, NJECMX, NJEDRV
* as message traffic arrives and needs to be queued.
*
*- Steps:
* 1. Locate the REGUSERB for the userid
* 2. If REGUSERB is not found, userid is not registered. Exit
* with CC=0 and allow the message to go to the user terminal.
* 3. Get the registration WRE address from REGUSERB, exit if none.
* 4. Add this queued message WRE (in R6) to the queued message
* chain REGMSGQ (in REGUSERB). Do not freemain this WRE!
* 5. Issue CM POST to registered user space that message is avail.
*
* Notes: - On entry, a queued message WRE is in R6.
* - The WREs are added to the start of the chain (REGMSGQ)
* because they come to us in reverse order of issuance.
* This puts them back in the right order
*
WRK400 EQU *
L R8,WRENEXT -> next WRE v220
ICM R3,15,REGUSER -> first REGUSER v220
BZ WRK810 No one registered v220
USING REGUSERB,R3 v220
*
WRK410 EQU * v220
CLC REGUSRID,WREUSER Is this user the one? v220
BE WRK420 Yes v220
ICM R3,15,REGNEXT Keep looking v220
BNZ WRK410 v220
B WRK810 Can't find REGUSER v220
*
WRK420 EQU * v220
ICM R4,15,REGWRE -> user's registration WRE v220
BZ WRK810 Ignore if not there v220
*
MVC WRENEXT,REGMSGQ Add chain to new WRE v220
ST R6,REGMSGQ Add WRE to anchor v220
LR R6,R4 User registration WRE to R6 v220
SR R0,R0 Indicate success v220
B WRK800 Tell user msg pending v220
* v220
* v220
*- WREDRM
*- Dequeue message for a registered user when they request it
*
*- Who requests this service: user address space via NJERLY
*
*- Steps:
* 1. Locate the REGUSERB for the userid
* 2. If REGUSERB is not found, userid is not registered. Issue
* error to requester.
* 3. Get the first queued message WRE from REGUSERB, issue
* ERNOMSG error if nothing queued.
* 4. Copy the message text from the queued message WRE into the
* registered user WRE.
* 5. Issue CM POST to registered user space, function complete.
*
* Notes: - On entry, the registered user WRE is in R6.
*
*
WRK450 EQU *
L R8,WRENEXT -> next WRE v220
XC WRENEXT,WRENEXT Clear next next ptr because v220
* this is a registration WRE v220
* and wont be freemained herev220
ICM R3,15,REGUSER -> first REGUSER v220
BZ WRK810 No one registered v220
USING REGUSERB,R3 v220
*
WRK460 EQU * v220
CLC REGUSRID,WREUSER Is this user the one? v220
BE WRK470 Yes v220
ICM R3,15,REGNEXT Keep looking v220
BNZ WRK460 v220
B WRK810 Can't find REGUSER v220
*
WRK470 EQU * v220
LA R0,ERNOMSG Assume no msgs queued v220
ICM R5,15,REGMSGQ -> first queued msg WRE v220
BZ WRK800 No msgs available v220
*
MVC REGMSGQ,WRENEXT-WRE(R5) Remove 1st queued from chainv220
DROP R3 REGUSERB v220
*
MVC WRETXT,WRETXT-WRE(R5) Copy queued msg text to v220
* registered user WRE v220
*
LA R0,WRESIZE Get size of WRE v220
NJETRACE TYPE=TRCFWRE v220
STCM R10,7,1(R14) Identify trace entry v220
LA R15,* v220
STCM R15,7,5(R14) Addr of Freemain to trace v220
ST R0,8(,R14) Len to trace v220
MVI 8(R14),2 Trace subspool v220
ST R5,12(,R14) Addr to trace v220
MVI WRESP-WRE(R5),X'FF' Mark stg as freed v220
*
FREEMAIN RU, Free Queued msg WRE v220x
LV=(0), v220x
A=(5), v220x
SP=2 v220
*
SR R0,R0 Indicate success v220
B WRK800 Tell user msg pending v220
*
*
WRK800 EQU * USING WRE,R6 v220
L R7,WREASCB -> ASCB of requestor v220
LA R1,WREECB -> WRE's ECB v220
*
MVC MACLIST(POSTL),POST Move macro model v220
POST (1),(0), Post requestor's ECB v220x
ASCB=(7), v220x
ERRET=WRK810, v220x
ECBKEY=0, v220x
MF=(E,MACLIST) v220
*
WRK810 EQU * v220
B WRK290 All done with WRE v220
DROP R6 WRE v220
*
*-- Address space Communications ECB was posted
*
COMM000 EQU *
L R4,COMMAREA -> Communications area
USING IEZCOM,R4
L R5,COMCIBPT -> CIB
USING CIBNEXT,R5
CLI CIBVERB,CIBMODFY Modify cmd?
BE MOD000 Yes
CLI CIBVERB,CIBSTOP Stop cmd?
BE STOP000 Yes, let subtasks know
U0038 ABEND 38,DUMP,STEP Shouldnt happen
*
MOD000 EQU *
MVC CMDAREA,BLANKS Init receiving area
LH R2,CIBDATLN Get cmd image length
BCTR R2,0 Adjust for execute
EX R2,MVMOD1 Move cmd image
STC R2,CMNDBLEN IBM length of image to CMDBLOK
*
QEDIT ORIGIN=COMCIBPT,BLOCK=(5) Purge the CIB
*
MVC CMNDLINK,LCLNODE Console operator
MVC CMNDUSER,=CL8'OP' should get any responses
L R15,=A(NJECMD) -> command processor
BALR R14,R15 Go there
B MAIN010
*
MVMOD1 MVC CMDAREA(0),CIBDATA Executed instr
*
*
*
STOP000 EQU *
QEDIT ORIGIN=COMCIBPT,BLOCK=(5) Purge the CIB
DROP R4 IEZCOM
DROP R5 IEZCIB
*
STOP010 EQU *
OI NJFL1,NJF1STOP Indicate STOP ordered
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
L R2,LNEXT -> first remote link v211
*
STOP020 EQU *
CLC LTCBA,=A(0) Is task active for link?
BE STOP030 Zero, skip this one
*
BAL R14,GTW000 Get a WRE
LR R4,R1 -> WRE
USING WRE,R4
MVI WRECODE,X'81' Code for drain link
DROP R4
BAL R14,PST000 Queue the WRE to link
*
STOP030 EQU *
ICM R2,15,LNEXT -> next LINKTABL entry
BNZ STOP020 Scan them all
DROP R2 LINKTABL
*
B MAIN010
*
*
*-- Open then Close NETSPOOL dataset to determine status
*
* NCBRTNCD/ERRCD after call to NCBOPEN
* 0474 = dataset not closed properly (do verify)
* 0874 = dataset not formatted
*
NET000 EQU *
ST R14,SV14 Save return
*
MVC JFCBDCB(NSPOOLN),NSPOOL Move DCB for RDJFCB use
LA R1,JFCB -> JFCB return area
ST R1,JEXLST Set addr in exit list
MVI JEXLST,X'87' Set exlst for JFCB return
LA R1,JFCBDCB -> DCB
USING IHADCB,R1
LA R0,JEXLST -> exit list
STCM R0,7,DCBEXLSA Store it into DCB
DROP R1
*
MVC MACLIST(RDJFCBL),RDJFCB Move model
RDJFCB JFCBDCB,MF=(E,MACLIST) Get NETSPOOL DSN
*
LA R3,NCB1
USING NCB,R3
*
NSIO TYPE=OPEN, Open NETSPOOL x
NCB=(R3), v210x
ENTRY=ANJESPL v210
LTR R15,R15
BZ NET040
BAL R14,FMT000
*
NET040 EQU *
NSIO TYPE=CLOSE, x
NCB=(R3), v210x
ENTRY=ANJESPL v210
DROP R3
TM NJFL1,NJF1VSER Did VSAM error occur?
BZ NET090 No
CLC LASTRC(2),=X'0474' NETSPOOL needs verify?
BE NET080
CLC LASTRC(2),=X'0874' NETSPOOL not formatted?
BNE NET070
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE007I),NJE007I Not formatted msg
WTO ,MF=(E,MACLIST)
B NET090
*
NET070 EQU *
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE006I),NJE006I Open failed
WTO ,MF=(E,MACLIST)
B NET090
*
NET080 EQU *
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE008I),NJE008I Do verify
WTO ,MF=(E,MACLIST)
MVC MACLIST(WTOMSGL),WTOMSG Move macro model
MVC MACLIST+4(L'NJE009I),NJE009I verify complete
WTO ,MF=(E,MACLIST)
*
NET090 EQU *
TM NJFL1,NJF1VSER Set CC: Did VSAM error occur?
L R14,SV14 Reload return
BR R14 Return
*
ERR999 EQU *
WTO 'NJE999I NJE38 is already active'
*
QUIT000 EQU *
ESTAE 0 Turn off ESTAE
*
TTIMER CANCEL Cancel the timer
*
FREEMAIN RU,SP=1 Free all CONFIG related stg
FREEMAIN RU,SP=2 Free all WRE related stg
*
QUIT020 EQU *
DELETE EP=NJECMX Delete command processor
DELETE EP=NJESPOOL Delete spool interface v210
*
ICM R1,15,ARQESTG -> RQE stg area
BZ QUIT030 Skip free if none v212
FREEMAIN RU, Free it x
LV=RQESZ*RQELIM, x
A=(1)
*
QUIT030 EQU * v212
ICM R1,15,ATRACE -> Trace table stg v212
BZ QUIT070 Skip free if none v212
FREEMAIN RU, Free it v212x
LV=TRACESZ*1024, v212x
A=(1) v212
*
QUIT070 EQU *
TM NJFL1,NJF1ENQ Is NJE38 ENQ active?
BZ QUIT080 No
LA R5,NJERNAME -> RNAME
MVC MACLIST(ENQL),ENQ Move macro model
DEQ (NJE38Q,(5),56,SYSTEM), x
RET=NONE, x
MF=(E,MACLIST)
*
QUIT080 EQU *
ICM R5,15,CSABLK -> CSA stg area
BZ QUIT090 Not present
*
SPKA 0
*
FREEMAIN RU,LV=NJ38CSAZ,A=(5),SP=241 Free CSA area
XC CSABLK,CSABLK
*
SPKA X'80'
*
QUIT090 EQU *
LR R1,R10 -> NJEWK main work area page
L R13,4(,R13) -> caller's sa
FREEMAIN RU, x
LV=4096, x
A=(1)
LM R14,R12,12(R13) Reload system's regs
XR R15,R15 RC=0
BR R14 Return
*
U0039 EQU *
STM R0,R1,DBLE Save regs across abend SVC
ABEND 39,DUMP,STEP
*
LTORG
* HHMMSSTH
DS 0D v200
ATTDLY DC CL8'00000050' 1/2 sec
*
EXTRACT EXTRACT MF=L
EXTRACTL EQU *-EXTRACT
ESTAE ESTAE 0,MF=L
ESTAEL EQU *-ESTAE
*
ENQ ENQ (0),MF=L
ENQL EQU *-ENQ
*
DEQ DEQ (0),MF=L
DEQL EQU *-DEQ
*
RDJFCB RDJFCB 0,MF=L
RDJFCBL EQU *-RDJFCB
*
NJE38Q DC CL8'NJE38'
NJERCON DC CL8'NJEINIT'
*
NSPOOL DCB DDNAME=NETSPOOL,DSORG=PS,MACRF=GL,EXLST=0
NSPOOLN EQU *-NSPOOL
*
* 456789012345678901234567890123456789012345678901
NJE000I DC C'NJE000I NJE38 &VERS'
NJE001I DC C'NJE001I Initialization complete for local node'
NJE006I DC C'NJE006I Open failed for DD NETSPOOL'
NJE007I DC C'NJE007I NETSPOOL dataset has not been formatted'
NJE008I DC C'NJE008I The NETSPOOL dataset required verification befx
ore start-up'
NJE009I DC C'NJE009I Verification complete. Please restart NJE38'
NJE010I DC C'NJE010I Line xxx is drained'
*
DROP R12
*
*********************
* N J E C O M * NJECOM hosts small routines and
* * frequently used constants that
* Common routines * are available to all NJExxx csects
* and constants * via base register 11
* *
*********************
*
NJECOM CSECT
DC A(0) No branch around constants
DC AL1(23) LENGTH OF EYECATCHERS
DC CL9'NJECOM'
DC CL9'&SYSDATE'
DC CL5'&SYSTIME'
USING NJECOM,R11
USING NJEMWK,R10
*
* FLNK000 - Locate a link table entry by link name
*
* Entry: R1 -> Link name to find (CL8 field padded with blanks)
* Exit: CC=0 link was not found
* CC<>0 link table entry address is in R2
*
*
*
FLNK000 EQU *
L R2,LINKS -> 1st entry (LOCAL entry) v211
USING LINKTABL,R2
L R2,LNEXT -> first remote link v211
*
FLNK010 EQU *
CLC LINKID,0(R1) Find the link entry by name
BE FLNK020 Got it
ICM R2,15,LNEXT -> next LINKTABL entry
BZR R14 Exit CC=0 if not found
B FLNK010 Keep searching
DROP R2 LINKTABL
*
FLNK020 EQU *
LTR R2,R2 Set CC non-zero
BR R14 Return w/LINKTABL entry -> R2
*
* RLNK000 - Locate a name in the route table
*
* Entry: R1 -> Routed name to find (CL8 field padded with blanks)
* Exit: CC=0 link was not found
* CC<>0 Associated link name address is in R1
* CC<>0 Named route address is in R15
*
*-- First determine if the route name we are looking up is actually
*-- a link name.
*
RLNK000 EQU *
ICM R15,15,ROUTES -> RTE list v211
BZR R14 Exit CC=0 if no RTE list v211
USING RTE,R15 v211
*
L R2,LINKS 1st entry (LOCAL entry) v211
USING LINKTABL,R2
ICM R2,15,LNEXT Skip over local entry v211
BZR R14 Fail the request if none v211
SR R0,R0 R0=0 assume name not a link v211
*
RLNK010 EQU * v211
CLC LINKID,0(R1) Find the link entry by name v211
BE RLNK020 Got it v211
ICM R2,15,LNEXT -> next LINKTABL entry v211
BNZ RLNK010 Keep looking v211
B RLNK030 Didn't find a matching link v211
DROP R2 LINKTABL v211
*
*-- Here if route we want is a link name too (dont use wildcards) v211
*
RLNK020 EQU * v211
BCTR R0,0 Indic route is explicit link nm v211
* v211
*-- Search the RTEs for the route name v211
* v211
RLNK030 EQU *
STM R4,R7,12(R13) Save work regs v211
*
RLNK040 EQU * v211
LA R4,ROUTNAME -> name from route list v211
LA R5,8 max length v211
LR R6,R1 -> selected name to locate v211
LR R7,R5 copy length v211
CLCL R4,R6 Did we locate the name? v211
BE RLNK400 Yes, exact match v211
LTR R0,R0 Must be explicit link name? v211
BNZ RLNK050 Yes, no wildcard checking v211
CLI 0(R4),C'*' Wildcard was in the name? v211
BE RLNK400 Then we matched to that point v211
*
RLNK050 EQU *
ICM R15,15,ROUTPTR -> Next route entry v211
BNZ RLNK040 Keep looking v211
LM R4,R7,12(R13) Restore work regs v211
BR R14 No matching route v211
*
*-- Found the RTE with a matching name, now determine what link v211
*-- to route to. v211
*
RLNK400 EQU * v211
LM R4,R7,12(R13) Restore work regs v211
LA R0,4 # possible routed-to names v211
LA R1,ROUTNEXT -> first possible name v211
*
RLNK410 EQU * v211
L R2,LINKS -> first LINKTABL entry v211
USING LINKTABL,R2 v211
ICM R2,15,LNEXT Skip over local entry v211
BZR R14 Fail the request if none v211
*
RLNK420 EQU * v211
CLC 0(8,R1),BLANKS No route-to name? v211
BE RLNK499 Fail the request v211
CLC 0(8,R1),LINKID Look for destination link v211
BE RLNK440 Found it v211
ICM R2,15,LNEXT -> next LINKTABL entry v211
BNZ RLNK420 Keep searching v211
*
RLNK430 EQU * v211
LA R1,8(,R1) Next alternate route-to v211
BCT R0,RLNK410 Rescan for matching link v211
B RLNK499 None found, fail the request v211
*
RLNK440 EQU * v211
TM LFLAG,LCONNECT Is the link active? v211
BZ RLNK430 N, try next route-to link v211
DROP R2,R15 LINKTABL, RTE v211
*
RLNK490 EQU * v211
CLI *,0 Set CC to non-zero v211
BR R14 Return with link name -> R1 v211
*
RLNK499 EQU * v211
CLI *+1,0 Set CC to 0 v211
BR R14 No matching route/act link foundv211
*
* SLNK000 - Start a link
*
* Entry: R2 -> LINKTABL entry to be started
* Exit: CC=0 link was started
* CC<>0 link was already started
*
*
*
USING LINKTABL,R2
SLNK000 EQU *
STM R14,R9,BALRSAVE Save regs used
CLC LTCBA,=A(0) Is link already started?
BNE SLNK090 Exit w/ CC<>0 if addr present
*
XC LTRMECB,LTRMECB Clear from any prior use
LA R1,INITPARM -> INITPARM mapping area
ST R1,LPOINTER Pass addr of area to subtask
L R5,=A(NJEDMP) -> ESTAI exit
LA R9,LTRMECB
LR R1,R2 LINKTABL entry is parameter
*
MVC MACLIST(ATTACHL),ATTACH Move macro model
ATTACH EP=NJEDRV, Attach X
SZERO=YES, Ok to share SP 0 X
SHSPL=SPLIST, Shared subpool list v220X
DPMOD=0, Run task same prty X
SM=SUPV, Run task in Supervisor state X
KEY=PROP, Run task in key 8 X
ECB=(R9), Subtask termination ECB X
ESTAI=((5),(10)), ESTAI exit, work area is param X
SF=(E,MACLIST), Attach macro plist X
MF=(E,(1)) Param plist area
*
ST R1,LTCBA Save attached TCB address
SR R15,R15 Set CC=0
B SLNK090 Exit with task attached
DROP R2 LINKTABL
*
SLNK090 EQU *
LM R14,R9,BALRSAVE Restore caller regs
BR R14 Exit with CC set
*
SPLIST DC X'02' Number of shared subpools v220
DC X'01' Share SP 1 v220
DC X'02' Share SP 2 v220
DS X Reserved v220
*
*-- Get a new command type WRE
*
*-- Entry: None
* Exit: R1 -> WRE
*
*
GTW000 EQU *
ST R14,SV14 Save return addr
GETMAIN RU, Get CSA for WRE TYPE=WRECMD x
LV=WRESIZE, v220x
SP=2 v220
XC 0(WRESIZE,R1),0(R1) Clear stg area v220
USING WRE,R1
MVI WRESP,2 Save subpool v220
MVI WRETYPE,WRECMD CMD/MSG WRE
*
NJETRACE TYPE=TRCGWRE
STCM R10,7,1(R14) Identify trace entry v220
MVC 5(3,R14),SV14+1 Addr of GTW000 caller v220
STM R0,R1,8(R14) Len, stg addr to trace v220
MVI 8(R14),2 Trace subpool # v220
DROP R1
L R14,SV14 Load return addr
BR R14
*
*-- Queue the WRE on the Link and post link's ECB
*-- Caller must be PSW key 0
*
*-- Entry: R2 -> LINKTABL entry
*-- R4 -> WRE
*-- Exit: None
*
PST000 EQU *
USING LINKTABL,R2
USING WRE,R4
ST R14,SV14 Save return addr
LM R0,R1,LWRESWAP Get first WRE ptr, sync count
*
PST020 EQU *
ST R0,WRENEXT First WRE becomes next
LA R5,1(,R1) Incr synchronization count
CDS R0,R4,LWRESWAP Update LINK WRE anchor, sync
BC 7,PST020 Gotta try again
*
LA R1,LECB -> link task notification ECB
POST (1) Tell subtask WRE is queued
L R14,SV14 Load return addr
BR R14
*
DROP R2 LINKTABL
DROP R4 WRE
*
*
*-- Message response to console or local TSO user
*
*=== NOTE ===
*=== At present this routine (RSP000) is not called or used, but
*=== is retained here for possible future use.
*
*
*-- Entry: Area "MACLIST" contains a WTO format msg
* Area CMNDUSER=BLANKS send to console
* Area CMNDUSER=userid send to that userid
*-- Exit: None
*
* Area "CMDAREA" is used by this call.
*
*
RSP000 EQU *
ST R14,SV14 Save return addr
CLC CMNDUSER,BLANKS Is there a userid?
BE RSP010 No, respond to console
CLC CMNDUSER,=CL8'OP' Respond to operator
BE RSP010 Y
*
LA R15,CMNDUSER -> userid to locate
BAL R14,USR800 See if TSO user logged on
BZ RSP090 Skip msg if not
MVC CMDAREA,MACLIST+4 Save message text
MVC MACLIST+4(4),=C'SE '''
MVC MACLIST+8(104),CMDAREA v102
MVC MACLIST+112(8),=C''',USER=(' v102
MVC MACLIST+120(12),BLANKS Ensure trailer initted v102
MVC MACLIST+120(7),CMNDUSER Max for TSO userid is 7 v102
LA R1,MACLIST+127 v102
TRT MACLIST+120(7),BLANK v102
MVI 0(R1),C')'
MVI 1(R1),C' '
MVC MACLIST(4),=AL2(129,0) max len + 4 overhead v102
*
SPKA 0
LA R1,MACLIST
SR R0,R0
SVC 34 Issue MGCR SVC
SPKA X'80'
B RSP090
*
RSP010 EQU *
WTO ,MF=(E,MACLIST)
*
RSP090 EQU *
L R14,SV14 Reload return addr
BR R14
*
*-- Search CSCB chain to see if TSO user is logged on
*-- Entry: R15->8-byte padded field containing TSO userid to find
*-- Exit: CC=0 user was not logged on
*-- CC<>0 user is logged on
*
USR800 EQU *
CLC =CL8'OP',0(R15) Is the userid the operator?
BE USR890 Yes, let it thru
L R1,16 Get CVT ptr
USING CVT,R1
L R1,CVTASCBH -> highest prty ASCB
USING ASCB,R1
*
USR810 EQU *
L R2,ASCBCSCB -> CSCB
USING CSCB,R2
LTR R2,R2 Is there a CSCB?
BZ USR840 No, get next ASCB
*
USR820 EQU *
CLC CHKEY,=XL8'00' Jobname zeroed?
BE USR830 Y, skip this CSCB
CLC CHKEY,=CL8' ' Jobname is blank?
BE USR830 Y, skip this CSCB
CLC CHKEY,0(R15) Is this the userid?
BE USR890 Yes
USR830 EQU *
L R2,CHPTR -> next CSCB
LA R2,0(,R2) Clear high order
LTR R2,R2 Last CSCB?
BNZ USR820 No
BR R14 Return with CC=0 (not found)
*
USR840 EQU *
L R1,ASCBFWDP -> next ASCB
LTR R1,R1 last one?
BNZ USR810 No
BR R14 Return with CC=0 (not found)
*
USR890 EQU *
LTR R14,R14 Set CC=non zero (userid found)
BR R14 Return to caller
*
DROP R1 ASCB
DROP R2 CSCB
*
*-- Special code to intercept messages destined for v220
*-- registered users v220
*
*
REG000 EQU * v220
L R2,AREGUSER -> registered user anchor word v220
ICM R2,15,0(R2) -> registered user queue v220
BZR R14 No registered users v220
*
USING REGUSERB,R2 v220
REG010 EQU * v220
CLC REGUSRID,0(R15) Find a matching registered user v220
BE REG020 Found it v220
ICM R2,15,REGNEXT -> next REGUSER entry v220
BNZ REG010 Keep looking v220
BR R14 Userid was not registered v220
*
REG020 EQU * v220
ST R14,SVR14R Save return addr v220
BAL R14,GTW000 Get a WRE v220
LR R4,R1 v220
USING WRE,R4 v220
MVI WRETYPE,WREQRM Queue registered msg WRE v220
*
MVC WRELINK,LCLNODE Target WRE to local node task v220
MVC WREUSER,REGUSRID Dest= registered user id v220
MVC WREORIG,BLANKS No originating node v220
MVC WRETXT,BLANKS Init first part v220
MVC WRETXT(5),=C'From ' v220
MVC WRETXT+5(8),WREORIG-WRE(R6) From original msg v220
TRT WRETXT+5(9),BLANK Look for end of orig userid v220
MVI 0(R1),C':' v220
LA R1,2(,R1) -> area for msg v220
MVC 0(104,R1),WRETXT-WRE(R6) Copy msg text v220
MVI WRETXTLN,L'WRETXT Set the max possible len v220
*
SPKA 0 v220
L R15,CSABLK -> NJE38 CSA block v220
USING NJ38CSA,R15 v220
LM R0,R1,NJ38SWAP Get first WRE ptr, sync count v220
*
REG030 EQU * v220
ST R0,WRENEXT First WRE becomes next v220
LA R5,1(,R1) Incr synchronization count v220
CDS R0,R4,NJ38SWAP Update LINK WRE anchor, sync v220
BC 7,REG030 Gotta try again v220
*
LA R1,NJ38ECB -> main task notification ECB v220
POST (1) Wake him up v220
*
SPKA X'80' v220
*
DROP R2,R4,R15 REGUSERB,WRE,NJ38CSA v220
* v220
REG090 EQU * v220
L R14,SVR14R Load return addr v220
LTR R14,R14 Set non-zero CC v220
BR R14 Ret w/CC non-zero (msg queued) v220
*
*
*-- Format and display VSAM errors
*
FMT000 EQU *
STM R14,R2,BALRSAVE Save regs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment