*DECK RCM04                        21JUL81
USETEXT COMCBEG 
USETEXT COMCAPR 
USETEXT COMCCAE 
USETEXT COMQDEF 
USETEXT COMQFIL 
USETEXT COMQNET 
    PROC RCM04; 
      BEGIN    # RCM04 #
# 
**    RCM04      PROCESS COMMAND 4 (STOP).
* 
*     RCM04 ADDS THE TRANSFERRED FILE TO THE I/O QUEUE AND SENDS
*     THE STOP REPLY WITH STATUS (OK OR ERROR). 
* 
*     PROC RCM04
* 
*     ENTRY      ACN = AFT ENTRY INDEX (CONNECTION NUMBER). 
*                FILES1 = TRUE (RPOS SENT). 
*                NHA, NTA = NETWORK HEADER, TEXT. 
* 
*     EXIT       AFT ENTRY STATUS UPDATED.
* 
*     PROCESS    IF COMMAND NOT CONTINUED:  
*                  INITIALIZE ERROR FLAGS.
*                IF STATE = NETXFR IN PROGRESS: 
*                  CALL SFILS TO CHECK TRANSFER STATUS. 
*                  [SEE COMMENTS IN SFILS.] 
*                IF COMMAND NOT IN SEQUENCE:  
*                  CALL ILLSEQ
*                  EXIT.
*                ELSE:  
*                  PROCESS ATTRIBUTES RECEIVED. 
*                IF STATUS (AT$ST) NOT RECEIVED:  
*                  FILECER = TRUE (ERROR).
*                IF BLOCK CONTINUED:  
*                  EXIT.
*                ELSE:  
*                  IF NO ERROR: 
*                    SET STATE TO TRANSFER OK 
*                  ELSE:  
*                    SET STATE TO STOPR REQUIRED. 
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC APFTCH;               # GET ATTRIBUTE #
        FUNC CCOUNT     I;
        PROC CONLOG;
        PROC ILLSEQ;
        PROC NAME;                 # DEBUG CODE # 
        PROC PRSTXFR; 
        PROC RCMERR;
        PROC SFILS; 
        END 
# 
****  XREF END
# 
  
  
      ITEM AT         I;
      ITEM PREVAT     I;
  
      DEF LEMSGDM    #26#;
      ITEM EMSGDM     C(LEMSGDM) = "MESSAGE FROM REMOTE HOST -";
  
      DEF LEMSGAI    #26#;
      ITEM EMSGAI     C(LEMSGAI) = "INVALID ATTRIBUTE IGNORED.";
  
  
        $BEGIN
        NAME("RCM04");             # DEBUG CODE # 
        $END
  
      IF FILEFTS EQ FTS$XFRIPG
      THEN
        BEGIN 
        SFILS;                     # UPDATE AFT ENTRY STATUS #
        END 
  
      IF NOT FILEBIP               # IF COMMAND NOT CONTINUED # 
      THEN
        BEGIN 
        FILECWD=1;                 # INITIALIZE COMMAND WORD #
        IF (FILE4 NE 0)            # IF "STOP" SENT OR RECEIVED # 
          OR( (FILEFTS EQ FTS$XFRIPG)  # OR TRANSFER INCOMPLETE # 
            AND FILER3)            # AND "GO" RECEIVED #
          OR(FILER3                # OR "GO" RECEIVED # 
            AND((NOT FILES1)       # AND RPOS NOT SENT #
              AND (NOT FILES2)))   # AND RNEG NOT SENT #
        THEN
          BEGIN 
          ILLSEQ;                  # INVALID MESSAGE SEQUENCE # 
          RETURN; 
          END 
        END 
  
      ELSE                         # IF COMMAND CONTINUED # 
        BEGIN 
        IF FILEBNO NE CM$STOP      # IF WRONG COMMAND # 
        THEN
          BEGIN 
          ILLSEQ;                  # INVALID MESSAGE SEQUENCE # 
          RETURN; 
          END 
        END 
  
      FILEBIP=FALSE;               # CLEAR COMMAND CONTINUED FLAG # 
  
      SLOWFOR AT=0 WHILE AT GQ 0  # PROCESS ATTRIBUTES #
      DO
        BEGIN 
        PREVAT = AT;               # SAVE PREVIOUS ATTRIBUTE #
        APFTCH(NTAH,AT,QUAL,ATTEXTL,ATTEXT);  # GET ATTRIBUTE # 
        IF AT LS 0                 # IF END OF ATTRIBUTES # 
        THEN
          BEGIN 
          CYCLE AT;                # CONTINUE LOOP (EXIT) # 
          END 
  
        QUAL=C<0,1>QUAL;           # GET QUALIFIER #
        IF QUAL NQ ATQ$S           # IF NOT "SELECT" #
        THEN
          BEGIN 
          FILECER=TRUE;            # SET ERROR FLAG # 
          CYCLE AT;                # CONTINUE LOOP #
          END 
  
          IF AT EQ AT$AC           # IF ATTRIBUTE = CONTINUED COMMAND # 
          THEN
            BEGIN 
            FILEBIP=TRUE;          # SET COMMAND CONTINUED FLAG # 
            FILEBNO=CM$STOP;
            CYCLE AT;              # CONTINUE LOOP #
            END 
  
        IF ((AT EQ AT$DM)          # IF ATTRIBUTE = DAYFILE MESSAGE # 
          OR (AT EQ AT$OM))        # OR OPERATOR MESSAGE #
        THEN
          BEGIN 
          IF PREVAT NE AT$DM       # IF LAST ATTRIBUTE NOT MESSAGE #
            AND PREVAT NE AT$OM 
          THEN
            BEGIN 
            CONLOG(LOC(EMSGDM),LEMSGDM);  # MESSAGE FROM REMOTE - # 
            END 
  
          CONLOG(LOC(ATEXTWD[0]),ATTEXTL);
          CYCLE AT;                # CONTINUE LOOP #
          END 
  
        IF AT EQ AT$ST             # IF ATTRIBUTE = STATE OF TRANSFER # 
        THEN
          BEGIN 
          FILECWD = 0;             # FLAG ATTRIBUTE RECEIVED #
          PRSTXFR;                 # PROCESS STATE-OF-TRANSFER #
          CYCLE AT; 
          END 
  
        CONLOG(LOC(EMSGAI),LEMSGAI);  # INVALID ATTR IGNORED #
        END  # END OF ATTRIBUTES #
  
      IF NOT FILEBIP               # IF COMMAND NOT CONTINUED # 
      THEN
        BEGIN 
        FILER4=TRUE;               # "STOP" COMMAND RECEIVED #
        FILEANW=FALSE;             # NO USER ERROR #
        IF NOT FILECER
          AND (FILECWD EQ 0)       # AND REQUIRED ATTR RECEIVED # 
          AND FILER3               # AND GO RECEIVED #
        THEN
          BEGIN 
          FILEFTS = FTS$CMPOK;
          END 
  
        ELSE
          BEGIN 
          FILEFTS = FTS$STPREQ; 
          END 
  
        END  # END OF COMMAND NOT CONTINUED # 
  
      END      # RCM04 #
    TERM
