*DECK SSIAEPR 
USETEXT TEXTATS 
USETEXT TEXTIPL 
USETEXT TEXTRPC 
      PROC SSIAEPR (CODE);
*CALL COPYRITE
# TITLE SSIAEPR - ATS ERROR PROCESSING ROUTINE                         #
  
      BEGIN                            # SSIAEPR                       #
# 
****  SSIAEPR - ATS ERROR PROCESSING ROUTINE. 
* 
*     THIS PROCEDURE PROCESS ALL SSI/RPC/PORTMAPPER/SOCKET ERRORS AND 
*     PERFORMS THE APPROPRIATE ACTION.
* 
*     ENTRY    CODE = ERROR CODE ENCOUNTERED. 
* 
*     EXIT     CODE = NOERROR$, UNLESS ANOTHER ERROR ENCOUNTERED. 
*              ERROR MESSAGE ISSUED AND APPROPRIATE ACTION TAKEN. 
* 
*     METHOD   ISSUE DAYFILE INDICATING THE TYPE OF ERROR WHICH 
*              OCCURRED.  IF THE ERROR IS DUE TO A BAD RPC REQUEST, 
*              A DAYFILE MESSAGE CONTAINING BOTH THE OCTAL AND HEX
*              REPRESENTATION OF THE BUFFER IS ISSUED.  IF A REQUEST
*              CONTAINS UNEXPECTED DATA, SUCH AS AN UNKNOWN COMMAND,
*              THE COMMAND AND REQUEST STATUS ARE ADDED TO THE DAYFILE
*              MESSAGE.  ANY ERRORS DUE TO PARAMETER SYNTAX ERRORS OR 
*              APPLICATION INITIALIZATION CAUSE THE APPLICATION TO
*              TERMINATE.  ANY INTERNAL ERRORS THAT LOGICALLY SHOULD
*              NOT OCCUR ARE CONSIDERED FATAL AND WILL ABORT THE
*              APPLICATION. 
*              OTHER NON-FATAL ERRORS ARE DUE TO SOCKET DISCONNECTS 
*              OR PROBLEMS COMMUNICATING WITH WITH SERVER SYSTEM. 
*              IF THE PORTMAPPER SOCKET DISCONNECTED, ALL SOCKETS AND 
*              HANDLES ARE REINITIALIZED.  IF EITHER THE SERVER OR
*              CLIENT SOCKET FAILED, THEN THE INDIVIDUAL SOCKETS ARE
*              RESTARTED.   IF THE SERVER SYSTEM FAILS TO RESPOND,
*              A SERVER QUERY WILL BE ISSUED EVERY 2 MINUTES TO CHECK 
*              THE CURRENT STATE OF THE SERVER. 
# 
  
# 
****  PROC SSIAEPR - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC ABORT;      # ABORT JOB -MACREL-                          #
        PROC IPPABOS;    # IP ABORT SOCKET REQUEST                     #
        PROC IPPSTAS;    # IP STATUS SOCKET REQUEST                    #
        PROC MESSAGE;    # ISSUE DAYFILE MESSAGE                       #
        PROC PMPUNSET;   # DELETE PORTMAPPER DATABASE ENTRY            #
        PROC RPCSDES;    # DELETE RPC SERVER HANDLE                    #
        PROC SSIAATS;    # ACTIVATE ATS CLIENT SOCKET                  #
        PROC SSIAASH;    # ACTIVATE ATS SERVER HANDLE                  #
        PROC SSIIATS;    # INITIALIZE ALL ATS CONNECTIONS              #
        PROC SSIQSWR;    # QUERY SERVER WORKSTATION READY              #
        FUNC XCDD C(10); # CONVERT TO DECIMAL DISPLAY, RIGHT JUSTIFIED #
        PROC XWHD;       # CONVERT HEX TO DISPLAY CODE                 #
        PROC XWOD;       # CONVERT OCTAL TO DISPLAY CODE               #
        END 
  
# 
**
# 
  
      ITEM CODE                I;      # ERROR ENCOUNTERED             #
  
      ITEM NEWCODE             I;      # ANY ERROR DURING RESTARTING   #
      ITEM READ                B;      # IPPSTAS, DATA AVAILABLE       #
      ITEM RESULT          C(10);      # XCDD RESULT                   #
      ITEM RPCSTATUS   S:RPCSTAT;      # RPC RETURN STATUS             #
      ITEM SOCKSTATUS S:SOCKSTAT;      # SOCKET CALL STATUS            #
      ITEM STATE  S:CONNECTSTATE;      # IPPSTAS, SOCKET STATE         #
      ITEM VALUE               I;      # VALUE TO CONVERT TO DECIMAL   #
      ITEM WRITE               B;      # IPPSTAS, DATA CAN BE WRITTEN  #
  
  
