*DECK DB$RFIN 
USETEXT CDCSCTX 
      PROC DB$RFIN( (PFTBLKA),(ERRBLKA) );
      BEGIN 
 #
* *   DB$RFIN - INITIALIZE RESTART ID FILE       PAGE  1
* *   W P CEAGLIO / P A MURRAY                   DATE  01/21/81 
* 
* DC  PURPOSE 
* 
*     ATTACH AND OPEN (VIA CRM) THE RESTART ID FILE FOR THIS SCHEMA.
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM PFTBLKA   I;            # ADDRESS OF ATTACH INFO IN MD      #
      ITEM ERRBLKA   I;            # ADDRESS OF ERROR BLOCK            #
# 
* D   ASSUMPTIONS 
* 
*     THE TQT POINTER IS SET. 
*     SALX IS SET.
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL   - THE RIF IS ATTACHED AND OPENED FOR I/O, AND THE FIT
*                POINTER SET IN THE SAL.
* 
*     ABNORMAL - POINTER IN SAL REMAINS SET TO ZERO.  INFORMATION IN THE
*                ERROR BLOCK IS COMPLETED AS FOLLOWS: 
*                    1) ERROR NUMBER = DFSRENFUN. 
*                    2) IF ATTACH ERROR, FUNCTION = ATTACH AND
*                       PARAMETER = CONTENTS OF ATTACHSTATUS. 
*                       IF CRM ERROR, FUNCTION = CRM AND
*                       PARAMETER = CONTENTS OF FIT ES FIELD. 
*                    3) FILE TYPE = RESTART IDENTIFIER. 
* 
* DC  CALLING ROUTINES
* 
*     DB$SFIN      CONTROL ROUTINE FOR SYSTEM FILE INITIALIZATION 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC CLOSEM;            # CRM CLOSE PROCEDURE               #
      XREF PROC DB$ATCH;           # ATTACH SYSTEM FILE                #
      XREF FUNC DB$CDEB C(10);     # INTEGER TO DECIMAL WITH BLANK FILL#
      XREF FUNC DB$COCT C(10);     # CONVERT BINARY TO OCTAL, W/ZEROES #
      XREF PROC DB$ERR;            # ERROR PROCESSOR                   #
      XREF PROC DB$FLOP;           # GENERATE A FLOW POINT ENTRY       #
      XREF FUNC DB$LFN;            # ASSIGN LOGICAL FILE NAME          #
      XREF PROC DB$MFA;            # ALLOCATE CMM BLOCK                #
      XREF PROC DB$MFF;            # RELEASE CMM BLOCK                 #
      XREF PROC DB$MSG;            # ISSUE DAYFILE MESSAGE             #
      XREF PROC DB$OPNM;           # INTERFACE TO CRM OPEN FUNCTION    #
      XREF PROC DB$POP;            # POP VARIABLE FROM STACK           #
      XREF PROC DB$POP2;           # POP TWO VARIABLES FROM THE STACK  #
      XREF PROC DB$POP3;           # POP THREE VARIABLES FROM THE STACK#
      XREF PROC DB$PSH2;           # PUSH TWO VARIABLES ONTO THE STACK #
      XREF PROC DB$PSH3;           # PUSH THREE VARIABLES TO THE STACK #
      XREF PROC DB$PUSH;           # PUSH VARIABLE ONTO STACK          #
      XREF PROC DB$RA0;            # TERMINATE PARAMETER LIST          #
      XREF PROC DB$RTN;            # RETURN ATTACHED FILE              #
      XREF PROC DB$SCHD;           # CDCS SCHEDULER                    #
      XREF PROC GETN;              # CRM GET NEXT PROCEDURE            #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     SAL 
*       SARIDFIT   POINTER TO RIF FIT 
*       SASCHST    SCHEMA STATUS
* 
* DC  DESCRIPTION 
* 
*     -  ALLOCATE BUFFER FOR FIT AND RECORD POINTER IN SAL. 
* 
*     -  INITIALIZE THE FIT FROM THE MODEL FIT FOR THE RIF. 
* 
*     -  ASSIGN THE LFN USING A COMBINATION OF THE LETTER "R" AND THE 
*        SCHEMA ID FROM THE SAL ENTRY.
* 
*     -  ISSUE AN INITIAL ATTACH REQUEST WITHOUT QUEUEING.  IF
*        UNSUCCESSFUL FOR ANY REASON OTHER THAN BUSY, OR IT IS SYSTEM 
*        RECOVERY TIME, OR IMMEDIATE RETURN IS SET, SET ERROR FIELDS, 
*        RELEASE THE FIT, RESET THE SAL POINTER TO ZERO, AND RETURN 
*        FROM DB$RFIN.  IF UNSUCCESSFUL DUE TO A BUSY FILE, KEEP
*        REISSUING THE ATTACH.
* 
*     -  IF THE ATTACH IS SUCCESSFUL, OPEN THE RIF AND READ THE RIF 
*        HEADER.  VALIDATE THAT THE RIF HAS BEEN ALLOCATED. 
* 
*     -  IF ANY ERRORS OCCUR WHILE OPENING, READING, OR VALIDATING THE
*        RIF, CLOSE THE RIF (IF IT IS OPEN), RETURN THE RIF, RELEASE
*        THE FIT, AND RESET THE SAL POINTER TO ZERO.
* 
 #
  
