*DECK DB$DFIN 
USETEXT CDCSCTX 
      PROC DB$DFIN( (ERRBLKA) );
      BEGIN 
 #
* *   DB$DFIN - INITIALIZE DBP LIBRARY           PAGE  1
* *   W P CEAGLIO                                DATE  01/21/81 
* 
* DC  PURPOSE 
* 
*     ATTACH THE DBP LIBRARY AND CONSTRUCT THE APL. 
* 
* DC  ENTRY CONDITIONS
* 
* D   PARAMETERS
# 
      ITEM ERRBLKA   I;            # ADDRESS OF ERROR BLOCK            #
# 
* D   ASSUMPTIONS 
* 
*     THE TQT POINTER IS SET. 
*     SALX IS SET.
*     MD IS ALREADY OPEN. 
* 
* DC  EXIT CONDITIONS 
* 
*     NORMAL   - DBP LIBRARY ATTACHED AND THE APL CONSTRUCTED.  POINTER 
*                TO APL SET IN THE SAL ENTRY. 
* 
*     ABNORMAL - POINTER IN SAL REMAINS SET TO ZERO.  INFORMATION IN THE
*                ERROR BLOCK IS COMPLETED AS FOLLOWS: 
*                    1) ERROR NUMBER = DFSRENFUN. 
*                    2) FUNCTION = ATTACH.
*                    3) PARAMETER = CONTENTS OF ATTACHSTATUS. 
*                    4) FILE TYPE = PROCEDURE LIBRARY.
* 
* DC  CALLING ROUTINES
* 
*     DB$SFIN      CONTROL ROUTINE FOR SYSTEM FILE INITIALIZATION 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ATCH;           # ATTACH SYSTEM FILE                #
      XREF FUNC DB$CDEC C(10);     # CONV INTEGER TO DECIMAL DISPLAY   #
      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 PROC DB$MBA;            # ALLOCATE TEMPORARY CMM BLOCK      #
      XREF PROC DB$MBF;            # RELEASE TEMPORARY CMM BLOCK       #
      XREF PROC DB$MDER;           # MASTER DIRECTORY ERROR HANDLER    #
      XREF PROC DB$MFA;            # ALLOCATE CMM BLOCK                #
      XREF PROC DB$MFF;            # RELEASE CMM BLOCK                 #
      XREF PROC DB$MSG;            # ISSUE DAYFILE MESSAGE             #
      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$SCHD;           # CDCS SCHEDULER                    #
      XREF PROC DB$WGET;           # READ FROM MASTER DIRECTORY        #
# 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     SAL 
*       SADBPPTR   POINTER TO DBP LIST
*       SASCHST    SCHEMA STATUS
* 
* DC  DESCRIPTION 
* 
*     -  ALLOCATE TEMPORARY BUFFER FOR ATTACH DATA AND DBP LIST, AND
*        READ THIS INFORMATION FROM THE MASTER DIRECTORY. 
* 
*     -  ALLOCATE A BUFFER FOR THE APL AND RECORD POINTER IN THE SAL. 
* 
*     -  ASSIGN AN LFN USING THE COMBINATION OF THE LETTER "P" AND THE
*        SCHEMA ID FROM THE SAL.
* 
*     -  INITIALIZE THE APL HEADER. 
* 
*     -  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, 
*        RETURN THE BUFFER FOR THE DBP LIST, RETURN THE BUFFER FOR
*        THE APL,  RESET THE SAL POINTER TO ZERO, AND RETURN FROM 
*        DB$DFIN.  IF UNSUCCESSFUL DUE TO A BUSY FILE, KEEP REISSUING 
*        THE ATTACH.
* 
*     -  IF THE ATTACH IS SUCCESSFUL, CONSTRUCT THE APL.
* 
*     -  RELEASE THE TEMPORARY BUFFER.
* 
 #
  
  
  
#     LOCAL VARIABLES                                                  #
  
      ITEM ATCHMSG   C(60) =
        "  ATTACH ERROR 000 ON CDCS PROCEDURE LIB FILE XXXXXXX:"; 
      ITEM INDEX   I;              # SCRATCH - FOR LOOPS               #
      ITEM NW      I;              # SCRATCH - NUMBER WORDS FROM MD    #
  
