*DECK RCM00                        08SEP81
USETEXT COMCBEG 
USETEXT COMCAPR 
USETEXT COMCCAE 
USETEXT COMQDEF 
USETEXT COMQCAF 
USETEXT COMQFIL 
USETEXT COMQNET 
    PROC RCM00; 
      BEGIN    # RCM00 #
# 
**    RCM00      PROCESS COMMAND 0 (REQUEST FILE TRANSFER). 
* 
*     RCM00 EXTRACTS AND VALIDATES THE ATTRIBUTES SUPPLIED WITH THE 
*     COMMAND, SETS UP THE AFT ENTRY, AND SENDS A POSITIVE OR NEGATIVE
*     REPLY TO THE REMOTE QTF.
* 
*     PROC RCM00
* 
*     ENTRY      ACN = AFT ENTRY INDEX (CONNECTION NUMBER). 
* 
*     EXIT       AFT ENTRY STATUS UPDATED.
*                REPLY SENT (RPOS/RNEG).
* 
*     PROCESS    IF COMMAND NOT CONTINUED:  
*                  IF PREVIOUS TRANSFER INCOMPLETE: 
*                    CALL ILLSEQ
*                    EXIT.
*                  BUILD RPOS MESSAGE (POSITIVE REPLY). 
*                ELSE (COMMAND CONTINUED):  
*                  IF PREVIOUS COMMAND NOT RFT: 
*                    CALL ILLSEQ
*                    EXIT.
*                PROCESS ATTRIBUTES:  
*                  IF NOT REQUIRED OR OPTIONAL: 
*                    INDICATE ATTRIBUTE IGNORED.
*                  ELSE:  
*                    IF QUALIFIER NOT "SELECT": 
*                      FILECER = TRUE (ERROR).
*                    ELSE:  
*                      UPDATE AFT ENTRY.
*                IF COMMAND CONTINUED (ATTRIBUTE 30): 
*                  EXIT.
*                ELSE:  
*                  SET DEFAULTS FOR ATTRIBUTES NOT RECEIVED 
*                  IF REQUIRED ATTRIBUTE MISSING: 
*                    FILECER = TRUE (ERROR).
*                  CALL PCM00 TO PROCESS RECEIVED ATTRIBUTES
*                  IF NAM AND FACILITY (ATTRIBUTE 03) NOT RECEIVED: 
*                    STORE ATTR 03 (SELECT *S*) IN RPOS COMMAND,
*                    SET FILEFCI = *S* FOR NETXFR.
*                  IF MAXIMUM BLOCK SIZE (ATTRIBUTE 12) RECEIVED: 
*                    CALL MBZ TO COMPUTE RPOS ATTR 12 
*                    IF COMPUTED LT RECEIVED: 
*                      SEND RPOS ATTR 12 WITH MODIFY
*                    ELSE IF COMPUTED GT RECEIVED:  
*                      FILECER = TRUE (ERROR).
*                  ELSE (ATTR 12 NOT RECEIVED): 
*                    IF NAM:  
*                      CALL MBZ TO COMPUTE RPOS ATTR 12 
*                      SEND RPOS ATTR 12 WITH SELECT. 
*                  IF FILECER (ERROR):  
*                    CALL FREENTA 
*                    BUILD REPLY MESSAGE (RNEG) 
*                    UPDATE AFT ENTRY (RNEG SENT).
*                  ELSE:  
*                    BUILD REPLY MESSAGE (RPOS) 
*                    UPDATE AFT ENTRY (RPOS SENT).
*                  UPDATE AFT ENTRY (RFT RECEIVED)
*                  CALL CMDPUT. 
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC ACSTORE; 
        PROC APFTCH;               # GET ATTRIBUTE #
        PROC APSTOR;
        PROC CMDPUT;
        PROC CONLOG;
        PROC FACCHK;               # CHECK FACILITIES # 
        PROC FREENTA; 
        FUNC GENLFN     C(10);     # GENERATE LFN # 
        FUNC GETLIDA    I;
        PROC ILLSEQ;
        FUNC MBZ        U;         # MAXIMUM BLOCK SIZE # 
        PROC NAME;                 # DEBUG CODE # 
        PROC PCM00; 
        PROC RMTLOG;
        PROC RMTSMB;
        PROC SETNTA;
        PROC TXTGET;
        PROC TXTPUT;
        FUNC VALFN      C(10);
        FUNC XDXB       B;         # CONVERT CHARACTER TO INTEGER # 
        FUNC YCDZ       C(10);
        END 
