*DECK RCM01                        01SEP81
USETEXT COMCBEG 
USETEXT COMCAPR 
USETEXT COMCCAE 
USETEXT COMQDEF 
USETEXT COMQFIL 
USETEXT COMQNET 
    PROC RCM01; 
      BEGIN    # RCM01 #
# 
**    RCM01      PROCESS COMMAND 1 (REPLY POSITIVE).
* 
*     RCM01 EXTRACTS AND VALIDATES THE ATTRIBUTES RECEIVED WITH THE 
*     COMMAND, UPDATES THE AFT ENTRY ACCORDINGLY, AND SENDS A "GO" OR 
*     "STOP" COMMAND TO THE REMOTE QTF. 
* 
*     PROC RCM01
* 
*     ENTRY      ACN = AFT ENTRY INDEX (CONNECTION NUMBER). 
*                FILESO = TRUE (RFT SENT).
*                NHA/NTA = CURRENT MESSAGE HEADER/TEXT AREA.
* 
*     EXIT       AFT ENTRY STATUS UPDATED.
*                REPLY SENT (GO/STOP).
* 
*     PROCESS    IF COMMAND NOT CONTINUED:  
*                  INITIALIZE ERROR FLAG
*                  IF COMMAND NOT IN SEQUENCE,
*                      CALL ILLSEQ
*                      EXIT.
*                ELSE (COMMAND CONTINUED),
*                  IF PREVIOUS COMMAND NOT RPOS,
*                    CALL ILLSEQ
*                    EXIT.
*                PROCESS ATTRIBUTES RETURNED, 
*                  IF QUALIFIER = "IGNORE", 
*                    IGNORE THIS ATTRIBUTE. 
*                  ELSE 
*                    IF ATTRIBUTE AND QUALIFIER VALID,
*                      UPDATE AFT ENTRY.
*                      IF NEW PID NE OLD PID, 
*                        SEND MESSAGE 19. 
*                    ELSE 
*                      FILECER = TRUE (ERROR).
*                IF COMMAND CONTINUED (ATTRIBUTE 30), 
*                  EXIT.
*                ELSE 
*                  CALL FREENTA 
*                  IF REQUIRED ATTRIBUTE MISSING, 
*                    FILECER = TRUE (ERROR).
*                  SET DEFAULTS FOR OPTIONAL ATTRIBUTES 
*                  IF FILECER = FALSE (NO ERROR), 
*                    BUILD GO COMMAND 
*                    CALL CMDPUT. 
*                  ELSE 
*                    SET STATE TO STOP REQUIRED.
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC ACSTORE; 
        PROC APFTCH;               # GET ATTRIBUTE #
        PROC CMDPUT;
        PROC CONERR;               # CONNECTION ERROR # 
        PROC CONLOG;
        FUNC DDC        I;
        PROC FACCHK;               # CHECK FACILITIES # 
        PROC FREENTA; 
        PROC ILLSEQ;
        FUNC MBZ        I;         # MAXIMUM BLOCK SIZE # 
        PROC NAME;               # DEBUG CODE # 
        PROC RCMERR;
        FUNC XDXB       B;         # CONVERT CHARACTER TO INTEGER # 
        END 
