*DECK SSIACTF 
USETEXT TEXTATS 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
      PROC SSIACTF; 
*CALL COPYRITE
# TITLE SSIACTF - AUTOMATED CARTRIDGE TAPE FACILITY MAIN ROUTINE.      #
  
      BEGIN                            # SSIACTF                       #
# 
****  SSIACTF - AUTOMATED CARTRIDGE TAPE FACILITY.
* 
*     THIS PROCEDURE IS CALLED BY THE COMPASS ROUTINE ACTF.  IT 
*     INITIALIZES AND EXECUTES THE MAIN LOOP OF THE AUTOMATED 
*     CARTRIDGE TAPE STORAGE SERVER INTERFACE FACILITY (ATF). 
* 
*     *ATF* ACTS AS THE NOS SERVER/CLIENT TASK TO THE STORAGE 
*     TECHNOLOGY CORPORATION CLIENT AND SERVER TASKS RUNNING ON 
*     A (SUN) WORKSTATION AND CONTROLLING THE OPERATIONS OF THE 
*     STORAGE TECHNOLOGY 4400 CARTRIDGE LIBRARY DEVICE.  ATF ALSO 
*     ACTS AS A PORTMAPPER, ISSUING CLIENT REQUESTS AS NEEDED BY
*     THE APPLICATION, AND RESPONDING TO ANY SERVER REQUESTS RECEIVED.
* 
*     COMMUNICATION BETWEEN ATF AND THE WORKSTATION IS VIA RPC CALLS
*     OVER A UDP TRANSPORT.  ALL RPC AND PORTMAPPER ROUTINES ARE A
*     INTEGRAL PART OF THIS APPLICATION AND WERE NOT INTENDED ON
*     FUNCTIONING INDEPENDENTLY OF THIS APPLICATION.
* 
*     PROC SSIACTF
* 
*     CONTROL CARD
* 
*     ACTF(NIN=AAA,MC=BBB,SS=CCC,UN=DDD)
* 
*        AAA - NAM INVOCATION NUMBER
*        BBB - MESSAGE COUNT, USED TO RELEASE THE DEBUG LOG FILE. 
*              WHEN BBB MESSAGES HAVE BEEN LOGGED THEY ARE RELEASED 
*              TO THE LOG FILE. 
*        CCC - SERVER STATION NAME IN THE TCPHOST FILE FOR THE (SUN)
*              WORKSTATION.  CAN BE UP TO 30 CHARACTERS, HOWEVER
*              IT IS RESTRICTED TO 7 CHARACTERS AT THIS TIME DUE TO 
*              A LIMITATION WITH NAMI.
*        DDD - USERNAME OF THE TCPHOST FILE.
* 
* 
*     METHOD   INITIALIZE SOCKET AND HANDLE REFERENCES, RPC ERROR 
*              CODE ARRAY, AND SUBSYSTEM COMMUNICATION AREAS.  SETUP
*              THE REPRIEVE PROCESSING BLOCK AND VERIFY THAT THE
*              APPLICATION HAS BEEN PROPERLY INITIATED AS A SUBSYSTEM.
*              THE INTER-CONTROL POINT AREA IS INTIALIZED TO INDICATE 
*              THE SUBSYSTEM CAN RECIEVE *SIC* REQUESTS, AND AN 
*              ADDRESS AND BLOCK LENGTH IS CONTAINED IN THE AREA. 
* 
*              THE CONTROL CARD ARGUEMENTS ARE THEN PROCESSED,
*              VERIFIED, AND SAVED IN A GLOBAL AREA FOR FUTURE
*              REFERENCE.  THE SERVER NAME, SPECIFIED BY THE *SS* 
*              PARAMETER IS SEARCHED FOR IN THE TCPHOST FILE.  IF 
*              NOT FOUND, THE APPLICATION TERMINATES.  IF FOUND 
*              THE IP ADDRESS IS SAVED FOR LATER REFERENCE.  THE
*              CONNECTION BETWEEN THE APPLICATION IS THEN ESTABLISHED 
*              AND FOUR SOCKETS (NAM CONNECTIONS) ARE OPENED.  THE
*              *ATF* SERVER AND CLIENT HAVE SEPARATE SOCKETS AS 
*              WELL AS THE PORTMAPPER SERVER AND CLIENT.  THE RPC 
*              HANDLES ARE OPENED FOR BOTH PORTMAPPER SOCKETS 
*              AND ONE IS INITIATED FOR THE *ATF* SERVER CONNECTION.
*              A NEW RPC HANDLE IS OPENED FOR EACH *ATF* CLIENT REQUEST 
*              ISSUED.
* 
*              ONCE ALL SOCKETS AND HANDLES HAVE BEEN SUCCESSFULLY
*              OPENED A SERVER QUERY REQUEST IS SENT TO THE WORKSTATION.
*              THE ROUTINE WILL CONTINUE TO ISSUE THE EQUEST UNTIL
*              A REPLY IS RECIEVED FROM THE WORKSTATION INDICATING
*              THE LIBRARY SERVER IS IN A *RUN* STATE.
* 
*              AT THIS POINT ALL INTIALIZATION IS COMPLETE AND THE
*              APPLICATION IS READY TO RECEIVE WORK FROM THE MAGNET 
*              SUBSYSTEM.  THE MAIN LOOP CONSISTS OF CHECKING IF A
*              REQUEST FOR THE APPLICATION IS OUTSTANDING, STATUSING
*              THE TWO SERVER PORTS FOR DATA RECEIVED, AND SENDING
*              ANY REPLIES BACK TO THE NOS MAGNET SUBSYSTEM.  IF
*              A REQUEST IS OUTSTANDING, THE CLIENT HANDLE IS OPENED, 
*              THE SERVER SYSTEM PORT IS REQUESTED VIA A PORTMAPPER 
*              REQUEST AND THE REQUEST IS THEN ISSUED TO THE SERVER.
*              A RPC REPLY IS RECEIVED BY THE CLIENT AND THE CONNECTION 
*              IS THEN CLOSED.  IF THE RPC REPLY IS NOT RECEIVED, THE 
*              APPLICATION WILL ATTEMPT TO ISSUE IT THREE TIMES BEFORE
*              GIVING UP AND RETURNING AN ERROR.
* 
*              THE SERVER SYSTEM SENDS AN ACKNOWLEDGEMENT TO THE *ATF*
*              SERVER AFTER CRACKING AND VALIDATING THE REQUEST.  A 
*              FINAL REPLY IS SENT AFTER THE REQUEST HAS BEEN COMPLETED 
*              OF IF THE REQUEST WAS NOT A VALID REQUEST.  THE FINAL
*              RESPONSE STATUS INDICATES THE SUCCESS OR FAILURE OF
*              THE REQUEST. 
* 
*              THE FINAL RESPONSE IS SAVED IN A CIRCULAR BUFFER AND 
*              RETURNED TO THE MAGNET SUBSYSTEM VIA *SIC* INTER-
*              CONTROL POINT COMMUNICATIONS.
* 
*              ANY ERRORS ENCOUNTERED ARE HANDLED BY ROUTINE *SSIAEPR*. 
*              THIS ERROR ROUTINE WILL ISSUE THE ACTION REQUIRED AS 
*              WELL AS LOGGING AN APPROPRIATE MESSAGE TO THE DAYFILE. 
* 
*              THE MAIN LOOP OF THE APPLICATION IS BROKEN ONE OF TWO
*              WAYS AT THIS POINT.  EITHER BY A NAM SHUTDOWN REQUEST
*              OR BY AN ERROR DETECTED BY *SSIAEPR*.  THE CODE
*              FOLLOWING THE MAIN LOOP IS NEVER ACTUALLY EXECUTED.
* 
*              THE VARIABLE *DFLAG* IS DEFINED IN TEXTIPL AND CAN BE
*              CHANGED BY ENTERING THE NAM *DB* AND *DE* K-DISPLAY
*              COMMANDS.
# 
  