#     LOCAL VARIABLES                                                  #
  
      ITEM ATCHMSG   C(60) =
        "  ATTACH ERROR 000 ON CDCS RESTART IDENTIFIER FILE XXXXXXX:";
      ITEM INDEX   I;              # SCRATCH - FOR LOOPS               #
  
      XREF ARRAY DB$RFIT;          # MODEL FIT FOR RESTART ID FILE     #
        BEGIN 
        ITEM RDFITWD U(00,00,60); 
        END 
  
*CALL SRERRDCLS 
  
      BASED ARRAY RIDFIT;          # FIT FOR RESTART ID FILE           #
*CALL FITDCLS 
  
      ARRAY RDREC S(DFRIFLEN);
*CALL RSTIDDCLS 
  
      BASED ARRAY MDPFT;               # POINTER TO ATTACH INFO IN MD  #
        BEGIN 
        ITEM MDPFN    U(00,00,42);     # PERMANENT FILE NAME           #
        END 
  
  
  
  
  
# S T A R T   O F   D B $ R F I N   E X E C U T A B L E   C O D E      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("RFIN");
      CONTROL ENDIF;
  
#     CLEAR ERROR STATUS WORD.                                         #
  
      P<SRERRBLK> = ERRBLKA;
      SREWORD[0] = 0; 
  
#     ALLOCATE BUFFER FOR FIT AND RECORD POINTER IN SAL.               #
  
      DB$MFA(DFFITSIZE,P<RIDFIT>);
      SARIDFIT[SALX] = LOC(RIDFIT); 
  
#     INITIALIZE THE FIT FROM THE MODEL FIT FOR THE RIF.               #
  
      FOR INDEX=DFFITSIZE-1 STEP -1 
        UNTIL 0 
      DO
        BEGIN 
        FITFW[INDEX] = RDFITWD[INDEX];
        END 
# 
*               **** TEMPORARY CODE ****
*     SET A BIT IN THE FIT TO EXEMPT THIS FILE FROM THE CRM ERROR 202 
*     THAT COULD RESULT IF THE FSMODFLG BIT IS SET IN THE FSTT WHEN 
*     THE FILE IS OPENED. 
# 
      B<0,1>FITFW[29] = 1;
  
#     ASSIGN LFN USING "R" AND SCHEMA ID FROM SAL ENTRY.               #
  
      FITLFN[0] = DB$LFN("R",SASCHID[SALX]);
  
#     ISSUE INITIAL ATTACH REQUEST WITHOUT QUEUEING.                   #
  
      P<MDPFT> = PFTBLKA; 
      DB$PSH2(P<SRERRBLK>,P<MDPFT>);
      DB$ATCH(FITLFN[0],MDPFT,FALSE); 
      DB$POP2(P<MDPFT>,P<SRERRBLK>);
  
      P<RIDFIT> = SARIDFIT[SALX]; 
  