# 
****  XREF END
# 
  
      ARRAY EBBATX [0:100] S(1);  # ECHO-BACK TEXT ARRAY #
        BEGIN 
        ITEM EBBATXW    C(00,00,10);
        END 
  
      ITEM AT         I;
      ITEM EBBAT      I;
      ITEM EBBATL     I;
      ITEM EBBQAL     I;
      ITEM ERR        B;
      ITEM FACNXFR    U;
      ITEM FACQUAL    C(1); 
      ITEM FACTEXT    C(10);
      ITEM FACTXTL    I;
      ITEM I          I;
      ITEM J          I;
      ITEM CR         C(AT$DDL);
      ITEM PREVAT     I;
  
      DEF LEMSGDM    #26#;
      ITEM EMSGDM     C(LEMSGDM) = "MESSAGE FROM REMOTE HOST -";
  
      DEF LEMSGIP    #31#;
      ITEM EMSGIP     C(LEMSGIP) = "WRONG REMOTE APPLICATION LEVEL."; 
  
      DEF LEMSGIQ    #31#;
      ITEM EMSGIQ     C(LEMSGIQ) = "INVALID QUALIFIER OR PARAMETER."; 
  
      DEF LEMSGMP    #27#;
      ITEM EMSGMP     C(LEMSGMP) = "REQUIRED PARAMETER MISSING."; 
  
      DEF LEMSG19    #36#;
      ARRAY EMSG19      S(4); 
        BEGIN 
        ITEM $D19       C(00,00,36) = 
                 ["SENT TO PID XXX, PID YYY RESPONDING."];
        ITEM EMSG19O    C(01,12,03);
        ITEM EMSG19N    C(02,06,03);
        END 
  
  
        $BEGIN
        NAME("RCM01");             # DEBUG CODE # 
        $END
  
      IF NOT FILEBIP               # IF COMMAND NOT CONTINUED # 
      THEN
        BEGIN 
        FILECWD = 3;               # SET COMMAND/ATTRIBUTE FLAGS #
        IF NOT FILES0              # IF RFT NOT SENT #
          OR FILE1 NE 0            # OR RPOS RECEIVED OR SENT # 
        THEN
          BEGIN 
          ILLSEQ;                  # INVALID COMMAND SEQUENCE # 
          RETURN; 
          END 
        END 
  
      ELSE                         # COMMAND CONTINUED #
        BEGIN 
        IF FILEBNO NE CM$RPOS      # IF NOT RPOS IN PROGRESS #
        THEN
          BEGIN 
          ILLSEQ;                  # INVALID COMMAND SEQUENCE # 
          RETURN; 
          END 
        ELSE
          BEGIN 
          FILEBIP = FALSE;         # CLEAR COMMAND-CONTINUED FLAG # 
          END 
        END 
  
      SLOWFOR AT=0 WHILE AT GQ 0   # CHECK ATTRIBUTES # 
      DO
        BEGIN 
        PREVAT = AT;               # SAVE PREVIOUS ATTRIBUTE #
        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;                # CONTINUE LOOP (END) #
          END 
  
        IF QUAL EQ ATQ$I           # IF ATTRIBUTE IGNORED # 
        THEN
          BEGIN 
          CYCLE AT;                # CONTINUE LOOP #
          END 
  
        IF AT EQ AT$AC             # IF COMMAND CONTINUED # 
        THEN
          BEGIN 
          FILEBIP=TRUE;            # SET FLAG # 
          FILEBNO=CM$RPOS;         # SET COMMAND IN PROGRESS #
          CYCLE AT;                # CONTINUE LOOP #
          END 
  
        IF ((AT EQ AT$DM)          # IF ATTRIBUTE = DAYFILE MESSAGE # 
          OR (AT EQ AT$OM))        # OR OPERATOR MESSAGE #
          AND (QUAL EQ ATQ$S)      # AND QUALIFIER = "SELECT" # 
        THEN
          BEGIN 
          IF PREVAT NE AT$DM       # IF LAST PARAMETER 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$HT             # IF ATTRIBUTE = HOST TYPE # 
          OR AT EQ AT$PD           # OR REMOTE HOST PID # 
        THEN
          BEGIN 
          IF QUAL NQ ATQ$S         # IF QUALIFIER NOT "SELECT" #
          THEN
            BEGIN 
            RCMERR(LOC(EMSGIQ),LEMSGIQ);
            CYCLE AT;              # CONTINUE LOOP #
            END 
  
          IF AT EQ AT$HT           # IF ATTRIBUTE = HOST TYPE # 
          THEN
            BEGIN 
            B<59,1>FILECWD=0;      # CLEAR FLAG # 
            FILERMH=ATEXTWD[0];    # SAVE REMOTE HOST TYPE #
            END 
  
          ELSE
            BEGIN 
            IF AT EQ AT$PD         # IF ATTRIBUTE = PID # 
            THEN
              BEGIN 
              B<58,1>FILECWD=0;    # CLEAR FLAG # 
              IF FILECPDC NE C<0,3>ATEXTWD[0]  # IF PID DIFFERS # 
              THEN
                BEGIN 
                EMSG19O=FILECPDC; 
                EMSG19N=ATEXTWD[0]; 
                CONLOG(LOC(EMSG19),LEMSG19);
                END 
              END 
            END 
  
          CYCLE AT; 
          END  # HOST TYPE / PID / MODE OF ACCESS # 
  
        IF AT EQ AT$FC             # IF FACILITY #
        THEN
          BEGIN 
          FACCHK (ATEXTWD[0],ATTEXTL,NAM,0, 
                  FACTEXT,FACTXTL,FACQUAL,FACNXFR,I); 
          FILEFCI = FACNXFR;       # SET NETXFR FACILITIES #
          IF I NE 0 
          THEN
            BEGIN 
            RCMERR (LOC(EMSGIQ),LEMSGIQ); 
            END 
  
          CYCLE AT; 
          END 
  
        IF AT EQ AT$BZ             # IF MAXIMUM BLOCK SIZE #
        THEN
          BEGIN 
          IF XDXB(ATEXTWD[0], 1, I) 
          THEN
            BEGIN 
            RCMERR(LOC(EMSGIQ),LEMSGIQ);
            CYCLE AT; 
            END 
  
          FILEMBZ = MBZ(FILEXDD,FILEDBZ,NAM); 
          IF FILEMBZ GE I          # IF NEGOTIATE DOWN #
          THEN
            BEGIN 
            FILEMBZ = I;
            END 
  
          ELSE
            BEGIN 
            RCMERR(LOC(EMSGIQ),LEMSGIQ);
            END 
  
          CYCLE AT; 
          END 
  
        IF AT EQ AT$AW             # IF ACKNOWEDGEMENT WINDOW # 
        THEN
          BEGIN 
          ERR = XDXB(ATEXTWD[0], 1, I); 
          IF I GT MAXACKW          # IF EXCEED MAXIMUM VALUE #
             OR (I LT 1)           # OR LESS THAN 1 # 
             OR (ERR)              # OR CONVERSION ERROR #
          THEN
            BEGIN 
            RCMERR(LOC(EMSGIQ),LEMSGIQ);
            END 
  
          ELSE
            BEGIN 
            FILEACKW = I; 
            END 
  
          CYCLE AT; 
          END 
  
  
        IF AT EQ AT$DD             # IF DATA DECLARATION #
        THEN
          BEGIN 
          CR = ATEXTWD[0];
          IF (CR EQ DD$C6          # IF VALID DD #
            OR CR EQ DD$C8
            OR CR EQ DD$US
            OR CR EQ DD$UU
            OR CR EQ DD$UH) 
            AND ( (QUAL EQ ATQ$M)  # AND MODIFY OR SELECT IF NONE SENT #
              OR ( (QUAL EQ ATQ$S) AND (FILEDDC EQ "  ") ) )
          THEN
            BEGIN 
            FILEDDC = CR; 
            FILEXDD = DDC(CR);
            END 
  
          ELSE
            BEGIN 
            RCMERR(LOC(EMSGIQ),LEMSGIQ);
            END 
  
          CYCLE AT; 
          END  # DATA DECLARATION # 
  
        ELSE
          BEGIN 
          IF AT EQ AT$TO           # IF ATTRIBUTE = TIME OUT #
            OR AT EQ AT$PI         # OR PROTOCOL IDENT #
          THEN
            BEGIN 
            IF AT EQ AT$TO         # IF ATTRIBUTE = TIME OUT #
            THEN
              BEGIN 
              IF NOT XDXB(ATEXTWD[0], 1, I) 
              THEN
                BEGIN 
                FILETOU = I;
                END 
  
              END 
  
            ELSE                   # IF ATTRIBUTE = PROTOCOL #
              BEGIN 
              IF C<0,4>ATEXTWD[0] NE PROTOCL   # IF MIS-MATCH # 
              THEN
                BEGIN 
                FILERTY = 0;       # NO RETRY # 