# 
****  XREF END
# 
  
  
      DEF LEMSGRCV   #33#;
      ARRAY EMSGRCV    S(4);
        BEGIN 
        ITEM $DRCV      C(00,00,LEMSGRCV) = 
                 ["RECEIVING, DC=XX, ST=XXX, DO=XXX."]; 
        ITEM EMSGRCDC   C(01,24,02);
        ITEM EMSGRCST   C(02,06,03);
        ITEM EMSGRCDO   C(02,54,03);
        END 
  
    CONTROL IFEQ OS$NOS;
      DEF LEMSGWTS   #32#;
      ITEM EMSGWTS    C(LEMSGWTS) = 
                 "NO USERNAME FOR *DC=WT/TT* FILE.";
    CONTROL ENDIF;
      ITEM AT         I;
      ITEM CS         C(2); 
      ITEM CR         C(2); 
      ITEM MODE       C(AT$MAL);
      ITEM J          I;
      ITEM I          U;
      ITEM ERR        B;
      ITEM ERTERR     B;
      ITEM FACNXFR    U;           # NETXFR FACILITIES TEXT # 
      ITEM FACQUAL    C(1);        # FACILITIES QUALIFIER # 
      ITEM FACTEXT    C(10);       # FACILITIES TEXT #
      ITEM FACTXTL    I;           # NUMBER OF CHARACTERS # 
      ITEM IRTERR     B;
      ITEM PIDERR     B;           # PROTOCOL IDENT MISMATCH #
      ITEM SRTERR     B;
      ITEM BAT        I;           # BAD ATTRIBUTE NUMBER # 
      ITEM BQL        C(10);       # BAD ATTR QUALIFIER # 
      ITEM BTL        U;           # BAD ATTR TEXT LENGTH # 
  
      ARRAY BTX;                   # BAD ATTRIBUTE TEXT # 
        BEGIN 
        ITEM BTXWD      C(00,00,10);
        END 
  
      ARRAY;                       # ALL REQUIRED/OPTIONAL ATTRIBUTES # 
        BEGIN 
        ITEM RFTWD0     U(0,0,60);
        ITEM RFT00      B(0,AT$PI,1) = [TRUE];
        ITEM RFT03      B(0,AT$FC,1) = [TRUE];
        ITEM RFT05      B(0,AT$UT,1) = [TRUE];
        ITEM RFT06      B(0,AT$FS,1) = [TRUE];
        ITEM RFT12      B(0,AT$BZ,1) = [TRUE];
        ITEM RFT16      B(0,AT$FN,1) = [TRUE];
        ITEM RFT17      B(0,AT$OD,1) = [TRUE];
        ITEM RFT18      B(0,AT$AW,1) = [TRUE];
        ITEM RFT20      B(0,AT$TO,1) = [TRUE];
        ITEM RFT21      B(0,AT$MA,1) = [TRUE];
        ITEM RFT22      B(0,AT$HT,1) = [TRUE];
        ITEM RFT24      B(0,AT$SL,1) = [TRUE];
        ITEM RFT25      B(0,AT$LD,1) = [TRUE];
        ITEM RFT26      B(0,AT$JN,1) = [TRUE];
        ITEM RFT27      B(0,AT$PD,1) = [TRUE];
        ITEM RFT29      B(0,AT$EB,1) = [TRUE];
        ITEM RFT30      B(0,AT$AC,1) = [TRUE];
        ITEM RFT31      B(0,AT$DD,1) = [TRUE];
        ITEM RFT32      B(0,AT$SR,1) = [TRUE];
        ITEM RFT33      B(0,AT$RU,1) = [TRUE];
        END 
  
      ARRAY;                       # ALL REQUIRED ATTRIBUTES #
        BEGIN 
        ITEM REQATTR    U(00,00,60);
        ITEM REQATT00   B(00,AT$PI,01) = [TRUE];
        ITEM REQATT16   B(00,AT$FN,01) = [TRUE];
        ITEM REQATT22   B(00,AT$HT,01) = [TRUE];
        ITEM REQATT25   B(00,AT$LD,01) = [TRUE];
        ITEM REQATT26   B(00,AT$JN,01) = [TRUE];
        END 
  
      SWITCH   ATXX   AT00,          # PROCESS AT$PI #
                      ATEND,         # 01 # 
                      ATEND,         # 02 # 
                      AT03,          # PROCESS AT$FC #
                      ATEND,         # 04 # 
                      AT05,          # PROCESS AT$UT #
                      AT06,          # PROCESS AT$FS #
                      ATEND,         # 07 # 
                      ATEND,         # 08 # 
                      ATEND,         # 09 # 
                      ATEND,         # 10 # 
                      ATEND,         # 11 # 
                      AT12,          # PROCESS AT$BZ #
                      ATEND,         # 13 # 
                      ATEND,         # 14 # 
                      ATEND,         # 15 # 
                      AT16,          # PROCESS AT$FN #
                      AT17,          # PROCESS AT$OD #
                      AT18,          # PROCESS AT$AW #
                      ATEND,         # 19 # 
                      AT20,          # PROCESS AT$TO #
                      AT21,          # PROCESS AT$MA #
                      AT22,          # PROCESS AT$HT #
                      ATEND,
                      AT24,          # PROCESS AT$SL# 
                      AT25,          # PROCESS AT$LD #
                      AT26,          # PROCESS AT$JN #
                      AT27,          # PROCESS AT$PD #
                      ATEND,
                      AT29,          # PROCESS AT$EB #
                      AT30,          # PROCESS AT$AC #
                      AT31,          # PROCESS AT$DD #
                      AT32,          # PROCESS AT$SR# 
                      AT33;          # PROCESS AT$RU #
  
      DEF MAXATXX    #33#;         # LARGEST AT IN SWITCH # 
  
  
        $BEGIN
        NAME("RCM00");             # DEBUG CODE # 
        $END
  
      IF NOT FILEBIP               # IF COMMAND NOT CONTINUED # 
      THEN
        BEGIN 
        FILECWD=RFTWD0;            # SET COMMAND FLAGS #
        IF FILECMD NE 0            # IF PREVIOUS TRANSFER INCOMPLETE #
        THEN
          BEGIN 
          ILLSEQ;                  # INVALID MESSAGE SEQUENCE # 
          RETURN; 
          END 
  
        FILESTX = STO$NORMAL; 
        FREENTA;                   # GET NET BUFFER # 
        ACSTORE (NTA$B, CM$RPOS, NTLMAX);  # STORE RPOS COMMAND # 
        APSTOR(NTA$B,AT$PI,ATQ$S,AT$PIL,PROTOCL);  # PROTOCOL ID #
        APSTOR(NTA$B,AT$PD,ATQ$S,AT$PDL,HID);  # STORE HOST PID # 
  
      CONTROL IFEQ OS$NOSBE;
        APSTOR(NTA$B,AT$HT,ATQ$S,AT$HTL,NBE);  # STORE HOST TYPE #
      CONTROL ENDIF;
  
      CONTROL IFEQ OS$NOS;
        APSTOR(NTA$B,AT$HT,ATQ$S,AT$HTL,NS2);  # STORE HOST TYPE #
        IF NAM
        THEN
          BEGIN 
          FILEACKW = MINACKW;      # SET DEFAULT ACK-WINDOW # 
          END 
  
      CONTROL ENDIF;
  
        FILEDDC = "  ";            # ASSUME CHARACTER MODE #
        BAT = -1;                  # CLEAR BAD ATTR FLAG #
        END 
  
      ELSE                         # PROCESS CONTINUED COMMAND #
        BEGIN 
        IF FILEBNO NE CM$RFT       # IF CURRENT COMMAND NOT RFT # 
        THEN
          BEGIN 
          ILLSEQ;                  # INVALID COMMAND SEQUENCE # 
          RETURN; 
          END 
  
        SETNTA(FILEWHA);
        END 
  
      FILEBIP=FALSE;               # CLEAR BLOCK-CONTINUED FLAG # 
  
      SLOWFOR AT=0 WHILE AT GQ 0   # PROCESS ALL ATTRIBUTES # 
      DO
        BEGIN 
        APFTCH(NTAH,AT,QUAL,ATTEXTL,ATTEXT);  # GET ATTRIBUTE # 
        QUAL=C<0,1>QUAL;           # GET QUALIFIER #
        IF AT LS 0                 # IF END OF ATTRIBUTES # 
        THEN
          BEGIN 
          CYCLE AT;                # EXIT LOOP #
          END 
  
        IF (AT GT MAXATXX)         # IF ATTRIBUTE TOO LARGE # 
          OR (B<AT,1>RFTWD0 EQ 0)  #   OR UNKNOWN # 
        THEN
          BEGIN 
          APSTOR(NTA$B,AT,ATQ$I,ATTEXTL,ATTEXT);  # SET IGNORE #
          END 
  
        ELSE                       # ATTRIBUTE REQUIRED/OPTIONAL #
          BEGIN 
          IF QUAL NQ ATQ$S         # IF QUALIFIER NOT SELECT #
          THEN
            BEGIN 
            FILECER=TRUE;          # SET ERROR FLAG # 
            GOTO ATEND;            # CONTINUE # 
            END 
  
          B<AT,1>FILECWD=0;        # CLEAR LOCAL ATTR-RECEIVED FLAG # 
  
          GOTO ATXX[AT];           # PROCESS ATTRIBUTE #
  
  
