I would restructure to open/close the DCB once
Here using -ve value to indicate open has failed, or could use flags to track
DCB status
* Message is in WORKMSG on arrival here
LT R4,MYDCB@ Get DCB address
BM WRITTEN Previous open failed, skip
BP DOPUT Use
STORAGE OBTAIN,LENGTH=XDCBL,LOC=BELOW Get 24-bit DCB buffer
LR R4,R1 Move pointer to our 24-bit DCB
MVC 0(XDCBL,R4),XDCB Copy the DCB down below the line
MVC WORKDWRD(XOPENL),XOPEN Copy the OPEN macro model
OPEN ((4),(OUTPUT)),MODE=31,MF=(E,WORKDWRD) Open for write
LTR R15,R15 Did that work??
JZ OPENOK Yes save DCB address
OPENFAIL EQU *
LCR R4,R4 Indicate open has failed
OPENOK EQU *
ST R4,MYDCB@
DOPUT EQU *
PUT (4),WORKMSG Write the message
WRITTEN DS 0H
In program epilog
LT R4,MYDCB@
BZ SKIPFREE Never tried to use
BP CLOSEDCB Opened previously
LCR R4,R4 Open failed
B FREEDCB So skip close
CLOSEDCB EQU *
MVC WORKDWRD(XCLOSEL),XCLOSE Copy in CLOSE template
CLOSE ((4)),MODE=31,MF=(E,WORKDWRD) And do the CLOSE
FREEDCB EQU *
STORAGE RELEASE,LENGTH=XDCBL,ADDR=(R4) Release DCB buffer
SKIPFREE EQU *
***MUCH LATER***
MYDCB@ DC F'0'
XDCB DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,RECFM=FBA, *
LRECL=133,BLKSIZE=3990
XDCBL EQU *-XDCB Length of our DCB so we can copy it
XOPEN OPEN (*-*,(OUTPUT)),MODE=31,MF=L
XOPENL EQU *-XOPEN
XCLOSE CLOSE (*-*),MODE=31,MF=L
XCLOSEL EQU *-XCLOSE