*CALL SRERRDCLS 
  
      BASED ARRAY MDPFT;               # POINTER TO ATTACH INFO IN MD  #
        BEGIN 
        ITEM MDPFN      U(00,00,42);   # PERMANENT FILE NAME           #
        END 
  
      BASED ARRAY MDDPT;           # FOR DBP LIST FROM MD              #
        BEGIN 
*CALL MDDPDDCLS 
        END 
  
  
*CALL FITMDDCLS 
  
  
  
  
  
  
  
# S T A R T   O F   D B $ D F I N   E X E C U T A B L E   C O D E      #
  
  
      CONTROL IFGR DFFLOP,0;
        DB$FLOP("DFIN");
      CONTROL ENDIF;
  
#     CLEAR ERROR STATUS WORD.                                         #
  
      P<SRERRBLK> = ERRBLKA;
      SREWORD[0] = 0; 
  
#     ALLOCATE TEMPORARY BUFFER FOR ATTACH DATA AND DBP LIST, AND READ #
#     INFORMATION FROM THE MD.                                         #
  
      NW = SASCDPSZ[SALX];
      DB$MBA(NW,P<MDDPT>);
      DB$WGET(DB$FTMD,MDDPT,NW,SASCWADP[SALX],DB$MDER); 
  
#     ALLOCATE BUFFER FOR APL AND SET POINTER IN SAL.                  #
  
      NW = (MDDPNBEN[0]+1)*DFAPLENSIZE; 
      DB$MFA(NW,P<APL>);
      SADBPPTR[SALX] = LOC(APL);
  
#     ASSIGN LFN USING "P" AND SCHEMA ID.                              #
  
      C<1,6>APDBPLFN[0] = DB$CDEC(SASCHID[SALX],6); 
      C<0,1>APDBPLFN[0] = "P";
  
#     INITIALIZE THE APL HEADER.                                       #
  
      APDBPSZ[0] = MDDPNBEN[0]; 
      APWORD1[0] = 0; 
  
#     ISSUE INITIAL ATTACH REQUEST WITHOUT QUEUEING.                   #
  
      P<MDPFT> = LOC(MDDPPF[0]);
      DB$PSH2(P<SRERRBLK>,P<MDPFT>);
      DB$ATCH(APDBPLFN[0],MDPFT,FALSE); 
      DB$POP2(P<MDPFT>,P<SRERRBLK>);
      P<APL> = SADBPPTR[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, RETURN THE BUFFER     #
#     FOR THE DBP LIST, RETURN THE BUFFER FOR THE APL, RESET THE       #
#     SAL POINTER TO ZERO, AND RETURN FROM DB$DFIN.  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<46,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] = DFSREFTDP; 
            DB$MBF(P<MDDPT>); 
            DB$MFF(P<APL>); 
            SADBPPTR[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<46,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("DFIN-S1"); 
              CONTROL ENDIF;
  
              DB$POP2(P<MDPFT>,P<SRERRBLK>);
              P<APL> = SADBPPTR[SALX];
              DB$PSH2(P<SRERRBLK>,P<MDPFT>);
              DB$ATCH(APDBPLFN[0],MDPFT,FALSE);       # REISSUE ATTACH #
              DB$POP2(P<MDPFT>,P<SRERRBLK>);
              P<APL> = SADBPPTR[SALX];
              END 
            IF ATTACHSTATUS GR 0       # IF FILE BECAME UNAVAILABLE    #
                                       # FOR ANY REASON OTHER THAN BUSY#
            THEN
              BEGIN 
              C<46>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] = DFSREFTDP; 
              DB$MBF(P<MDDPT>); 
              DB$MFF(P<APL>); 
              SADBPPTR[SALX] = 0; 
              RETURN; 
  
              END 
            END 
          END 
  
#     OTHERWISE, THE ATTACH WAS SUCCESSFUL.  CONSTRUCT THE APL.        #
  
        P<APL> = LOC(APL) + DFAPLENSIZE;
        APLL = MDDPNBEN[0] - 1; 
        INDEX = 0;
        FOR APLX=0 STEP 1 
          UNTIL APLL
        DO
          BEGIN 
          APDBPNAM[APLX] = B<0,42>MDDPPNAM[INDEX];
          APWORD1[APLX] = 0;
          INDEX = INDEX + 1;
          END 
  
#     RETURN TEMPORARY BUFFER.                                         #
  
      DB$MBF(P<MDDPT>); 
  
      END 
      TERM; 