# 
****  PROC SSIACTF - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC IPPENDN;    # END NAM CONNECTION                          #
        FUNC IPUGHBN B;  # GET HOST BY NAME                            #
        PROC IPUMCLR;    # MEMORY CLEAR                                #
        PROC IPUWAIT;    # SUSPEND APPLICATION.                        #
        PROC MESSAGE;    # ISSUE DAYFILE MESSAGE                       #
        PROC SSIAEPR;    # ATS ERROR PROCESSING ROUTINE                #
        PROC SSICCCA;    # CRACK CONTROL CARD ARGUMENTS                #
        PROC SSICNAM;    # CONNECT TO NAM                              #
        FUNC SSICSSI I;  # CHECK JOB SUBSYSTEM IDENTIFIER              #
        PROC SSIDAOC;    # DELETE ATS OPEN CONNECTIONS                 #
        PROC SSIDDIS;    # DEBUG DISPLAY                               #
        PROC SSIDSSR;    # DELIVER SERVER SYSTEM RESPONSE              #
        PROC SSIIATS;    # INITIALIZE ATS SERVER                       #
        PROC SSIRASR;    # RECEIVE ATS SERVER REQUEST                  #
        PROC SSISACR;    # SEND ATS CLIENT REQUEST                     #
        PROC SSISICC;    # SET INTER-CP COMMUNICATION POINTERS         #
        PROC SSISURP;    # SETUP REPRIEVE PROCESSING                   #
        END 
  
      DEF  MSGCOUNT           # 30 #;  # B-DISPLAY REFRESH FREQUENCY   #
  
      ITEM ANYERROR                I;  # ERROR DETECTTION VARIABLE     #
      ITEM ERRLOOP                 I;  # LOOP COUNTER                  #
      ITEM LOOP                    I;  # LOOP COUNTER                  #
      ITEM LOOPCOUNT               I;  # LOOP COUNTER                  #
  
      ARRAY RDYMSG [00:00] S(3);
        BEGIN 
        ITEM RDY$TEXT    C(00,00,23) = [
          "ATF-ACSLM SERVER READY."]; 
        ITEM RDY$ZBYTE   U(02,18,42) = [0]; 
        END 
