*DECK QTENDT
USETEXT AIPDEF
USETEXT QTRMBUF 
USETEXT QTRMCOM 
USETEXT QTRMNIT 
PROC QTENDT;
*IF DEF,IMS 
 #
*1DC  QTENDT
* 
*     1. PROC NAME           AUTHOR              DATE 
*        QTENDT              E. GEE              11/01/84 
* 
*     2. FUNCTIONAL DESCRIPTION.
*        TERMINATE OR LOAN A SPECIFIED CONNECTION 
* 
*     3. METHOD USED. 
*        ENTRY POINT QTENDT:  
*          SET LOAN FLAG TO FALSE.
*        ENTRY POINT QTLEND:  
*          SET LOAN FLAG TO TRUE. 
*        IF QTOPEN HAS NOT BEEN CALLED, 
*          CALL NP$ERR TO ISSUE DAYFILE MESSAGE AND ABORT APP.
*        ELSE (QTOPEN HAS BEEN CALLED), 
*          INITIALIZE RETURN CODE FIELD IN NIT TO QTRM REJECT CODE
*          IF NIT ENTRY NOT IN USE, 
*            SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CODE.
*          ELSE (NIT ENTRY IS IN USE),
*            IF CONNECTION HAS BEEN LOANED, 
*              SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CODE.
*            ELSE (CONNECTION DOES EXIST),
*              IF NEXT APPLICATION WAS SPECIFIED
*                 AND DATA IS BEING PASSED TO IT
*                 AND SIZE OF DATA IS NOT SPECIFIED,
*                SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CODE.
*              ELSE (OKAY TO END/LOAN CONNECTION),
*                IF NEXT APPLICATION WAS SPECIFIED
*                   AND DATA IS BEING PASSED TO IT
*                   AND SIZE OF DATA IS TOO LARGE,
*                  SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CODE.
*                ELSE (GOOD SIZE SPECIFIED FOR DATA TO BE PASSED),
*                  IF LOANING CONNECTION, 
*                    IF NOT DEVICE CONNECTION,
*                      SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CODE.
*                    ELSE (DEVICE CONNECTION),
*                      IF LOANED CONNECTION,
*                        SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CODE.
*                      ELSE (DEVICE CONNECTION),
*                        IF NEXT APPLICATION NOT SPECIFIED, 
*                          SET SEC-RETURN-CODE FIELD IN NIT TO ERROR CD.
*                        ELSE (NEXT APPLICATION WAS SPECIFIED), 
*                          IF DOWNLINE BLOCKS OUTSTANDING,
*                            SET SEC-RETURN-CODE FIELD IN NIT TO ERR CD.
*                          ELSE (OKAY TO LOAN CONNECTION),
*                            STORE NORMAL COMPLETION RETURN CODE IN NIT.
*                   ELSE (OKAY TO TERMINATE CONNECTION),
*                     STORE NORMAL COMPLETION RETURN CODE IN NIT. 
*                IF NORMAL COMPLETION RETURN CODE IN NIT, 
*                  SEND LST/OFF SM TO TURN OFF MSG TRAFFIC ON CON.
*                  SEND CON/END/R SM WITH DATA IF ANY.
* 
*     4. ENTRY CONDITIONS 
*          NIT$CON           NO OF CONNECTION TO BE TERMINATED OR LOANED
*          NIT$CTLC          NO OF WDS OF DATA TO PASS TO NEXT APP
*          NIT$NEXT$APP      NAME OF NEXT APPLICATION TO HAVE DEVICE CON
*          NIT$PARMADR       ADDR OF DATA TO PASS TO NEXT APPLICATION 
* 
*     5. NORMAL EXIT CONDITIONS.
*          NIT$STATE         WCONENDN STATE (IF TERMINATING CONNECTION) 
*          NET$STATE         LEND STATE (IF LOANING CONNECTION) 
*          NIT$RC              0
* 
*     6. ABNORMAL EXIT CONDITIONS.
*          NIT$RC            QTENDTREJ RETURN CODE (IF QTENDT CALL) 
*          NIT$RC            QTLENDREJ RETURN CODE (IF QTLEND CALL) 
*          NIT$S$RC          REASON CODE FOR REJECTION
* 
*     7. COMMON DECKS AND SYMPL TEXT USED.
*        AIPDEF    NP$CRT    QTRMBUF   QTRMCOM
*        QTRMNIT
* 
*     8. ROUTINES CALLED. 
*          NETPUT            OUTPUT BLOCK TO NETWORK
*          NETPUTF           OUTPUT FRAGMENTED BLOCK TO NETWORK 
*          NP$ERR            DAYFILE ERROR MESSAGE AND ABORT APP
* 
*     9. DAYFILE MESSAGES.
*         ***  NETWORK APPLICATION ABORTED, RC = 70.  *** 
*         ***  QTENDT: REQUEST INVALID BEFORE QTOPEN. *** 
*         ***  NETWORK APPLICATION ABORTED, RC = 76.  *** 
*         ***  QTLEND: REQUEST INVALID BEFORE QTOPEN. *** 
* 
* 
 #