# 
*             COMPARE PROTOCOL VERSION (CHAR 1-2) AND LEVEL (CHAR 3-4). 
# 
                ERR = XDXB(C<2,2>ATEXTWD[0], 1, I)
                        OR XDXB(PROTOCLLEV, 1, J);
                IF C<0,2>ATEXTWD[0] NE PROTOCLVER 
                  OR (I GT J) 
                  OR ERR
                THEN
                  BEGIN 
                  CONERR (LOC(EMSGIP),LEMSGIP);  # BREAK CONNECTION # 
                  RETURN; 
                  END 
  
                ELSE
                  BEGIN 
                  RCMERR (LOC(EMSGIP),LEMSGIP);  # STOP TRANSFER #
                  FILESTX = STO$NORTY;  # NO RETRY #
                  END 
  
                CYCLE AT; 
                END 
              END 
            END  # TIME-OUT / PROTOCOL #
  
          ELSE
            BEGIN 
            IF QUAL EQ ATQ$M       # IF QUALIFIER = "MODIFY" #
            THEN
              BEGIN 
              RCMERR(LOC(EMSGIQ),LEMSGIQ);
              END 
            END 
          END 
        END  # END OF ATTRIBUTES #
  
      IF NOT FILEBIP               # IF NOT CONTINUED COMMAND # 
      THEN
        BEGIN 
        IF FILECWD NE 0            # IF COMMAND/ATTRIBUTE FLAG SET #
        THEN
          BEGIN 
          RCMERR(LOC(EMSGMP),LEMSGMP);
          END 
  
        FILER1=TRUE;               # SET RPOS RECEIVED FLAG # 
  
        IF NOT FILECER             # IF NO ERROR #
        THEN
          BEGIN 
          FREENTA;                 # GET NET BUFFER # 
          ACSTORE (NTA$B, CM$GO, NTLMAX);  # STORE GO COMMAND # 
          FILES3=TRUE;             # "GO" SENT FLAG # 
          FILEBNO=CM$GO;           # "GO" COMMAND IN PROGRESS # 
          CMDPUT;                  # SEND GO COMMAND #
          END 
  
        ELSE                       # IF ERROR # 
          BEGIN 
          FILEFTS = FTS$STPREQ;    # STOP REQUIRED #
          END 
  
        END  # COMMAND NOT CONTINUED #
  
      END      # RCM01 #
    TERM