#     IF THE INITIAL ATTACH REQUEST WAS UNSUCCESSFUL FOR ANY           #
#     REASON OTHER THAN BUSY, OR IT IS SYSTEM RECOVERY TIME, OR        #
#     IMMEDIATE RETURN IS SET, SET ERROR FIELDS, RELEASE THE FIT,      #
#     RESET THE SAL POINTER TO ZERO, AND RETURN FROM DB$RFIN.  IF      #
#     UNSUCCESSFUL DUE TO A BUSY FILE, KEEP REISSUING THE ATTACH.     # 
  
        IF ATTACHSTATUS NQ 0           # IF FIRST ATTACH UNSUCCESSFUL  #
        THEN
          BEGIN 
          IF ATTACHSTATUS GR 0 OR      # ERROR OTHER THAN BUSY OR      #
             SYSRECOVERY OR            # SYSTEM RECOVERY TIME OR       #
             TQIMRTN[0]                # IMMEDIATE RETURN SET          #
          THEN
            BEGIN 
            C<51,7>ATCHMSG = C<0,7>MDPFN[0];
            C<15,3>ATCHMSG = DB$COCT(ABS(ATTACHSTATUS),3);
            DB$MSG(ATCHMSG);           # ISSUE ERROR TO CDCS DAYFILE   #
            SRENUMB[0] = DFSRENUNA; 
            SREFPAR[0] = ATTACHSTATUS;
            SREFTYP[0] = DFSREFTRD; 
            DB$MFF(P<RIDFIT>);
            SARIDFIT[SALX] = 0; 
            RETURN; 
  
            END 
          ELSE                         # FILE BUSY AT INVOKE           #
            BEGIN 
            DB$PSH3(P<SRERRBLK>,P<MDPFT>,ATTACHSTATUS); 
  
            DB$ERR(95);                # ISSUE ERROR TO UCP            #
  
            DB$POP3(ATTACHSTATUS,P<MDPFT>,P<SRERRBLK>); 
  
            FOR INDEX = INDEX 
              WHILE ATTACHSTATUS LS 0  # WHILE FILE REMAINS BUSY       #
            DO
              BEGIN 
              C<51,7>ATCHMSG = C<0,7>MDPFN[0];
              C<15,3>ATCHMSG = DB$COCT(ABS(ATTACHSTATUS),3);
              DB$MSG(ATCHMSG);         # ISSUE ERROR TO CDCS DAYFILE   #
              DB$PSH2(P<SRERRBLK>,P<MDPFT>);
              DB$PUSH(DFATCHDELAY);    # DELAY COUNT IS PUT IN STACK   #
                                       # DB$SCHD WILL POP IT AND USE IT#
              DB$SCHD(LOC(STATCOMP),DFWAITCOUNT); 
  
              CONTROL IFGR DFFLOP,0;
                DB$FLOP("RFIN-S1"); 
              CONTROL ENDIF;
  
              DB$POP2(P<MDPFT>,P<SRERRBLK>);
              P<RIDFIT> = SARIDFIT[SALX]; 
              DB$PSH2(P<SRERRBLK>,P<MDPFT>);
              DB$ATCH(FITLFN[0],MDPFT,FALSE);         # REISSUE ATTACH #
              DB$POP2(P<MDPFT>,P<SRERRBLK>);
              P<RIDFIT> = SARIDFIT[SALX]; 
              END 
            IF ATTACHSTATUS GR 0       # IF FILE BECAME UNAVAILABLE    #
                                       # FOR ANY REASON OTHER THAN BUSY#
            THEN
              BEGIN 
              C<51,7>ATCHMSG = C<0,7>MDPFN[0];
              C<15,3>ATCHMSG = DB$COCT(ABS(ATTACHSTATUS),3);
              DB$MSG(ATCHMSG);         # ISSUE ERROR TO CDCS DAYFILE   #
              SRENUMB[0] = DFSRENUNA; 
              SREFPAR[0] = ATTACHSTATUS;
              SREFTYP[0] = DFSREFTRD; 
              DB$MFF(P<RIDFIT>);
              SARIDFIT[SALX] = 0; 
              RETURN; 
  
              END 
            END 
          END 
  
#     OTHERWISE, THE ATTACH WAS SUCCESSFUL.  OPEN THE RIF AND READ     #
#     THE RIF HEADER.  VALIDATE THAT THE RIF HAS BEEN ALLOCATED.       #
  
        DB$OPNM(RIDFIT,DB$RA0); 
        IF FITES[0] EQ 0
        THEN
          BEGIN 
          FITWSA[0] = LOC(RDREC); 
          FITKA[0] = LOC(RDID[0]);
          GETN(RIDFIT,DB$RA0);
          IF FITES[0] EQ 0
          THEN
            BEGIN 
            IF RDSCID[0] NQ DB$CDEB(SASCHID[SALX],4)
            THEN                   # RIF NOT FOR CORRECT SCHEMA        #
              BEGIN 
              SRENUMB[0] = DFSRENSCH; 
              SREFTYP[0] = DFSREFTRD; 
              END 
            END 
          END 
  
        IF FITES[0] NQ 0           # IF CRM ERROR ON OPEN OR GET,...   #
        THEN
          BEGIN 
          SRENUMB[0] = DFSRENFUN; 
          SREFUNC[0] = DFSREFNCR; 
          SREFPAR[0] = FITES[0];
          SREFTYP[0] = DFSREFTRD; 
          END 
  
#       IF ANY ERRORS OCCUR WHILE OPENING, READING, OR VALIDATING THE  #
#     RIF, CLOSE THE RIF (IF IT IS OPEN), RETURN THE RIF, RELEASE THE  #
#     FIT, AND RESET THE SAL POINTER TO ZERO.                          #
  
        IF SRENUMB[0] NQ 0
        THEN
          BEGIN 
          IF FITOC[0] EQ DFFITOCOPEN  # CLOSE FILE IF IT IS OPEN       #
          THEN
            BEGIN 
            CLOSEM(RIDFIT,DFFITCFDET,DB$RA0); 
            END 
          DB$RTN(FITLFN[0]);
          DB$MFF(P<RIDFIT>);
          SARIDFIT[SALX] = 0; 
          END 
      END 
      TERM; 
