*COMDECK ATTACHF
      CONTROL EJECT;
CONTROL IFEQ OS$NAME,KRONOS;
      PROC ATTACHF (FDB, (READ$ONLY), RC);
#                                      #
#        A T T A C H F                 #
#                                      #
# THIS PROC ATTACHES ONE FILE. THE RETURN CODE -RC- IS ZERO IF THE #
# ATTACH SUCCEEDED , ONE IF IT FAILED. IT CONVERTS A SPECIAL FDB INTO # 
# THE KRONOS FET FORMAT BEFORE ATTACHING. # 
  
      BEGIN 
      XREF PROC ATTACH; 
      XREF PROC PERM;              # TO GET PERMANENT FILE PERMISSIONS #
      XREF PROC READ; 
      XREF PROC WAIT; 
      ARRAY FDB;               # SPECIAL FDB OF FILE WE WILL ATTACH # 
        BEGIN 
        ITEM FDBPFN      C(00,00,07);# FIRST SEVEN CHARS OF FULL PFN #
        ITEM FDBLFN      C(04,00,07);# LEFT JUSTIFIED, ZERO-FILLED #
        ITEM FDBUSERNUM  C(05,00,07);# LEFT JUSTIFIED, ZERO-FILLED #
        ITEM FDBPASSWORD C(06,00,07);# LEFT JUSTIFIED, ZERO-FILLED #
        ITEM FDBMODE     U(07,00,54);# INTEGER CODE FOR REQUESTED MODE #
        ITEM FDBPACKNAME C(08,00,07);# LEFT JUSTIFIED, ZERO-FILLED     #
        ITEM FDBDEVICE   U(09,00,18); #LEFT JUST. 2 CHAR DEVICE TYPE   #
                                      #MNEMONIC,6 BITS OF UNIT NUMBER  #
        END 
      ITEM READ$ONLY B;        # FLAG REQUESTING READ PERMISSION ONLY # 
      ITEM RC I;               # RETURN CODE FOR CALLING ROUTINE #
      ARRAY FET [0:12] S(1);   # FET OF FILE WE WILL ATTACH # 
        BEGIN 
        ITEM FETWORD     U(00,00,60) = [13(0)];  # PRESET TO ZEROES # 
        ITEM FETLFN      C(00,00,07); 
        ITEM FETDT       U(01,00,12); # DEV. TYPE MNEMONIC SPEC WITH R #
        ITEM FETPFN      C(08,00,07); 
        ITEM FETMODE     U(08,54,06);  # MODE OF PERMISSION REQUESTED # 
        ITEM FETUSERNUM  C(09,00,07); 
        ITEM FETPASSWORD C(10,00,07); 
        ITEM FETPACKNAME C(12,00,07);# LEFT JUSTIFIED, ZERO-FILLED     #
        ITEM FETUNIT     U(12,48,12); # UNIT NUMBER SPEC WITH R PARAM  #
        END 
      ITEM TRYING B;           # FLAG - TRYING TO ATTACH FILE # 
      ITEM READ$MODE   I;          # REQUESTED READ PERMISSION         #
      ITEM REPLY I;            # USERS RESPONSE IF CANT GET FILE #
      ITEM RC1 I;              # RETURN CODE FROM -ATTACH- #
      ITEM WAIT$TIME I;        # SECONDS TO WAIT IF FILE BUSY # 
        ITEM I; 
  
      DEF BUSY # 1 #;          # RETURN CODE FOR FILE BUSY (KRONOS PFM)#
  
      RC = 0; 
      FETPFN[0] = FDBPFN[0];   # TRANSFER VALUES FROM FDB TO FET #
      FETLFN[0] = FDBLFN[0];
      FETUSERNUM[0] = FDBUSERNUM[0];
      FETPASSWORD[0] = FDBPASSWORD[0];
      FETPACKNAME[0] = FDBPACKNAME[0];  # COPY PACKNAME (PN)           #
      FETDT[0] = B<0,12>FDBDEVICE[0]; #  STORE DEVICE TYPE CODE        #
      FETUNIT[0] = B<12,6>FDBDEVICE[0]; # STORE DEVICE UNIT NUMBER     #
      TRYING = TRUE;           # TRYING TO ATTACH THE FILE #
      WAIT$TIME = 0;           # FIRST FEW WAITS SHOULD BE SMALL #
      READ$MODE = O"41";           # DEFAULT IS STRAIGHT READ          #
      IF READ$ONLY                 # CHECK IF R/M                      #
      THEN
        BEGIN 
        IF FDBMODE[0] EQ O"46"     # R/M MODE                          #
        THEN
          BEGIN 
          READ$MODE = FDBMODE[0]; 
          END 
        FETMODE[0] = READ$MODE; 
        END 
      ELSE
        IF FDBMODE[0] EQ 0 THEN    # NO MODE SPECIFIED  # 
          FETMODE[0] = READ$MODE;  # SO ONLY ASK FOR READ PERMISSION #
        ELSE FETMODE[0] = FDBMODE[0]; 
  
      FOR DUMMY=DUMMY                                                    ATTACHF
        WHILE TRYING                                                     ATTACHF
      DO                                                                 ATTACHF
        BEGIN 
        ATTACH(FET, RC1);          # TRY ATTACHING FILE                #
        IF RC1 EQ 0 THEN
          BEGIN 
          PERM(FDB);               # GET PERMANENT FILE PERMISSIONS    #
          TRYING = FALSE;      # GOOD ATTACH, STOP TRYING # 
          END 
        ELSE
          IF RC1 EQ BUSY THEN      # MAYBE SHOULD TRY AGAIN # 
            IF TERMINAL EQ 1 THEN  # INTERACTIVE MODE # 
              BEGIN 
              PFDIAG(FET, RC1);    # TELL USER FILE UNAVAILABLE        #
              DIAG(1004, C<0,7>FETPFN[0]);  # CAN-T GET IT, TRY AGAIN Q# ATTACHF
              DIAG(1005);          # -ANSWER Y OR N-                   # ATTACHF
              READ(REPLY, DUMMY, 10, DUMMY);                             ATTACHF
              IF C<0,1>REPLY EQ "N" THEN
                BEGIN 
                RC = 1;        # FILE NOT ATTACHED #
                TRYING = FALSE;  # STOP TRYING TO ATTACH THE FILE # 
                END 
              END 
            ELSE                   # BATCH MODE # 
              BEGIN 
              IF WAIT$TIME LS 60 THEN WAIT$TIME = WAIT$TIME + 10; 
              WAIT(WAIT$TIME);     #AFTER WAIT - STILL TRYING          # ATTACHF
              END 
          ELSE                     # NOT BUSY - DIAGNOSE PROBLEM #
            BEGIN 
            PFDIAG(FET, RC1);      #PERMANENT FILE DIAGNOSTIC          # ATTACHF
            RC = 1;                # FILE NOT ATTACHED #
            TRYING = FALSE;        # STOP TRYING TO ATTACH THE FILE # 
            END 
        END                    # END OF TRYING LOOP # 
      END                      # END OF ATTACHF # 
