*DECK DB$ATWR*                                                         HCT
USETEXT CUGDFTX 
      PROC DB$ATWR(LFN,PFINFO,ATTACHSTATUS);
      BEGIN 
 #
* *   DB$ATWR--NOS ATTACH PROCESSOR              PAGE  1
* *   J E ESLER                                  DATE  02/02/77 
* 
* DC  PURPOSE 
* 
*     ATTACH PERMANENT FILES FOR NOS. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETERS
# 
      ITEM LFN;              #LFN FOR FILE# 
      ARRAY PFINFO; 
        BEGIN 
        ITEM PFN C(0,0,7);   #PERMANENT FILE NAME (MAX OF 7 CHARS)# 
        ITEM PFID C(1,0,7);  #PERMANENT FILE ID (MAX OF 7 CHARS)# 
        ITEM PFPW C(2,0,7);  #PASSOWRD (MAX OF 7 CHARS)#
        ITEM PFPN C(7,0,7);  #PACKNAME (MAX OF 7 CHARS)#
        ITEM PFFMF  B(7,59,1);     # TRUE IF FAMILY NAME               #
        ITEM PFDT   C(8,36,2);     # DEVICE TYPE                       #
        ITEM PFUNIT U(8,48,6);     # AUXILIARY UNIT                    #
        END 
      ITEM ATTACHSTATUS;     #RETURN CODE FROM PFM# 
# 
*     ASSUMPTIONS 
* 
*     ARRAY ITEM PFID - MUST BE ZERO-FILLED.
*     ARRAY ITEM PFN  - MUST BE ZERO-FILLED.
*     ARRAY ITEM PFPN - MUST BE ZERO-FILLED.
*     ARRAY ITEM PFPW - MUST BE ZERO-FILLED.
* 
* DC  EXIT CONDITIONS 
* 
*     PARAMETER ATTACHSTATUS
*       = 0 IF PERMANENT FILE ATTACHED
*       OTHERWISE PF ERROR CODE.
* 
* DC  CALLING ROUTINES
* 
*     DBQRFA                 QRF UTILITY
*     DB$AINT                CONTROL CARD CRACKING
*     DB$ARAT                ATTACH DB AREA FOR UTILITIES 
* 
* DC  CALLED ROUTINES 
# 
      XREF PROC DB$ATCR;           #ISSUE ATTACH MACRO FOR NOS# 
      XREF FUNC DB$COCT C(10);     #BINARY TO OCTAL DISPLAY CODE# 
      XREF PROC DB$FAM;            #SET FAMILY NAME                    #
      XREF PROC DB$MSG;            #ISSUE DAYFILE MESSAGE#
      XREF PROC DB$RCLM;           #ISSUE RECALL                       #
# 
* 
* DC  NON-LOCAL VARIABLES 
* 
# 
      XDEF ITEM DB$NOSU B = TRUE;  # ON NOS DB$NOSU IS TRUE            #
 #
*     LOCAL VARIABLES.
# 
      DEF PTRD #1#;                # PF MODE FOR READ PERMISSION       #
  
      ITEM BADATCHMSG C(33) = " PFM ERROR XXX ATTACHING FILENAM:";
      ITEM FAMNAME C(7);           # FAMILY NAME PASSED AS PARAMETER   #
      ITEM INDEX;            #LOOP INDEX# 
      ITEM INDEX2;           #LOOP INDEX# 
      ITEM PRIORSTAT;              # STATUS OF THE PRIOR ATTACH        #
      ITEM WAITCOUNT I = 10;       # RECALLS BEFORE NEXT ATTACH        #
      ITEM WAITMSG C(29) = " WAIT PFM ERR XXX ON FILENAM:"; 
      ARRAY PFMFET (DFNOSATFETSZ);
        BEGIN 
        ITEM ATFTWD  U(0,0,60); 
        ITEM ATFTLFN U(0,0,60);    #LFN FOR FILE# 
        ITEM ATFTDT  C(1,0,02);    #DEVICE TYPE                        #
        ITEM ATFTEC  U(0,42,8);    #PF ERROR CODE#
        ITEM ATFTCOMP U(0,59,1);   #COMPLETE BIT# 
        ITEM ATFTLEN U(1,36,6);    #LENGTH - 5 OF FET#
        ITEM ATFTEP  U(1,15,1);    #ERROR PROCESSING BIT# 
        ITEM ATFTPFN C(8,0,7);     #PFN FOR FILE# 
        ITEM ATFTMODE U(8,54,6);   #ACCESS MODE#
        ITEM ATFTUN C(9,0,7);      #USER NUMBER#
        ITEM ATFTPW  C(10,0,7);    #PF PASSWORD#
        ITEM ATFTPN  C(12,0,7);    #PF PACK NAME# 
        ITEM ATFTUNIT U(12,48,12); #AUXILIARY UNIT                     #
        END 
  
  
  
#**********************************************************************#
#                                                                      #
#     I N T E R N A L   P R O C E D U R E   -   A T T A C H            #
#                                                                      #
#**********************************************************************#
  
 #