CONTROL EJECT;
  
# 
****  START MAIN PROCEDURE
# 
  
# 
****  INITIALIZE SOCKET AND HANDLES.
# 
  
      CLNT$SOCKET = 0;                 # CLIENT SOCKET NUMBER          #
      CLNT$HANDLE = 0;                 # CLIENT HANDLE NUMBER          #
      SRVR$SOCKET = 0;                 # SERVER SOCKET NUMBER          #
      SRVR$HANDLE = 0;                 # SERVER HANDLE NUMBER          #
      PMAP$SERVER = 0;                 # PORTMAPPER SERVER HANDLE      #
      PMAP$CLIENT = 0;                 # PORTMAPPER CLIENT HANDLE      #
  
# 
****  INITIALIZE RPC ERROR CODE ARRAY.
# 
  
      RPC$ERR [RPCSTAT"OK"]          = NOERROR$;
      RPC$ERR [RPCSTAT"NOHANDLE"]    = NOHANDL$;
      RPC$ERR [RPCSTAT"SOCKFAIL"]    = PSOCKFAIL$;
      RPC$ERR [RPCSTAT"HANDLEINACT"] = HANDLINAC$;
      RPC$ERR [RPCSTAT"RPCTIMEOUT"]  = REMUNAVA$; 
      RPC$ERR [RPCSTAT"CALLREJECT"]  = RPCREJ$; 
      RPC$ERR [RPCSTAT"CALLFAIL"]    = RPCREJ$; 
      RPC$ERR [RPCSTAT"BADCALL"]     = BADCALL$;
      RPC$ERR [RPCSTAT"DUPREG"]      = PDUPREG$;
      RPC$ERR [RPCSTAT"NOSPACE"]     = PNOSPACE$; 
      RPC$ERR [RPCSTAT"NOTREGISTRD"] = REMUNAVA$; 
  
# 
****  INITIALIZE CSI COMMAND CODES. 
# 
  
      CSI$COMMAND [MOUNT$]          = CSIMOUNT$;
      CSI$COMMAND [FORCEDIS$]       = CSIDISMOUNT$; 
      CSI$COMMAND [DISMOUNT$]       = CSIDISMOUNT$; 
      CSI$COMMAND [SERVERQUERY$]    = CSIQUERY$;
      CSI$XIDSEQ  [REQUEST$]        = 0;
  
# 
****  INITIALIZE EXTENDED MESSAGE REQUEST AREA. 
# 
  
      MSG$VERSION[REQUEST$] = VERSION2$;
      MSG$EXTOPT[REQUEST$]  = 0;
      MSG$LOCKID[REQUEST$]  = 0;
      EXT$WORD0 [REQUEST$]  = 0;
      EXT$USERPWD[REQUEST$] = " ";
  