*ENDIF
  
# 
      CONTROL DEFINITIONS 
# 
      CONTROL PRESET; 
      CONTROL PACK; 
      CONTROL DISJOINT; 
      CONTROL INERT;
      CONTROL FASTLOOP; 
  
*CALL NP$CRT
  
# 
      ROUTINES CALLED 
# 
    XREF
      BEGIN 
      PROC NETPUT;                      # OUTPUT BLOCK TO NETWORK      #
      PROC NETPUTF;                     # OUTPUT FRAGMENT SUP MSG      #
      PROC NP$ERR;                      # DAYFILE ERR MSG AND ABORT    #
      END 
# 
      LOCAL VARIABLES 
# 
      ITEM ACN I;                       # APPLICATION CONNECTION NUMBER#
      ITEM LOAN B;                      # LOAN CONNECTION FLAG         #
  
#**********************************************************************#
      CONTROL EJECT;
# 
      BEGIN QTENDT PROCESSING 
# 
      BEGIN 
      LOAN = FALSE;                     # NOT LOANING CONNECTION       #
      GOTO QTENDT1;                     # SKIP QTLOAN CODE             #
# 
      BEGIN QTLEND PROCESSING 
# 
      ENTRY PROC QTLEND;
      LOAN = TRUE;                      # LOANING CONNECTION           #
# 
      BEGIN QTLEND/QTENDT COMMON CODE 
# 
QTENDT1:  
      IF NOT NETON$STATUS               # CHECK IF NETON HAD COMPLETED #
      THEN
        BEGIN 
        IF LOAN 
        THEN                            # QTLEND CALL                  #
          BEGIN 
          NP$ERR("76");                 # REQUEST INVALID BEFORE QTOPEN#
          END 
        ELSE                            # QTENDT CALL                  #
          BEGIN 
          NP$ERR("70");                 # REQUEST INVALID BEFORE QTOPEN#
          END 
        END 
      P<NIT> = NIT$ADDR;
      ACN = NIT$CON[0];                 # CONNECTION TO BE TERMINATED  #
      IF LOAN 
      THEN                              # QTLEND CALL                  #
        BEGIN 
        NIT$RC[0] = S"QTLENDREJ";       # INIT RETURN CODE TO REJECT   #
        END 
      ELSE                              # QTENDT CALL                  #
        BEGIN 
        NIT$RC[0] = S"QTENDTREJ";       # INIT RETURN CODE TO REJECT   #
        END 
      IF (NIT$STATE[ACN] EQ S"NULL") OR 
         (NIT$STATE[ACN] EQ S"WCONENDN") OR 
         (ACN EQ 0) OR
         (ACN GR NIT$NO$TERMS[0]) 
      THEN                              # BAD CONNECTION NUMBER        #
        BEGIN 
        NIT$S$RC[0] = S"BADCN";         # BAD CONNECTION NUMBER        #
        END 
      ELSE                              # NIT ENTRY EXISTS             #
        BEGIN 
        IF (NIT$STATE[ACN] EQ S"LEND") OR 
           (NIT$STATE[ACN] EQ S"LENT")
        THEN                            # CONNECTION DOES NOT EXIST    #
          BEGIN 
          NIT$S$RC[0] = S"CONLOANED";   # CONNECTION IN WRONG STATE    #
          END 
        ELSE                            # CONNECTION IN RIGHT STATE    #
          BEGIN 
          IF (NIT$PARMADR[0] NQ 0) AND
             (NIT$CTLC[0] EQ 0) 
          THEN                          # NO DATA LENGTH SPECIFIED     #
            BEGIN 
            NIT$S$RC[0] = S"NOSIZE";    # BAD SIZE FOR DATA TO PASS    #
            END 
          ELSE                          # DATA LENGTH WAS SPECIFIED    #
            BEGIN 
            IF (NIT$PARMADR[0] NQ 0) AND
               (NIT$CTLC[0] GR 52)
            THEN                        # BAD DATA LENGTH SPECIFIED    #
              BEGIN 
              NIT$S$RC[0] = S"BADSIZE"; # BAD SIZE FOR DATA TO PASS    #
              END 
            ELSE                        # OKAY TO END CONNECTION       #
              BEGIN 
              IF LOAN 
              THEN                      # LOANING CONNECTION           #
                BEGIN 
                IF (NIT$DEVTYP[ACN] EQ DT$INTA) OR
                   (NIT$DEVTYP[ACN] EQ DT$INTE) 
                THEN                    # APP-TO-APP CONNECTION        #
                  BEGIN 
                  NIT$S$RC[0] = S"NOTDEVC";  # NOT DEVICE CONNECTION   #
                  END 
                ELSE                    # DEVICE CONNECTION            #
                  BEGIN 
                  IF NIT$LOAN[ACN] NQ 0 
                  THEN                  # THIS IS ALREADY A LOANED CON #
                    BEGIN 
                    NIT$S$RC[0] = S"LOANCON";  # CANNOT LOAN LOANED CON#
                    END 
                  ELSE                  # NOT LOANED CONNECTION        #
                    BEGIN 
                    IF NIT$NEXT$APP[0] EQ 0 
                    THEN                # NEXT APPLICATION NOT SPEC    #
                      BEGIN 
                      NIT$S$RC[0] = S"NONEXTAP";  # CAN-T LOAN IF NO AP#
                      END 
                    ELSE                # NEXT APPLICATION SPECIFIED   #
                      BEGIN 
                      IF NIT$ABL[ACN] NQ NIT$C$ABL[ACN] 
                      THEN              # DOWNLINE BLOCKS OUTSTANDING  #
                        BEGIN 
                        NIT$S$RC[0] = S"DBLKSO";  # DWNLNE BLKS NOT ACK#
                        END 
                      ELSE              # OKAY TO LOAN CONNECTION      #
                        BEGIN 
                        NIT$RC[0] = S"OK"; # INIT RETURN CODE TO SUCCES#
                        NIT$STATE[ACN] = S"LEND";  # CHANGE STATE      #
                        END 
                      END 
                    END 
                  END 
                END 
              ELSE                        # TERMINATING CONNECTION     #
                BEGIN 
                NIT$RC[0] = S"OK";        # INIT RETURN CODE TO SUCCESS#
                NIT$STATE[ACN] = S"WCONENDN"; # WAIT FOR CON/END/N STAT#
                END 
              END 
            IF NIT$RC[0] EQ S"OK" 
            THEN                        # OKAY TO END/LOAN CONNECTION  #
              BEGIN 
