FTN4,Q,C
       PROGRAM RESTR(4,60),92067-16346,REV.2026 800501
C 
C 
C SOURCE PART NO.: 92067-18346
C RELCO. PART NO.: 92067-16346
C NAME: RESTR - ON LINE RESTORE PROGRAM 
C 
C 
C FILE NAME: %RESTR 
C 
C 
C   PROGRAMMER: J.S.W.,JRS
C 
C  ***************************************************************
C  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS     *
C  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
C  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
C  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
C  ***************************************************************
C 
C 
C 
C THIS PROGRAM RESTORES A TAPE FILE WHICH WAS SAVED  BY 
C LSAVE OR USAVE UTILITY PROGRAMS.
C THE MAG TAPE MUST HAVE BEEN POSITIONED TO THE CORRECT FILE
C NO SPARING IS DONE DURING ON-LINE RESTORE 
C 
C RU FORMAT:
C  RU,RESTR,[<LOG LU>], <DISC LU>, [<MT LU>], [DE]
C  WHERE: 
C     <LOG LU>::= LU OF LOG DEVICE
C     < DISC LU>::= DESTINATION DISC LU TO RESTORE TO, OR DISC
C                   DRIVE UNIT ASSOCIATED WITH THIS LU
C     <MT LU>::= MAG TAPE LU
C     DE ::= DEFAULT, NO CONFIRMATION OF HEADER 
C 
C  SEQUENCE OF OPERATIONS:
C 
C  1. GET PARAMETERS FROM RUN STRING OR INTERACTIVELY AND CHECK 
C     EACH LU TO SEE IF VALID 
C  2. REQUEST MT LOCK 
C  3. READ HEDER RECORD FROM MT AND PRINT TIME,DATE AND RUN STRING
C  4. CHECK HEADER TO SEE IF LSAVE (LSAVEN=1) OF USAVE (NOT=1) TAPE 
C  5. SEE IF OPTION = DEFAULT OR NOT
C       IF YE, GO ON, IF NOT ASK "OK?". 
C       IF OK TO PROCEED NEXT STEP, ELSE FORWARD SPACE NEXT FILE AND ASK
C          "OK?" AGAIN. REPEAT UNTIL "/E,EX OR EN"
C  6. REPEAT THE FOLLOWING FOR "LSAVEN" SUBCHANNELS 
C  7. IF USAVE, COMPARE TRACK MAP TABLES (FROM THE TAPE AND CURRENT SYSTEM
C     BY IDLU)
C     IF NOT EQUAL CANNOT RESTORE.
C     IF NOT USAVE(MUST BE LSAVE), SEE IF DEST. LU IS LU 2 OR 3. IF YES 
C       CANNOT RESTOR.
C     IF USAVE TAPE AND LU 2 OR 3 INCLUDED, GET TRACK MAP TABLE (TMT) 
C       ENTRY FOR LU 2 OR 3 AND COMPARE WITH CURRENT TMT ENTRY FROM 
C       MAG TAPE HEADER. IF EQUAL SKIP THIS SUBCHANNEL. IF NOT NEXT STEP
C  8. COMPUTE TRACK SIZE, LAST TRACK, SECTOR PER TRACK AND CHECK
C     IF SOURCE AND DEST. SUBCHANNEL HAS SAME NO. OF TRACKS.
C     IF NOT THE SAME, ASK IF OK TO PROCEED. IF YES, SET TRACK COUNT
C       EQUAL TO SMALLER OF THE TWO SUBCHNNELS. 
C  9. FOR TRACK# FROM 0 TO LAST TRACK, READ ONE TRACK FORM TAPE, CHECK
C     STATUS AND WRITE IT ONTO DISC.
C 10. READ HEADER FOR NEXT SUBCHANNEL, REPEAT STEPS 6 TO 10 AND STOP. 
C 
C 
C 
C 
C 
      DIMENSION IREG(2),IBUF(1),IXBUF(8208),ISTR(80),IVBUF(128),
     X          IHDR(247),ITME(15),ITX32(161),ISUBMP(5),ITEMP(5), 
     X          LU2MP(5),LU3MP(5),MSGTAP(5),MSG2(20),MSG3(11) 
     X         ,MSG4(15),IPARM(5) 