*     INTERNAL PROCEDURES 
* 
*     ATTACH - ISSUE ATTACH REQUEST AND SAVE RETURN CODE. 
 #
      PROC ATTACH;
      BEGIN 
      DB$ATCR(LOC(PFMFET)); 
      ATTACHSTATUS = ATFTEC[0]; 
      IF ATTACHSTATUS EQ O"001"    # FILE BUSY                         #
        OR ATTACHSTATUS EQ O"016"  # PF UTILITY ACTIVE                 #
        OR ATTACHSTATUS EQ O"104"  # INTERLOCK NOT AVAILABLE           #
        OR ATTACHSTATUS EQ O"107"  # FNT FULL                          #
        OR ATTACHSTATUS EQ O"111"  # PFM EXCESS ACTIVITY               #
      THEN
        BEGIN 
        ATTACHSTATUS = -ATTACHSTATUS; 
        END 
      END 
  
  
#     B E G I N   D B $ A T W R   E X E C U T A B L E   C O D E .      #
  
 #
* 
* DC  DESCRIPTION 
* 
*     GENERATE FET FOR PF ATTACH. 
 #
      FOR INDEX = DFNOSATFETSZ-1 STEP -1 UNTIL 0 DO 
        ATFTWD[INDEX] = 0;
      ATFTLFN[0] = LFN * 2**18; 
      ATFTCOMP[0] = 1;
      ATFTLEN[0] = DFNOSATFETSZ - 5;
      ATFTEP[0] = 1;
      ATFTPFN[0] = PFN[0];
      ATFTPW[0] = PFPW[0];
      ATFTUN[0] = PFID[0];
  
#     THE FOLLOWING TEST IS MADE TO SEE IF THE VALUE STORED            #
#     IN ARRAY ITEM PFPN[0] IS THE PACKNAME OR THE FAMILY NAME.        #
#     IF THE ARRAY ITEM PFFMF[0] IS TRUE THEN THE VALUE STORED         #
#     IN PFPN[0] IS THE FAMILY NAME AND IT WILL BE MOVED TO THE        #
#     FET.  IF PFFMF[0] IS FALSE THEN THE PACKNAME HAS BEEN STORED     #
#     AND THE VALUE IN PFPN[0] WILL BE MOVED TO THE PACKNAME           #
#     FIELD OF THE FET.                                                #
  
      IF PFFMF[0] 
      THEN
        BEGIN 
        FAMNAME = PFPN[0];         # SCALAR USED IN PROCEDURE CALL     #
        B<42,18>FAMNAME = 0;       # ZERO-FILL THE REST OF THE WORD    #
                                   # WHICH CONTAINS THE VALUE OF       #
                                   # FAMNAME TO ELIMINATE ANY GARBAGE. #
        DB$FAM(FAMNAME);           # SET FAMILY NAME                   #
        END 
      ELSE
        BEGIN 
        ATFTPN[0] = PFPN[0];       # PACK NAME                         #
        END 
  
  
      ATFTDT[0] = PFDT[0];         # SET DEVICE TYPE                   #
      ATFTUNIT[0] = PFUNIT[0];     # SET AUXILIARY DEVICE NUMBER       #
  
 #
*     IF THE FILE BEING ATTACHED IS THE MASTER DIRECTORY FILE,  SET 
*     ACCESS MODE FOR READ PERMISSION.
 #
      IF C<3,7>LFN EQ "MSTRDIR"    # IF MASTER DIRECTORY FILE          #
      THEN
        BEGIN 
        ATFTMODE[0] = PTRD;        # ACCESS MODE = READ                #
        END 
  
 #
*     CALL INTERNAL PROCEDURE ATTACH TO ATTACH THE FILE.
 #
      PRIORSTAT = 0;
      ATTACHSTATUS = -1;
      FOR INDEX = INDEX WHILE ATTACHSTATUS LS 0 
      DO
        BEGIN 
        ATTACH;                    # TRY TO ATTACH FILES               #
  
        IF ATTACHSTATUS LS 0 THEN      # WAIT FOR ATTACH               #
          BEGIN 
          IF PRIORSTAT NQ ATTACHSTATUS
          THEN
            BEGIN 
            C<14,3>WAITMSG = DB$COCT(-ATTACHSTATUS,3);
            C<21,7>WAITMSG = C<0,7>PFN[0];
            DB$MSG(WAITMSG);
            END 
          FOR INDEX2 = WAITCOUNT STEP -1 UNTIL 0
          DO
            BEGIN 
            DB$RCLM;
            END 
          IF WAITCOUNT LS 200 
          THEN
            BEGIN 
            WAITCOUNT = WAITCOUNT +1; 
            END 
          END 
        PRIORSTAT = ATTACHSTATUS; 
        END 
      IF PFFMF                     # IF FAMILY NAME SET                #
      THEN
        BEGIN 
        DB$FAM(FAMNAME);           # RESTORE DEFAULT FAMILY            #
        END 
      IF ATTACHSTATUS NQ 0 THEN        #PFM ERROR#
        BEGIN 
        C<11,3>BADATCHMSG = DB$COCT(ATTACHSTATUS,3);
        C<25,7>BADATCHMSG = C<0,7>PFN[0]; 
        DB$MSG(BADATCHMSG); 
        END 
      RETURN; 
      END 
      TERM