# 
****  THIS ARRAY DEFINES THE EXTRA MESSAGE TO BE ISSUED WITH A
*     ACKNOWLEDGEMENT RECEIVED FROM THE SERVER SYSTEM WITH A BAD
*     STATUS INDICATION.
# 
  
      ARRAY CMD$MSG [00:00] S(3); 
        BEGIN 
        ITEM CMD$TEXT   C(00,00,21) = ["SERVER COMMAND =    ."];
        ITEM CMD$CMD    C(01,42,03);
        ITEM CMD$ZBYTE  U(02,06,54) = [0];
        END 
  
      ARRAY STT$MSG [00:00] S(3); 
        BEGIN 
        ITEM STT$TEXT   C(00,00,29) = ["SERVER RESPONSE STATUS =    ."];
        ITEM STT$STAT   C(02,30,03);
        ITEM STT$ZBYTE  U(02,54,06) = [0];
        END 
  
# 
****  THIS ARRAY DEFINES ALL ATF ERROR MESSAGES.
# 
      ARRAY ERR$MSG [01:ATFLAST$] S(4); 
        BEGIN 
        ITEM ERR$TEXT   C(00,00,37) = 
          ["ATF-DISABLED.                        ", 
           "ATF-APPLICATION ALREADY NETTED ON.   ", 
           "ATF-NOT INITIATED AS A SUBSYSTEM.    ", 
           "ATF-LOCAL HOST IP ADDRESS NOT FOUND. ", 
           "ATF-WORKSTATION IP ADDRESS NOT FOUND.", 
           "ATF-CONTROL CARD SYNTAX ERROR.       ", 
           "ATF-REQUIRED PARAMETER MISSING.      ", 
           "ATF-INVALID PARAMETER VALUE ENTERED. ", 
           "ATF-SERVER SOCKET DISCONNECTED.      ", 
           "ATF-CLIENT SOCKET DISCONNECTED.      ", 
           "ATF-PORTMAP SOCKET DISCONNECTED.     ", 
           "ATF-MAGNET SUBSYSTEM NOT RESPONDING. ", 
           "ATF-MAGNET SUBSYSTEM RESPONDING.     ", 
           "ATF-ERROR STATUS FROM SERVER SYSTEM. ", 
           "ATF-REMOTE SERVER SYSTEM UNAVAILABLE.", 
           "ATF-RPC REMOTE CALL REJECTED.        ", 
           "ATF-RPC REMOTE CALL FAILED.          ", 
           "ATF-RPC RECEIVED BAD CALL.           ", 
           "ATF-REPLY TABLE FULL, REPLY IGNORED. ", 
           "ATF-UNKNOWN SERVER COMMAND RECEIVED. ", 
           "ATF-PORTMAP DUPLICATE REGISTRATION.  ", 
           "ATF-PORTMAPPER TABLE FULL.           ", 
           "ATF-HANDLE TABLE FULL.               ", 
           "ATF-REFERENCED HANDLE INACTIVE.      ", 
           "ATF-INTERNAL ERROR.                  ", 
                                                   ]; 
        ITEM ERR$ZBYTE  U(03,42,18) = [0,ATFLAST$(0)];
        END 
CONTROL EJECT;
      PROC DISREQ (BUF, WORDS); 
      BEGIN                            # DISREQ                        #
# 
****  DISREQ - DISPLAY REQUEST BUFFER.
* 
*     THIS PROCEDURE DISPLAYS OCTAL AND HEX REPRESENTATION OF THE 
*     APPROPRIATE REQUEST IN THE USER DAYFILE.
* 
*     ENTRY    BUF   = LOCATION OF REQUEST BUFFER 
*              WORDS = NUMBER OF WORDS TO DISPLAY 
* 
*     EXIT     FORMAT AND ISSUE DAYFILE MESSAGE FOR *WORDS* NUMBER
*              OF CYBER WORDS.
# 
  
  
      ITEM BUF           U;            # LOCATION OF BUFFER TO DISPLAY #
      ITEM WORDS         I;            # NUMBER OF WORDS TO DISPLAY    #
  
# 
**
# 
      ITEM I             U;            # LOOP COUNTER                  #
      ITEM K             U;            # LOOP COUNTER                  #
  
# 
****  BUFFER ENTRY TO DISPLAY.
# 
      BASED ARRAY BUFFER [0:0] S(1);
        BEGIN 
        ITEM BUF$WRD  U(00,00,60);     # WORD REFERENCE                #
        END 
  
# 
****  TEMPORARY STORAGE AREA FOR OCTAL AND HEX WORD DUMP. 
# 
      ARRAY WRDMSG [00:00] S(2);
        BEGIN 
        ITEM WRD$TEXT    C(00,00,20); 
        END 
  
# 
****  DAYFILE MESSAGE TEXT. 
# 
      ARRAY DAYTXT [00:00] S(5);
        BEGIN 
        ITEM DAY$OCTAL   C(00,00,20); 
        ITEM DAY$SP      C(02,00,02)   = [" "]; 
        ITEM DAY$HEX     C(02,06,20); 
        ITEM DAY$ZBYTE   U(04,06,54)   = [0]; 
        END 