AT00:                              # AT$PI - PROTOCOL IDENTIFIER #
            IF C<0,4>ATEXTWD[0] EQ PROTOCL
            THEN
              BEGIN 
              PIDERR = FALSE;      # PROTOCOL IDENTS MATCH #
              END 
  
            ELSE
              BEGIN 
              PIDERR = TRUE;       # PROTOCOL IDENTS DIFFER # 
              FILECER = TRUE;      # SET ERROR FLAG # 
              FILESTX = STO$UNSPEC;  # STATE OF TRANSFER #
              END 
  
          GOTO ATEND; 
  
  
AT03:                              # AT$FC - FACILITY # 
          FACCHK (ATEXTWD[0],ATTEXTL,NAM,0, 
                  FACTEXT,FACTXTL,FACQUAL,FACNXFR,I); 
          FILEFCI = FACNXFR;       # SET NETXFR FACILITIES #
          IF I NE 0 
          THEN
            BEGIN 
            APSTOR(NTA$B,AT,FACQUAL,FACTXTL,FACTEXT); 
            END 
  
          GOTO ATEND; 
  
  
AT05:                              # AT$UT - EXPLICIT ROUTING TEXT #
          IF ATTEXTL GT 0          # IF NOT EMPTY TEXT STRING # 
          THEN
            BEGIN 
            TXTPUT(I,LOC(ATEXTWD[0]),ATTEXTL);
            FILEERT = I;
            END 
  
          GOTO ATEND;              # END OF CASE #
  
  
