*DECK MHF 
    PRGM MHF; 
# TITLE   MHF - MAINTENANCE HOST FACILITY # 
  
      BEGIN  # MHF #
  
# 
**    MHF - MAINTENANCE HOST FACILITY.
* 
*     MHF DUMPS AND LOADS LOCAL NADS WHEN THEY FAIL.
* 
*     PRGM MHF. 
* 
*     COPYRIGHT (C) CONTROL DATA CORPORATION 1984.
*     D. P. KARVONEN           06/01/84 
* 
*     ENTRY   - RHF MUST BE UP. 
* 
*     EXIT    - MHF STOPS WHEN RHF SHUTS DOWN.
* 
*     PROCESS - ISSUE MHF-START MESSAGE 
*               CALL RHFON (NETON) TO LOG INTO RHF SUBSYSTEM. 
*               IF NETON WAS REJECTED:  
*                 ISSUE NETON FAILURE MESSAGE.
*                 SET ERROR = TRUE. 
*               ELSE: 
*                 CALL GETNDT FOR NETWORK DESCRIPTION TABLE FROM RHF. 
*                 IF NO ERROR 
*                   WHILE RHF ACTIVE
*                     IF SUPERVISORY MESSAGE AVAILABLE
*                       CALL GETSUP TO PROCESS MESSAGE
*                     ELSE: 
*                       CALL RECNAD (RECOVER/EXTRACT NAD ERROR LOG) 
*                       CALL RHFWAIT (DELAY = 0 - ELIDLEDLY)
*               IF NETOFF NOT DONE
*                 CALL RHFOFF (NETOFF)
*               ISSUE TERMINATION MESSAGE 
*               IF ERROR
*                 ABORT MHF.
*               STOP. 
# 
  
# 
****  PRGM MHF - XREF LIST BEGIN
# 
  
      XREF
        BEGIN 
        ITEM SSJCALL;              # USED TO GET SSJ EPT #
        PROC CALLSYS;              # CALL SYSTEM VIA RA+1 # 
        PROC CMMAGR;               # ASSIGN GROUP NAME (CMM) #
        PROC GETNDT;               # GET NDT FROM RHF # 
        PROC GETSUPM;              # GET SUPERVISORY MESSAGE #
        PROC RECNAD;               # RECOVER NAD (DUMP/LOAD) #
        PROC RECOVR;               # REPRIEVE INTERFACE # 
        PROC RHCRPV;               # COMMON REPRIEVE ROUTINE #
        PROC RHFDBG;               # DEBUG - DISPLAY SUP MSGS # 
        PROC RHFOFF;               # LOG OUT FROM RHF SUBSYSTEM # 
        PROC RHFON;                # LOG IN TO RHF SUBSYSTEM #
        PROC RHFWAIT;              # WAIT FOR RHF MESSAGE # 
        PROC TIMHMS;               # CURRENT TIME (HHMMSS) #
        END 
  
# 
****  PRGM MHF - XREF LIST END
# 
  
CONTROL PRESET; 
  
*CALL COMCBEGN
*CALL COMMCOM 
*CALL COMMGET 
*CALL COMRNAM 
*CALL COMRNET 
*CALL COMRRHH 
*CALL COMRRTN 
  
      ITEM I          I;          # SCRATCH # 
CONTROL EJECT;
  
      STAT = SSJCALL;              # DUMMY REFERENCE #
      MSG$STATWD = LOC(MSG$STATUS);  # INITIALIZE MSG CALL #
  
      MSG$BUFADR = LOC(MHFMESSAGE[0]);
      MSG$STATUS = 0; 
      MSG$DSPLAY = MSG$DAYF;
      CALLSYS (MSGCALL);           # DAYFILE MESSAGE #
  
      RHFON (ANAME,NSUP,STAT,MINACN,MAXACN);  # NET ON #
  
      IF STAT NE NTON$OK           # IF NETON REJECTED #
      THEN
        BEGIN 
  
        IF STAT GT NETNERR$MX      # IF INVALID ERROR CODE #
        THEN
          BEGIN 
          STAT = NETNERR$MX;       # USE MAXIMUM #
          END 
  
        IF STAT EQ NETNERR$MX      # IF INVALID ERROR # 
          OR STAT EQ NTON$ILACN    # OR INVALID ACN # 
        THEN
          BEGIN 
          ERROR = TRUE;            # SET ERROR FOR ABORT #
          END 
  
        MSG$BUFADR = LOC(NETNERRMSG[STAT]); 
        MSG$STATUS = 0; 
        CALLSYS (MSGCALL);           # DAYFILE MESSAGE #
        END 
  
      ELSE
        BEGIN 
        RECOVR(RHCRPV, O"277", 0); # ADD *RHCRPV* TO REPRIEVE LIST #
  
        $BEGIN                     # DEBUG CODE # 
        RHFDBG (0,1,ERROR,1);      # DISPLAY SUP MESSAGES # 
        $END
  
        ERROR = FALSE;             # CLEAR ERROR FLAG # 
        CMMAGR(0, CMMGRP);         # ASSIGN CMM GROUP IDENTIFIER #
        P<ELB> = LOC(BUFWD[1]);    # ERROR LOG BUFFER # 
        GETNDT;                    # GET NDT FROM RHF # 
          DLCHKNDT = TRUE;         # INITIAL CHECK-NDT-FLAG # 
  
          ASLONGAS STAT EQ 0       # WHILE RHF ACTIVE # 
            AND NOT ERROR 
          DO
            BEGIN 
            TIMHMS (CURRTIM);      # SET CURRENT TIME # 
  
            IF NSUP$SBIT             # IF RHF MESSAGE AVAILABLE # 
            THEN
              BEGIN 
              GETSUPM;             # GET SUPERVISORY MESSAGE #
              END 
  
            ELSE
              BEGIN 
              GETNDT;              # UPDATE NETWORK DESCRIPTION TABLE # 
              IF ERROR
              THEN
                BEGIN 
                CYCLE $DUM$$;      # EXIT MAIN LOOP # 
                END 
  
              RECNAD;              # RECOVER NAD (CHECK NDT) #
  
              IF DLCHKNDT          # IF NDT NEEDS CHECKING #
              THEN
                BEGIN 
                I = 0;             # RHFWAIT DELAY #
                END 
  
              ELSE
                BEGIN 
                I = ELIDLEDLY;     # RHFWAIT DELAY (NOMINAL) #
  
                IF I GT DLDELAY 
                THEN
                  BEGIN 
                  I = DLDELAY;     # USE SHORTER DELAY #
                  END 
                END 
  
              RHFWAIT (I,0);       # DELAY #
              END 
            END 
        END 
  
      IF STAT EQ 0                 # IF NETOFF NEEDED # 
      THEN
        BEGIN 
        RHFOFF; 
        END 
  
      IF ERROR
      THEN
        BEGIN 
        MSG$BUFADR = LOC(MHFMESSAGE[2]);
        MSG$STATUS = 0; 
        CALLSYS (MSGCALL);           # DAYFILE MESSAGE #
        CALLSYS(ABTCALL);          # ABORT MHF #
        END 
  
      MSG$BUFADR = LOC(MHFMESSAGE[1]);
      MSG$STATUS = 0; 
      CALLSYS (MSGCALL);           # DAYFILE MESSAGE #
  
      END  # MHF #
  
    TERM