# 
              SEND LST/OFF SUPERVISORY MESSAGE FOR CONNECTION 
# 
              ABHWORD[0] = 0; 
              ABHABT[0] = APPCMD;       # ABH FOR LST/OFF ON ACN       #
              ABHACT[0] = ACLST;        # ACT IS C60TRANS              #
              ABHTLC[0] = LLST;         # TLC IS 1                     #
              SPMSG0[0] = 0;
              PFCSFC[0] = LSTOFF;       # LST/OFF SUPERVISORY MESSAGE  #
              LSTACN[0] = ACN;
              NETPUT(HEADER, SUP$MES);  # SEND LST/OFF TO NAM          #
# 
              SEND CON/END SUPERVISORY MESSAGE
# 
              ABHWORD[0] = 0; 
              ABHABT[0] = APPCMD;       # ABH FOR CON/END              #
              ABHACT[0] = ACCON;        # ACT IS C60TRANS              #
              FRAGSZ0[0] = LCONEN;      # LENGTH OF SM WITHOUT DATA    #
              FRAGAD0[0] = LOC(SUP$MES); # ADDR OF 1ST FRAGMENT BUFFER #
              SPMSG0[0] = 0;
              SPMSG1[0] = 0;
              PFCSFC[0] = CONEND;       # CON/END SUPERVISORY MESSAGE  #
              CONACN[0] = ACN;
              CONANM[0] = NIT$NEXT$APP[0];# SET NEXT APPLICATION FIELD #
              CONLOAN[0] = LOAN;        # SET LOAN FLAG IN SUP MSG     #
              IF ( (NIT$NEXT$APP[0] NQ 0) AND 
                   (NIT$PARMADR[0]  NQ 0) ) OR
                 ( (NIT$PARMADR[0]  NQ 0) AND 
                   (NIT$LOAN[ACN]   NQ 0) ) 
              THEN                        # SIZE OF DATA TO PASS IS OK #
                BEGIN 
                FRAGSZ0[1] = NIT$CTLC[0]; # LENGTH OF DATA IN 2ND FRAG #
                FRAGAD0[1] = NIT$PARMADR[0];  # ADR OF 2ND FRAG BUFFER #
                ABHTLC[0] = LCONEN + NIT$CTLC[0]; # SIZE OF CON/END SM #
                NOFRAG = 2;               # NUMBER OF FRAGMENT BUFFERS #
                END 
              ELSE
                BEGIN 
                ABHTLC[0] = LCONEN;       # LENGTH OF SM WITHOUT DATA  #
                NOFRAG = 1;               # NUMBER OF FRAGMENT BUFFERS #
                END 
              NETPUTF(HEADER,NOFRAG,FRAG);  # SEND CON/END TO NAM      #
  
              END 
            END 
          END 
        END 
  
      RETURN; 
      END 
TERM