# 
****  INITIALIZE REQUEST/REPLY SUBSYSTEM COMMUNICATION AREA.
# 
  
      MAGNETCONN = TRUE;               # ASSUME MAGNET UP AND RUNNING  #
      LOST$MSG = 0; 
      VOL$WORD [REQUEST$] = 0;
      VOL$WORD [REPLY$]   = 0;
      NEXTWRITE = 0;
      NEXTREAD = 0; 
      LOOPCOUNT = 0;
      IPUMCLR (LOC (REQBUF [REQUEST$]), BLOCKSIZE$);
      IPUMCLR (LOC (REPBUF [0]), (BLOCKSIZE$ * NUMBREP$));
  
      SSISURP;                         # SETUP REPRIEVE PROCESSING     #
  
      SSICCCA;                         # CRACK CONTROL CARD ARGUEMENTS #
  
      IF SSICSSI EQ 0 
      THEN
        BEGIN                          # WRONG SUBSYSTEM ID FOR JOB    #
        SSIAEPR (WRONGSSI$);           # TERMINATE APPLICATION         #
        END 
  
      SSISICC (REQBUF [0]);            # SET INTER-CP COMMUNICATION PTS#
  
      IF NOT IPUGHBN (SS, WRKSTADDR [0], TCPUN) 
      THEN
        BEGIN                          # WORKSTATION IP ADDR NOT FOUND #
        SSIAEPR (WORKNF$);             # TERMINATE APPLICATION         #
        END 
  
      SSICNAM;                         # START NAM CONNECTION          #
  
      SSIIATS (ANYERROR);              # ACTIVATE ALL CONNECTIONS      #
  
      IF ANYERROR EQ NOERROR$ 
      THEN
        MESSAGE (RDYMSG, 0);           # ISSUE ACSLM READY MESSAGE     #
  
      FOR LOOP = 0
      DO
        BEGIN                          # MAIN LOOP, ERROR OR NAM TERM  #
        FOR ERRLOOP = 0 
        WHILE (ANYERROR NQ NOERROR$)
        DO
          BEGIN                        # PROCESS ERROR RECOVERY        #
          SSIAEPR (ANYERROR); 
          IF (ANYERROR EQ NOERROR$) AND 
             MAGNETCONN 
          THEN
            MESSAGE (RDYMSG, 0);       # ISSUE ACSLM READY MESSAGE     #
  
          END                          # PROCESS ERROR RECOVERY        #
  
        IF REQ$WORD0 [0] NQ 0 
        THEN
          BEGIN                        # SUBSYSTEM REQUEST PENDING     #
          IF DFLAG
          THEN
            SSIDDIS (INTERNMSG$, DEBUGREC$);
  
          SSISACR (REQ$COMMAND [0], ANYERROR);
          END                          # SUBSYSTEM REQUEST PENDING     #
  
        IF ANYERROR EQ NOERROR$ 
        THEN
          BEGIN                        # CHECK FOR ANY SERVER REQUEST  #
          SSIRASR (TWOSEC$, ANYERROR);
          IF (ANYERROR EQ REMUNAVA$)
          THEN                         # ONLY WANT TO PASS THIS ERROR  #
            ANYERROR = NOERROR$;       # TO SSIAEPR IF CLIENT RECEIVED #
          END                          # CHECK FOR ANY SERVER REQUEST  #
  
        SSIDSSR (ANYERROR);            # DELIVER ANY SERVER SYSTEM RESP#
  
        LOOPCOUNT = LOOPCOUNT + 1;
        IF LOOPCOUNT EQ MSGCOUNT
        THEN
          BEGIN                        # ISSUE ATF READY TO B-DISPLAY  #
          LOOPCOUNT = 0;
          IF (ANYERROR EQ NOERROR$) AND 
             MAGNETCONN 
          THEN
            MESSAGE (RDYMSG, 1);       # ISSUE ACSLM READY MESSAGE     #
          END                          # ISSUE ATF READY TO B-DISPLAY  #
  
        END                            # MAIN LOOP, ERROR OR NAM TERM  #
  
      SSIDAOC;
      IPUWAIT (5);
      IPPENDN;
      STOP; 
      RETURN; 
  
      END                              # SSIACTF                       #
  
      TERM