C 
C 
      EQUIVALENCE (REG,IA,IREG),(IB,IREG(2)), 
     X            (ITME,IHDR(1)), 
     X            (ISUBMP(1),IHDR(239)),
     X            (LU2,IHDR(244)),
     X            (ISTR(1),IHDR(16)), 
     X            (ITX32,IHDR(77)), 
     X            (LSAVEN,IHDR(245)), 
     X            (IBUF(1),IXBUF(16)),
     X            (LUSUB,IHDR(246)),
     X            (ITAPE,IHDR(247)) 
C 
      DATA MSGTAP/2HTA,2HPE,2H #,2H  /
      DATA MSG2/2HNO,2H. ,2HOF,2H S,2HUB,2HCH,2HAN,2HNE,2HLS, 
     X   2H B,2HEI,2HNG,2H R,2HES,2HTO,2HRE,2HD / 
      DATA MSG3/2HRE,2HST,2HOR,2HIN,2HG ,2HSU,2HBC,2HHN,2HL / 
      DATA MSG4/2HNO,2H. ,2HOF,2H T,2HRA,2HCK,2HS ,2HRE,2HST, 
     X  2HOR,2HED,2H  / 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
C 
C  ON LINE RESTORE UTILITY
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C ISTR- RUN STRING
C N=0 INDICATES RESTORE 
C LOG - LOG LU
C IDLU- DEST. DISC LU 
C MTLU- MAG TAPE LU 
C IVRFY- 1 FOR DEFAULT 0 FOR NO 
C 
C 
C 
      N=0 
      CALL XGTPM(ISTR,N,LOG,IDLU,MTLU,IVRFY)
C 
C CLEAR 10G RETURN VALUE
C 
      IPARM(1)=2H 
C 
C     LOCK PROGRAM IN MEMORY TO PREVENT DEADLOCK
C 
      CALL EXEC(22+100000B,1) 
      GO TO 3 
    2 GO TO 4 
    3 CALL EXEC(2,LOG,33H UNABLE TO LOCK PROGRAM IN MEMORY,-33) 
      CALL EXEC(2,LOG,32H   WARNING: DEADLOCKS MAY OCCUR!,-32)
    4 CONTINUE
C 
C     UNBUFFER THE MAGTAPE,RESTORE IT WHEN DONE 
C 
      IFLAG = 0 
      CALL XMTBU(MTLU,IFLAG)
C 
C REQUEST MT LOCK 
C 
1000  CALL LURQ(140001B,MTLU,1) 
      GO TO 1500
1100  CONTINUE
1500  CALL ABREG(IA,IB) 
      IF(IA.EQ.0) GO TO 2500
      CALL EXEC(2,LOG+200B,19HWAITING FOR MT LOCK,-19)
      CALL LURQ(1,MTLU,1) 
2500  CONTINUE
C IUSAVE=0 FOR LSAVE, ELSE LSAVE
C INIT TO LSAVE 
C 
      IUSAVE=0
C 
C 
C INTERACTIVE DEVICE LU 
C 
      ITTY=LOGLU(ISESS) 
C 
C  READ HEADER AND PRINT TIME,DATE,DAY AND TITLE
C 
10    CALL EXEC(1,MTLU,IHDR,247)
      CALL ABREG(IA,IB) 
      IF(IAND(IA,2).EQ.2) GO TO 960 
D     WRITE(1,999) IA,IB
D999  FORMAT(2@8) 
      DO 11 I=1,75
   11 IHDR(77-I) = IHDR(76-I) 
      IHDR(1) = 2H
      CALL EXEC(2,LOG+200B,IHDR,-76)
      CALL XDCAS(MSGTAP(5),1,ITAPE) 
      CALL EXEC(2,LOG+200B,MSGTAP,-10)
C 
C 
      IF(ITTY.EQ.LOG) GO TO 15
      CALL EXEC(2,ITTY,IHDR,-76)
      CALL EXEC(2,ITTY,MSGTAP,-10)
15    IF(LSAVEN.GT.1) IUSAVE=1
C 
C 
C IF DE OPTION IS MISSING ASK IF OK,
C      IF YES CONTINUE
C      IF NO FORWARD SPACE NXT FILE 
C      IF NON OF ABOVE ASK AGAIN
C 
      IF(IVRFY.EQ.1)GO TO 30
20    CALL EXEC(2,ITTY,3HOK?,-3)
      CALL  EXEC(1,ITTY+400B,ITEMP,-2)
      IF(ITEMP.EQ.2HYE) GO TO 30
      IF(ITEMP.EQ.2H/E.OR.ITEMP.EQ.2HEX.OR.ITEMP.EQ.2HEN)STOP 77
      IF(ITEMP.NEQ.2HNO) GO TO 20 
      CALL EXEC(3,MTLU+1300B) 
      GO TO 10