CONTROL ENDIF;
      CONTROL EJECT;
CONTROL IFEQ OS$NAME,SCOPE; 
      PROC ATTACHF (FDB, (READ$ONLY), RC);
#                                      #
#        A T T A C H F                 #
#                                      #
# THIS PROC ATTACHES ONE FILE. THE RETURN CODE -RC- IS ZERO IF THE #
# ATTACH SUCCEEDED, ONE IF IT FAILED. # 
  
      BEGIN 
      XREF PROC ATTACH; 
      XREF PROC PERM;              # TO GET PERMANENT FILE PERMISSIONS #
      XREF PROC READ; 
      XREF PROC WAIT; 
      ARRAY FDB;               # FDB OF FILE WE ARE TO ATTACH # 
        ITEM FDBWORD I (00,00,60);
      ITEM READ$ONLY B;        # FLAG REQUESTING READ PERMISSION ONLY # 
      ITEM RC I;               # RETURN CODE FOR CALLING ROUTINE #
      ITEM MRINDEX I;          # INDEX INTO FDB WHERE MR=1 STORED # 
      ITEM TRYING B;           # FLAG - TRYING TO ATTACH THE FILE # 
      ITEM REPLY I;            # USERS RESPONSE IF CANT GET FILE #
      ITEM RC1 I;              # RETURN CODE FROM -ATTACH- CALL # 
        ITEM I; 
  
      DEF MR1 # O"0111" #;     # CODE FOR MR=1, MULTI-READ #
      DEF BUSY # O"37" #;          # PFM RETURN CODE FOR FILE BUSY     #
  
      MRINDEX = 0;
      IF READ$ONLY                 # IF ATTACHING FOR READING ONLY     #
      THEN
        BEGIN 
        FOR I = 5 STEP 1           # FOR EACH FDB PARAMETER WORD       #
        WHILE MRINDEX EQ 0         # WHILE SLOT FOR MR = 1 NOT FOUND   #
        DO
          BEGIN 
          IF FDBWORD[I] EQ 0       # IF AT END OF LIST                 #
          THEN
            BEGIN 
            FDBWORD[I] = MR1;      # STUFF IN AN MR=1 PARAMETER        #
            FDBWORD[I+1] = 0;      # ESTABLISH NEW END OF LIST         #
            MRINDEX = I;           # REMEMBER WHERE MR=1 WAS PUT       #
            END 
          END 
        END 
  
      TRYING = TRUE;           # TRYING TO ATTACH THE FILE #
      FOR DUMMY = DUMMY 
        WHILE TRYING
      DO                                                                 ATTACHF
        BEGIN 
        ATTACH(FDB, RC1);                                                ATTACHF
        IF RC1 EQ 0 THEN
          BEGIN 
          RC = 0;                  # GOOD ATTACH, RETURN CODE = 0      # ATTACHF
          PERM(FDB);               # GET PERMANENT FILE PERMISSIONS    #
          TRYING = FALSE;      # GOOD ATTACH, STOP TRYING # 
          END 
        ELSE
          BEGIN                                                          ATTACHF
          IF RC1 EQ BUSY THEN 
            BEGIN 
            PFDIAG(FDB, RC1);      # TELL USER FILE UNAVAILABLE        #
            DIAG(1004, FDB);       #CANT GET IT, SHALL WE TRY AGAIN QQ # ATTACHF
            DIAG(1005);            # -ANSWER Y OR N-                   # ATTACHF
            READ(REPLY, DUMMY, 10, DUMMY);                               ATTACHF
            IF C<0,1>REPLY EQ "N" THEN
              BEGIN 
              RC = 1;          # FILE NOT ATTACHED #
              TRYING = FALSE;  # STOP TRYING TO ATTACH THE FILE#
              END 
            END 
          ELSE                 # NOT BUSY - DIAGNOSE PROBLEM #
            BEGIN 
            IF RC1 NQ RC                                                 ATTACHF
            THEN                   # IF ERROR TO BE DIAGNOSED          # ATTACHF
              BEGIN                                                      ATTACHF
              PFDIAG (FDB, RC1);   # ISSUE DIAGNOSTIC                  # ATTACHF
              RC = 1;              # FILE NOT ATTACHED                 # ATTACHF
              END                                                        ATTACHF
                                                                         ATTACHF
            ELSE                                                         ATTACHF
              BEGIN                                                      ATTACHF
              RC = RC1;            # RETURN WITH ACTUAL ERROR CODE     # ATTACHF
              END                                                        ATTACHF
                                                                         ATTACHF
            TRYING = FALSE;    # STOP TRYING TO ATTACH THE FILE # 
            END 
          END                                                            ATTACHF
        END                    # END OF TRYING LOOP # 
      IF READ$ONLY
      THEN
        BEGIN 
        FDBWORD[MRINDEX] = 0;      # CLEAR MR1                         #
        END 
      END                      # END OF ATTACHF # 
CONTROL ENDIF;
