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

Reply via email to