C 
C 
C*************************************************************************
C 
C NOW WE HAVE THE HEADER INFO ,TMT. GET TMT FOR LU 2 OR 3 
C 
C********************************************************************** 
C 
C 
C 
C     CLEAR OUT LU2 AND 3 TRACK MAPS IN CASE SYSTEM IS A 7900 
C 
  30  DO 25 I=1,5 
      LU2MP(I) = 0
  25  LU3MP(I) = 0
C 
C     CHECK TYPE OF SYSTEM DISCS
C 
      CALL EXEC(13,2,IEQT5) 
      IF (IAND(IEQT5,37400B)-15000B) 32,31,32 
31    CALL EXEC(1,2202B,LU2MP,5,0,5)
32    CALL EXEC(13,3,IEQT5) 
      IF (IAND(IEQT5,37400B)-15000B) 35,34,35 
 34   CALL EXEC(1,2203B,LU3MP,5,0,5)
C 
C 
C COMPARE WHOLE TMT FORM TAPE WITH CURRENT SYSTEM 
C IF NOT EQUAL AND USAVE FILE, CANNOT RESTORE 
C 
C 
C SET UP # OF SUBCHANNELS TO BE COMPARED
C 
  35  ICNT=-ITX32 
      CALL EXEC(13,IDLU,IEQT5)
      IF (IAND(IEQT5,37400B)-15000B) 980,36,980 
  36  CALL EXEC(1,IDLU+2200B,IBUF, 161,0,5) 
      CALL COMPR(IBUF,ITX32,ICNT,IER) 
      IF(IER.NEQ.0.AND.IUSAVE.EQ.1)  GO TO 950
C 
C 
C  LSAVEN = NO. OF LSAVE'S IN THE FILE BEFORE EOF MARK
C 
      LASTSB=LSAVEN 
      CALL XDCAS(MSG2(18),3,LASTSB) 
      CALL EXEC(2,LOG+200B,MSG2,-40)
C 
C*********************************************************************
C 
C RESTORING ALL SUBCHANNELS (1 TO LASTSB) 
C 
C*********************************************************************
C 
      DO 6000 LSUBN=1,LASTSB
      MXTRK=ISUBMP(4) 
      MXSEC=ISUBMP(1) 
C 
C CHECK IF DESTINATION SUBCHNNEL IS LU 2 OR 3 BY COMPARING
C TMT ENTRY OF LU 2 OR 3 WITH THAT OF THE TAPE. 
C IF USAVE FILE AND EQUAL (IER=0) SKIP RESTORING THIS SUBCHNNL
C IF LSAVE FILE AND EQUAL (IER=0) ERROR- CANNOT RESTORE. STOP.
C 
C 
      ISKIP=0 
      CALL COMPR(ISUBMP,LU2MP,5,IER1) 
      CALL COMPR(ISUBMP,LU3MP,5,IER2) 
      IER=IER1+IER2 
      IF(IER.EQ.0.AND.IUSAVE.EQ.0) GO TO 900
      IF(IER.EQ.0.AND.IUSAVE.EQ.1) ISKIP=1
      IF(ISKIP.EQ.1) CALL EXEC(2,LOG, 
     X  25H SKIP RESTORING LU 2 OR 3,-25) 
C 
C 
C 
C IF LSAVE TAPE CHECK IF # OF TRACKS IN DEST LU THE SAME
C IF NOT THE SAME, PRINT # OF TRACKS IN SOURCE AND DEST. LU 
C   AND ASK IF  OK TO PROCEED.
C 
      IF(IUSAVE.EQ.1) GO TO 50
      IF(IDLU.EQ.2.OR.IDLU.EQ.3) GO TO 900
      CALL EXEC(1,IDLU+2200B,ISUBMP,5,0,5)
      IF(MXSEC.NEQ.ISUBMP(1)) GO TO 970 
      IF(MXTRK.EQ.ISUBMP(4)) GO TO 50 
C 
C 
40    CALL XDCAS(IBUF(1),3,MXTRK) 
      IBUF(4)=20137B
      CALL EXEC(2,ITTY,IBUF,-8) 
      CALL EXEC(2,ITTY,20H TRACKS IN SOURCE LU,-20) 
      CALL XDCAS(IBUF(1),3,ISUBMP(4)) 
      CALL EXEC(2,ITTY,IBUF,-8) 
      CALL EXEC(2,ITTY,20H TRACKS IN DEST. LU ,-20) 
      CALL EXEC(2,ITTY,15HOK TO PROCEED?_,-15)