AT06:                              # AT$FS - FILE SIZE #
          IF NOT XDXB(ATEXTWD[0], 1, I) 
          THEN
            BEGIN 
            FILESIZ = I;
            END 
  
          GOTO ATEND;              # END OF CASE #
  
  
AT12:                              # AT$BZ - MAXIMUM BLOCK SIZE # 
          ERR = XDXB(ATEXTWD[0], 1, I); 
          IF ERR
            OR (I LE 0) 
          THEN
            BEGIN 
            FILECER = TRUE; 
            END 
  
          ELSE
            BEGIN 
            FILEMBZ = I;
            END 
  
          GOTO ATEND;              # END OF CASE #
  
  
AT16:                              # AT$FN - FILE NAME #
          FILEQFNC = VALFN(ATEXTWD[0]);  # SAVE FILE NAME # 
          FILELFNC = GENLFN;       # USE UNIQUE LFN # 
          GOTO ATEND;                # END OF CASE #
  
  
AT17:                              # AT$OD - OUTPUT DEVICE TYPE # 
          FILEOTY=ATEXTWD[0];      # SAVE DEVICE TYPE # 
          GOTO ATEND;              # END OF CASE #
  
  
AT18:                              # AT$AW - ACKNOWLEDGEMENT WINDOW # 
          ERR = XDXB(ATEXTWD[0], 1, I); 
          IF ERR
            OR (I LT MINACKW) 
          THEN
            BEGIN 
            FILECER = TRUE; 
            END 
  
          ELSE
            BEGIN 
            IF NAM
            THEN
              BEGIN 
              FILEACKW = I; 
              IF FILEACKW GT MAXACKW
              THEN
                BEGIN 
                FILEACKW = MAXACKW;  # SET TO MAXIMUM # 
                APSTOR(NTA$B,AT$AW,ATQ$M,AT$AWL,YCDZ(FILEACKW,AT$AWL)); 
                END 
  
              END 
  
            ELSE
              BEGIN 
              APSTOR(NTA$B,AT,ATQ$I,ATTEXTL,ATTEXT);
              END 
  
            END 
  
          GOTO ATEND; 
  
