*DECK FINDACN 
USETEXT COMCBEG 
USETEXT COMRAPL 
USETEXT COMRLRA 
USETEXT COMRQUE 
PROC FINDACN(RETURNCODE); 
# TITLE FINDACN - FIND APPLICATION THAT WILL TAKE NEW ACN # 
  
      BEGIN  # FINDACN #
  
# 
**    FINDACN - FIND APPLICATION THAT WILL TAKE NEW ACN.
* 
*     THIS PROCEDURE SEARCHES THE APPLICATION TABLE FOR AN ACTIVE 
*     APPLICATION THAT CAN ACCEPT A NEW ACN. IF NONE IS FOUND, THE
*     APPLICATION TABLE IS SEARCHED AGAIN FOR A SERVER THAT COULD 
*     BE STARTED TO SATISFY THE REQUEST.
* 
*     PROC FINDACN(RETURNCODE). 
* 
*     ENTRY   -  QU$ADDRESS IS BASED ARRAY CONTAINING THE REMOTE
*                  CONNECTION REQUEST.
* 
*     EXIT    -  RETURNCODE = 0 - NO APPLICATION FOUND. 
*                RETURNCODE = 1 - ACTIVE APPLICATION FOUND: 
*                  APL$HEADER IS BASED ARRAY FOR THIS APPL HEADER.
*                  CONNECTION IS BASED ARRAY FOR AVAILABLE ACN
*                RETURNCODE = 2 - DORMANT SERVER FOUND: 
*                  APL$HEADER IS BASED ARRAY FOR THIS APPL HEADER.
*                  CONNECTION IS BASED ARRAY FOR FIRST ACN. 
* 
* 
*     PROCESS -  FOR EACH APPLICATION TABLE HEADER: 
*                  IF ANAME MATCHES AND APPLICATION ACTIVE AND ENABLED
*                      AND NO NETOFF IN PROCESS AND ACN IS AVAILABLE
*                  THEN:  
*                    SET RETURNCODE = 1.
*                IF NO ACTIVE APPLICATION FOUND 
*                THEN:  
*                  FOR EACH APPLICATION TABLE HEADER: 
*                    IF ANAME MATCHES AND APPLICATION IS ENABLED BUT
*                      NOT ACTIVE AND IS A SERVER 
*                    THEN:  
*                      SET RETURNCODE = 2.
*                RETURN.
* 
* 
# 
  
      ITEM RETURNCODE I;             # FINDACN RETURN CODE #
  
# 
*     PROC FINDACN - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        FUNC ACNFND B;               # CK IF ACN AVAIL FOR THIS APPL #
        ITEM FAPLADR  I;             # FIRST APPLICATION TABLE ADDRESS #
        ITEM LAPLADR  I;             # LAST APPLICATION TABLE ADDRESS # 
        END 
  
# 
*     PROC FINDACN - XREF LIST END. 
# 
  
  
CONTROL EJECT;
  
      P<APL$HEADER> = FAPLADR;
      RETURNCODE = 0;                # NO APPL FOUND #
  
      ASLONGAS P<APL$HEADER> LE LAPLADR 
      DO
        BEGIN  # SEARCH FOR ACTIVE APPL # 
  
        IF QU$ANAME1 EQ APL$NAME
          AND APL$ENABLE
          AND APL$JOBORD NE 0 
          AND NOT APL$NETOFF
          AND ACNFND
        THEN
          BEGIN  # VALID APPL FOUND # 
          RETURNCODE = 1;            # ACTIVE APL FOUND TO TAKE NEW ACN#
          EXIT ACTIVSRCH; 
          END 
  
        P<APL$HEADER> = P<APL$HEADER> + APL$LENGTH
          + APL$NUMCON * CON$LENGTH;
        END ACTIVSRCH:  
  
      IF RETURNCODE EQ 0
      THEN
        BEGIN  # CHECK FOR SERVER THAT CAN BE STARED #
        P<APL$HEADER> = FAPLADR;
  
        ASLONGAS P<APL$HEADER> LE LAPLADR 
        DO
        BEGIN  # SEARCH FOR INACTIVE SERVER # 
  
          IF QU$ANAME1 EQ APL$NAME
            AND APL$ENABLE
            AND APL$JOBORD EQ 0 
            AND APL$SVR 
            AND APL$NUMCON GE 1 
          THEN
            BEGIN  # AVAILABLE SERVER FOUND # 
            RETURNCODE = 2; 
            P<CONNECTION> = P<APL$HEADER> + APL$LENGTH; 
            EXIT SVRSEARCH; 
            END 
  
          P<APL$HEADER> = P<APL$HEADER> + APL$LENGTH
            + APL$NUMCON * CON$LENGTH;
          END SVRSEARCH:  
  
        END 
  
      RETURN; 
      END  # FINDACN #
  
      TERM
  