C 
      CALL EXEC(1,ITTY+400B,I,-2) 
      IF(I.EQ.2HNO) STOP
      IF(I.EQ.2HYE) GO TO 50
      GO TO 40
C 
C COMPUTE TRACK SIZE AND SET LAST TRACK TO THE SMALLER OF TWO IN
C SOURCE OR DEST. SUBCHANNELS.
C 
50    ISIZE=ISUBMP(1)*64+1
      MXSEC=ISUBMP(1) 
      IF(MXTRK.GT.ISUBMP(4)) MXTRK=ISUBMP(4)
C 
C FOR TRACK# = 0 TO LAST TRACK READ ONE RECORD FROM MT, WRITE IT TO DISC
C PRINT SUBCHNNL # BEING RESTORED 
C 
      IF(ISKIP.EQ.1.OR.IUSAVE.EQ.0) GO TO 80
C 
C PRINT "RESTORING SUBCNL XX" 
C 
      CALL XDCAS(MSG3(10),2,LUSUB)
      CALL EXEC(2,LOG+200B,MSG3,-22)
C 
80    DO 100 LTRK=0,MXTRK-1 
      CALL EXEC(1,MTLU,IBUF,ISIZE)
      CALL ABREG(IS1,IB)
      IF(IB.EQ.0) GO TO 960 
      IF(IAND(IS1,2).EQ.2) GO TO 960
      IF(IAND(IS1,40B).EQ.40B) CALL EOTAP(ITTY,MTLU,IHDR,IBUF,ISIZE)
      IF(IAND(IS1,200B).EQ.200B) GO TO 850
      IF(IAND(IBUF(1),37777B).NEQ.LTRK) GO TO 800 
C 
C IF ISKIP=1 SKIP RESTORING LU 2 OR 3 FOR USAVE FILE
C 
      IF(ISKIP.EQ.1) GO TO 100
      CALL WRTRK(IDLU,LTRK,ISUBMP,IXBUF,LOG,IBT)
C 
C IF BAD TRACK EXIST (IBT=1) SET 10G TO -1
C 
      IF(IBT.EQ.1) IPARM(1)=2H-1
100   CONTINUE
C 
C PRINT # OF TRACKS RESTORED
C 
      IF(ISKIP.EQ.1.) MXTRK=0 
      CALL XDCAS(MSG4(13),3,MXTRK)
      CALL EXEC(2,LOG+200B,MSG4,-30)
CC
C 
C 
C READ NEXT HEADER, DO RESTORING FOR NEXT SUBCHANNEL
C 
      CALL EXEC(1,MTLU,IHDR,247)
C 
6000  CONTINUE
C 
C DONE RESTORING
C 
C*********************************************************************
C 
C UNLOCK MT LU
      CALL LURQ(0,MTLU,1) 
C 
C RETURN 10G VALUE
C 
      CALL PRTN(IPARM)
C 
C     RESTORE MAGTAPE BUFFERING TO PRE-PROGRAM STATE
C 
      CALL XMTBU(MTLU,IFLAG)
C     UNLOCK PROGRAM
C 
      CALL EXEC(22+100000B,0) 
      GO TO 750 
  700 STOP 77 
  750 STOP 77 
900   CALL EXEC(2,LOG+200B,27HCANNOT RESTORE TO LU 2 OR 3,-27)
      GO TO 990 
800   CALL EXEC(2,LOG+200B,17HTAPE FORMAT ERROR,-17)
      GO TO 990 
C 
C 
850   CALL EXEC(2,LOG+200B,16HTAPE EOF ILLEGAL,-16) 
      GO TO 990 
950   CALL EXEC(2,LOG+200B,29HTRACK MAP TABLES DO NOT MATCH,-29)
      GO TO 990 
960   CALL EXEC(2,LOG+200B,15HMT PARITY ERROR,-15)
      GO TO 990 
970   CALL EXEC(2,LOG+200B,21HTRACK SIZES NOT EQUAL,-21)
      GO TO 990 
980   CALL EXEC(2,LOG+200B,17H UNSUPPORTED DISC,-17)
 990  CALL XMTBU(MTLU,IFLAG)
      STOP 66 
      END 
                                                                                        