AT20:                              # AT$TO - TIME OUT VALUE # 
          ERR = XDXB(ATEXTWD[0], 1, I); 
          IF ERR
            OR (I LE 0) 
          THEN
            BEGIN 
            FILECER = TRUE; 
            END 
  
          ELSE
            BEGIN 
            FILETOU = I;           # USE NEW TIME OUT VALUE # 
            END 
  
          GOTO ATEND;                # END OF CASE #
  
  
AT21:                              # AT$MA - MODE OF ACCESS # 
          MODE=ATEXTWD[0];
          IF (MODE NE MA$MKO) 
            AND (MODE NE MA$EFD)
            AND (MODE NE MA$IFD)
          THEN
            BEGIN 
            FILECER = TRUE;        # SET ERROR FLAG # 
            END 
  
          GOTO ATEND;                # END OF CASE #
  
  
AT22:                              # AT$HT - REMOTE HOST TYPE # 
          FILERMH=ATEXTWD[0];      # SAVE HOST TYPE # 
          GOTO ATEND;                # END OF CASE #
  
  
AT24:                              # AT$SL - SOURCE LID # 
          GLA$RETURN = GETLIDA(ATEXTWD[0]); 
          IF GLA$ATTRIB NE 0
          THEN
            BEGIN 
            FILESLDC = ATEXTWD[0];
            END 
  
          ELSE
            BEGIN 
            FILECER = TRUE; 
            END 
  
          GOTO ATEND;              # END OF CASE #
  
  
AT25:                              # AT$LD - LID #
          GLA$RETURN = GETLIDA(ATEXTWD[0]); 
          IF GLA$HOST              # IF HOST LID #
            OR GLA$SFHOST          #   OR STORE-FORWARD HOST #
          THEN
            BEGIN 
            FILELIDSH = GLA$SFHOST; 
            FILELIDC = ATEXTWD[0];
            END 
  
          ELSE
            BEGIN 
            FILECER = TRUE; 
            END 
  
          GOTO ATEND;                # END OF CASE #
  
  
AT26:                              # AT$JN - JOB NAME # 
          FILEJBN = VALFN(ATEXTWD[0]);  # SAVE JOB NAME # 
          GOTO ATEND;                # END OF CASE #
  
AT27:                              # AT$PD - REMOTE HOST PID #
          FILECPDC = ATEXTWD[0];   # SAVE PID # 
          GOTO ATEND;              # END OF CASE #
  
  
AT29:                              # AT$EB - ECHO BACK #
          APSTOR (NTA$B, AT$EB, ATQ$S, ATTEXTL, ATTEXT);  # REPLY ONLY #
          GOTO ATEND; 
  
  
AT30:                              # AT$AC - COMMAND CONTINUED #
          FILEBIP=TRUE;            # SET COMMAND CONTINUED FLAG # 
          FILEBNO=CM$RFT;          # SET RFT IN PROGRESS #
          GOTO ATEND;                # END OF CASE #
  
  
AT31:                              # AT$DD - DATA DECLARATION # 
          CR=ATEXTWD[0];
          IF CR EQ DD$C6           # IF DISPLAY CODE #
            OR CR EQ DD$C8
            OR CR EQ DD$US         # OR BINARY #
            OR CR EQ DD$UU
          THEN
            BEGIN 
            FILEDDC = CR;          # SAVE DD #
            END 
  
          ELSE
            BEGIN 
            FILECER=TRUE;          # SET ERROR FLAG # 
            END 
  
          GOTO ATEND;                # END OF CASE #
  
  