CONTROL EJECT;
# 
****  START DISREQ
# 
      P<BUFFER> = BUF;
      FOR I = 0 STEP 1 UNTIL (WORDS - 1) DO 
        BEGIN 
        XWOD (BUF$WRD [I], WRDMSG);    # CONVERT OCTAL TO DISPLAY      #
        DAY$OCTAL = WRD$TEXT; 
        XWHD (BUF$WRD [I], WRDMSG);    # CONVERT HEX TO DISPLAY        #
        DAY$HEX = WRD$TEXT; 
        MESSAGE (DAYTXT, 3);
        END 
  
      RETURN; 
  
      END                              # DISREQ                        #
CONTROL EJECT;
  
# 
****  START MAIN PROCEDURE
# 
  
      IF CODE EQ NOERROR$ 
      THEN
        RETURN; 
  
      NEWCODE = NOERROR$; 
  
      MESSAGE (ERR$MSG [CODE], 0);
  
# 
****  IF THE ERROR WAS CAUSED BY A BAD REQUEST SENT OR RECEIVED, DISPLAY
*     THE APPROPRIATE BUFFER IN THE DAYFILE.
# 
  
      IF (CODE EQ RPCREJ$) OR 
         (CODE EQ CALLFAIL$)
      THEN
        DISREQ (LOC (OUTDATABUF [0]), 25);
  
      IF (CODE EQ BADCALL$) 
      THEN
        DISREQ (LOC (INDATABUF [0]), 25); 
  
      IF (CODE EQ INVALIDREQ$) OR 
         (CODE EQ UNKNOWNCMD$)
      THEN
        BEGIN                          # INVALID RESPONSE STATUS TO CMD#
        VALUE = MSG$COMMAND [REPLY$]; 
        RESULT = XCDD (VALUE);
        CMD$CMD [0] = C<7,3>RESULT; 
        MESSAGE (CMD$MSG [0], 0); 
        VALUE = RSP$STATUS [REPLY$];
        RESULT = XCDD (VALUE);
        STT$STAT [0] = C<7,3>RESULT;
        MESSAGE (STT$MSG [0], 0); 
        END                            # INVALID RESPONSE STATUS TO CMD#
  
      IF CODE LQ PARMINV$ 
      THEN
        BEGIN                          # ERROR, TERMINATE APPLICATION  #
        STOP; 
        END 
  
      IF CODE GQ PDUPREG$ 
      THEN
        BEGIN                          # ABNORMAL ERROR, ABORT APPLICAT#
        ABORT;
        STOP; 
        END 
  
# 
****  IF PORTMAPPER'S SOCKET FAILED, ALL CONNECTIONS ARE SHUT DOWN AND
*     REINITIALIZED.  IF EITHER THE SERVER OR CLIENT SOCKETS FAILED,
*     JUST RESTART THE INDIVIDUAL SOCKET. 
# 
  
      IF PMAP$SERVER NQ 0 
      THEN
        BEGIN                          # CHECK PORTMAPPER STATUS       #
        IPPSTAS (PMAP$SOCKET, STATE, READ, WRITE, SOCKSTATUS);
        IF SOCKSTATUS NQ S"OK"
        THEN
          BEGIN                        # PORTMAPPER FAILED TOO         #
          SSIIATS (CODE);              # REINITIALIZE ALL CONNECTIONS  #
          RETURN; 
          END 
        END                            # CHECK PORTMAPPER STATUS       #
  
      IF CODE EQ CSOCKFAIL$ 
      THEN
        BEGIN                          # RESTART CLIENT SOCKET         #
        IF CLNT$SOCKET NQ 0 
        THEN
          BEGIN 
          IPPABOS (CLNT$SOCKET, SOCKSTATUS);
          CLNT$SOCKET = 0;
          SSIAATS;                     # ACTIVATE ATS CLIENT SOCKET    #
          END 
        END                            # RESTART CLIENT SOCKET         #
  
      ELSE IF CODE EQ SSOCKFAIL$
      THEN
        BEGIN                          # RESTART ATS SERVER HANDLE     #
        IF SRVR$HANDLE NQ 0 
        THEN
          BEGIN 
          PMPUNSET (ATSPROGRAM$, ATSVERSION$, RPCSTATUS); 
          RPCSDES (SRVR$HANDLE);
          SRVR$HANDLE = 0;
          SRVR$SOCKET = 0;
          SSIAASH;                     # ACTIVATE ATS SERVER HANDLE    #
          END 
        END                            # RESTART ATS SERVER HANDLE     #
  
      ELSE IF CODE EQ REMUNAVA$ 
      THEN                             # REMOTE UNAVAILABLE, QUERY SS  #
        SSIQSWR (NEWCODE);
  
      CODE = NEWCODE; 
  
      END                              # SSIAEPR                       #
  
      TERM