AT32:                              # AT$SR - SYSTEM ROUTING TEXT #
          IF ATTEXTL GT 0          # IF NOT EMPTY TEXT STRING # 
          THEN
            BEGIN 
            TXTPUT(I,LOC(ATEXTWD[0]),ATTEXTL);
            FILESRT = I;
            END 
  
          GOTO ATEND;              # END OF CASE #
  
  
AT33:                              # AT$RU - IMPLICIT ROUTING TEXT #
          IF ATTEXTL GT 0          # IF NOT EMPTY TEXT STRING # 
          THEN
            BEGIN 
            TXTPUT(I,LOC(ATEXTWD[0]),ATTEXTL);
            FILEIRT = I;
            END 
  
          GOTO ATEND;              # END OF CASE #
  
  
ATEND:                             # END OF CASE #
          IF FILECER               # IF ERROR # 
            AND BAT LT 0
            AND AT NE AT$PI 
          THEN
            BEGIN 
            BAT = AT;              # SAVE ATTR NUMBER # 
            BQL = QUAL;            # SAVE QUALIFIER # 
            BTXWD[0] = ATEXTWD[0];  # SAVE TEXT # 
            BTL = ATTEXTL;         # SAVE LENGTH #
            IF BTL GT 10
            THEN
              BEGIN 
              BTL = 10;            # 10 CHAR MAX #
              END 
  
            END 
  
          END 
  
        END  # END OF ATTRIBUTE PROCESSING #
  
      IF NOT FILEBIP               # IF COMMAND NOT CONTINUED # 
      THEN
        BEGIN 
        FILER0=TRUE;               # FLAG RFT RECEIVED #
        ERTERR = FALSE; 
        IRTERR = FALSE; 
        SRTERR = FALSE; 
        FILECWD = FILECWD LAN REQATTR;  # SAVE REQ ATTR FLAGS # 
        IF FILECWD NE 0            # IF REQUIRED ATTR MISSING # 
        THEN
          BEGIN 
          FILECER = TRUE; 
          FILESTX = STO$UNSPEC; 
          END 
  
        IF NOT FILECER             # IF NO ERROR #
        THEN
          BEGIN 
          IF (FILESLD EQ 0)        # IF NO SOURCE LID # 
          THEN
            BEGIN 
            GLA$RETURN = GETLIDA(FILECPDC);  # GET PID LID ATTR # 
            IF GLA$ATTRIB NE 0
            THEN
              BEGIN 
              FILESLDC = FILECPDC; # USE REMOTE PID AS SLID # 
              END 
  
            END 
  
          PCM00(ERTERR,IRTERR,SRTERR);  # PROCESS ROUTING TEXTS # 
          FILECER = FILECER 
                         OR ERTERR OR IRTERR OR SRTERR; 
          IF NOT FILECER
          THEN
            BEGIN 
  
      CONTROL IFEQ OS$NOS;
            IF NAM                   # IF NAM # 
              AND FILEFCI EQ 0       # AND FACILITIES NOT RECEIVED #
            THEN
              BEGIN 
              FACTXTL = 1;           # SELECT *S* # 
              FILEFCIC1 = "S";       # SET DEFAULT FACILITIES # 
              APSTOR(NTA$B,AT$FC,ATQ$S,FACTXTL,FILEFCIC); 
              END 
  
      CONTROL ENDIF;
            IF FILEMBZ NE 0        # IF ATTR 12 RECEIVED #
            THEN
              BEGIN 
              J = FILEMBZ;
              IF FILEDBZ LT J 
              THEN
                BEGIN 
                J = FILEDBZ;
                END 
  
              J = MBZ(FILEXDD, J, NAM); 
              IF J LT FILEMBZ 
              THEN
                BEGIN 
                FILEMBZ = J;
                APSTOR(NTA$B,AT$BZ,ATQ$M,AT$BZL,YCDZ(J,AT$BZL));
                END 
  
              ELSE
                BEGIN 
                IF J GT FILEMBZ 
                THEN
                  BEGIN 
                  FILECER = TRUE; 
                  BAT = AT$BZ;
                  BQL = ATQ$S;
                  BTL = AT$BZL; 
                  BTXWD[0] = YCDZ(FILEMBZ,AT$BZL);
                  END 
  
                END 
  
              END 
  
            ELSE                   # ATTR 12 NOT RECEIVED # 
              BEGIN 
              IF NAM
              THEN
                BEGIN 
                FILEMBZ = MBZ(FILEXDD, FILEDBZ, NAM); 
                APSTOR(NTA$B,AT$BZ,ATQ$S,AT$BZL,
                       YCDZ(FILEDBZ,AT$BZL) );
                END 
  
              END 
  
            END 
  
          END 
  
        IF FILESIZ GT 0 
        THEN
          BEGIN 
          J = FSFMAXDD; 
          FSF$DD[0] = FILEDDC;
          ASLONGAS FILEDDC NE FSF$DD[J] 
          DO
            BEGIN 
            J = J - 1;
            END 
  
          FILESIZ = ( (FILESIZ - 1) * 1024) / FSF$CF[J];
          END 
  
      CONTROL IFEQ OS$NOS;
        IF (NOT FILECER)           # IF WAIT-QUEUE FILE # 
          AND (   (FILEDCC EQ "TT") 
               OR (FILEDCC EQ "WT") ) 
          AND (FILEOUN EQ 0)       #   AND NO OWNER USER #
          AND (FILEDUN EQ 0)       #   AND NO TERMINAL ID # 
        THEN
          BEGIN 
          RMTLOG(LOC(EMSGWTS), LEMSGWTS); 
          FILECER = TRUE; 
          END 
  
      CONTROL ENDIF;
  
        IF NOT PIDERR 
        THEN
          BEGIN 
          EMSGRCDC = FILEDCC; 
          EMSGRCST = FILELIDC;
          EMSGRCDO = FILESLDC;
          CONLOG(LOC(EMSGRCV),LEMSGRCV);
          END 
  
        IF FILECER                 # IF ERROR # 
        THEN
          BEGIN 
          FREENTA;                   # FREE BLOCK MEMORY #
          ACSTORE (NTA$B, CM$RNEG, NTLMAX);  # STORE RNEG COMMAND # 
          IF PIDERR                # IF PROTOCOL IDENT MISMATCH # 
          THEN
            BEGIN 
            APSTOR(NTA$B,AT$PI,ATQ$S,AT$PIL,PROTOCL);  # PROTOCOL ID #
            END 
  
          IF NOT(ERTERR OR IRTERR OR SRTERR) AND BAT GE 0 
          THEN
            BEGIN 
            APSTOR (NTA$B,BAT,BQL,BTL,BTX);  # RETURN BAD ATTR #
            END 
  
          I = 0;
          IF ERTERR 
          THEN
            BEGIN 
            I = FILEERT;
            BAT = AT$UT;
            END 
  
          IF IRTERR 
          THEN
            BEGIN 
            I = FILEIRT;
            BAT = AT$RU;
            END 
  
          IF SRTERR 
          THEN
            BEGIN 
            I = FILESRT;
            BAT = AT$SR;
            END 
  
          IF I NE 0 
          THEN
            BEGIN 
            TXTGET(I,P<FET>,BTL); 
            APSTOR(NTA$B,BAT,ATQ$S,BTL,FET);
            END 
  
          RMTSMB;                  # SEND MESSAGES TO REMOTE HOST # 
          IF FILESTX EQ STO$NORMAL
          THEN
            BEGIN 
            FILESTX = STO$REJECT; 
            END 
  
          APSTOR(NTA$B,AT$ST,ATQ$S,AT$STL,STO$STX[FILESTX]);
          FILESTX = STO$ABORT;
          FILES2=TRUE;             # RNEG SENT #
          FILEBNO=CM$RNEG;         # RNEG IN PROG # 
          END 
  
        ELSE                       # IF NO ERROR #
          BEGIN 
          RMTSMB;                  # SEND MESSAGES TO REMOTE HOST # 
          FILES1=TRUE;             # RPOS SENT #
          FILESTX = STO$NORMAL; 
          END;
  
        FILER0=TRUE;               # RFT RECEIVED # 
        CMDPUT;                    # SEND RPOS/RNEG # 
  
        END  # END OF COMAND NOT CONTINUED #
  
      END      # RCM00 #
    TERM
