PROGRAM KCWDUP C C ALLOWS UPDATING OF SELECTED SUB-FILES OF FILE [100,100]KCW.DAT ON A C 'REMOTE' PDP11 VIA DECNET TRANSFERS WITH 'KCWLSN' TASK RUNNING ON C 'CENTRAL' PDP11/70. C C ADAPTED FOR PDP11 FROM VAX PROGRAM BY D.GELLER 10-JAN-80. C C-------------------------------------------------------- C C TO USE: TYPE A STRING OF LOGICAL CONSTANTS (T/F) WHEN 'COPY FLAGS' C ARE REQUESTED. C C THE FIRST FLAG HAS A SPECIAL MEANING: C 'T' IF THE UPDATING IS TO START FROM THE CENTRAL NODE'S C CURRENT INDEX; C 'F' IF THE UPDATING IS TO START USING THE REMOTE NODE'S C CURRENT INDEX. C C THE SUCCEEDING FLAGS EACH CORRESPOND TO A PARTICULAR SUBFILE: C 'T' TO UPDATE THAT RESPECTIVE FILE; C 'F' TO NOT UPDATE THAT RESPECTIVE FILE. C C THE SUBFILES ARE: C C NO. DATA START STOP C -- ---- ---- ---- C 1 SA 11 410 C 2 FT 411 710 C 3 MT 711 810 C 4 FD 811 1210 C 5 DF 1211 1410 C 6 WS 1411 1710 C 7 WA 1711 1810 C 8 UA 1811 1910 C 9 TR 1911 2210 C 10 TS 2211 2310 C 11 WW 2311 2360 C 12 NO 2361 2460 C 13 CA 2461 2510 C 14 SD 2511 2810 C 15 GN 2811 2848 C 16 ER 2849 2980 C 17 FS 2981 3400 C C-------------------------------------------------- C PARAMETER NOSUBS =17 !NUMBER OF SUB-FILES PARAMETER KCWLUN =3 !KCW DATA FILE LUN PARAMETER LNKLUN =4 !LOGICAL LINK LUN PARAMETER QUELUN =2 !NETWORK DATA QUEUE LUN PARAMETER SEC1 =15 !INTERVAL BETWEEN REQUESTS PARAMETER RECMAX =3450 !MAXIMUM RECORD NUMBER C LOGICAL*1 NFLAG,FLAGS(NOSUBS) !HOW, WHICH FILES TO UPDATE LOGICAL*1 LSTAT !STATUS C INTEGER*2 IDXREM(256),IXREM(5,51) !FILE INDEX FOR 'REMOTE' INTEGER*2 IDXCEN(256),IXCEN(5,51) !FILE INDEX FOR 'CENTRAL' INTEGER*2 DATBUF(256) !FOR DATA INTEGER*2 REQ(2,4) !FOR REQUESTS INTEGER*2 ISTAT(2) !STATUS INTEGER*2 ITASK(16) !TASK PARAMETERS INTEGER*2 ITASKA(3) !TASK NAME, ASCII C INTEGER*4 KCWFL4(5) !FOR FILE NAME, ASCII C BYTE IDISC(4) !DISC ON WHICH 'REMOTE' KCW.DAT RESIDES BYTE KCWFIL(24) !FOR KCW FILE NAME BYTE NODER(6) !REMOTE NODE NAME BYTE NODEC(6) !CENTRAL NODE NAME BYTE DESBLK(72) !DESTINATION DESCRIPTOR BLOCK BYTE KCWLSN(6) !'KCWLSN' -- TASK NAME C EQUIVALENCE (IDXREM,IXREM) EQUIVALENCE (IDXCEN,IXCEN) EQUIVALENCE (IDISC,KCWFIL) EQUIVALENCE (KCWFL4,KCWFIL) C DATA KCWFL4 /'DR2:','[100',',100',']KCW','.DAT'/ DATA KCWLSN /'K','C','W','L','S','N'/ DATA NODEC /'M','T','R','7','0','0'/ !***NAME OF CENTRAL NODE DATA NTOTAL /0/ !RECORD COUNT INIT DATA NFLAG /0/ DATA FLAGS /2*-1,0,9*-1,0,-1,3*0/ C C----------------------------- C C REQUEST COPY FLAGS C C TYPE *,' ENTER ',NOSUBS+1,' COPY FLAGS:' C ACCEPT 10,NFLAG,FLAGS C10 FORMAT (L1) C C REQUEST DISC NAME C 15 CONTINUE C TYPE *,' ENTER 4 BYTE DISC DESIGNATOR (E.G. ''DB0:''):' C ACCEPT 20,IDISC C20 FORMAT(4A1) KCWFIL(21)=0 !TO TERMINATE STRING C C OPEN KCW.DAT AND READ CURRENT INDEX FILE C OPEN(UNIT=KCWLUN,NAME=KCWFIL,TYPE='OLD', 1 ACCESS='DIRECT',ASSOCIATEVARIABLE=IREC,SHARED) READ(KCWLUN'1)IDXREM !INDEX BLOCK C C ACCESS NETWORK C 40 CONTINUE CALL OPNNTW(QUELUN,ISTAT,,) IF(ISTAT(1) .NE. 1) GOTO 900 !ERROR?? C C BUILD FORMAT 1 CONNECT BLOCK C CALL BFMT1(LSTAT,DESBLK,6,NODEC,,6,KCWLSN) IF (.NOT. LSTAT) GOTO 920 !ERROR?? C C CONNECT TO KCWLSN C CALL CONNTW(LNKLUN,ISTAT,DESBLK,,,,) IF(ISTAT(1) .NE. 1)GOTO 900 !ACCEPTED?? C C BUILD REQUEST TO GET INDEX FROM CENTRAL NODE C 100 CONTINUE DO 110 I=2,4 REQ(1,I)=0 REQ(2,I)=0 110 CONTINUE C REQ(1,1)=1 !BLOCK 1 REQ(2,1)=1 !ONLY C C REQUEST INDEX C CALL XMINTW(LNKLUN,ISTAT,16,REQ) IF (ISTAT(1) .NE. 1)GOTO 900 C C READ INDEX C CALL RECNTW(LNKLUN,ISTAT,512,IDXCEN) IF (ISTAT(1) .NE. 1)GOTO 900 C IF (.NOT. NFLAG)GOTO 150 !BRING OLD INDEX UP TO CURRENT? WRITE(KCWLUN'1)IDXCEN !IF SO,WRITE CENTRAL'S INDEX AS REMOTE'S READ(KCWLUN'1)IDXREM !USE IT NFLAG=.FALSE. !FOR NEXT TIME AROUND C C ANYTHING TO DO? C 150 CONTINUE IF(IDXREM(1) .EQ. IDXCEN(1))GOTO 300 !TEST BLOCK WRITTEN COUNTER C C YES, SO CHECK EACH OF THE SUBFILES ..... C DO 200 I=1,NOSUBS IF(.NOT. FLAGS(I))GOTO 200 !SKIP IF FALSE C IWRAP=IXCEN(5,I)-IXREM(5,I) !TEST WRAP COUNTER -- UPDATE ENTIRE FILE? IF (IWRAP .LT. 0) IWRAP=IWRAP+10000 !(MOD 10000 COUNTER) IF (IWRAP .GT. 1) GOTO 160 C IF ((IXREM(3,I) .EQ. IXCEN(3,I) .AND. 1 IXREM(4,I) .EQ. IXCEN(4,I))) GOTO 200 !SKIP IF POINTERS THE SAME C C BUILD A REQUEST C REQ(1,1)=IXREM(3,I) REQ(2,1)=IXCEN(3,I)-IXREM(3,I)+1 REQ(1,2)=0 REQ(2,2)=0 IF (REQ(2,1) .GT. 0) GOTO 170 C C CORRECT FOR WRAP C REQ(2,1)=IXCEN(2,I)-IXREM(3,I)+1 REQ(1,2)=IXCEN(1,I) REQ(2,2)=IXCEN(3,I)-IXCEN(1,I)+1 GOTO 170 C 160 CONTINUE REQ(1,1)=IXCEN(1,I) REQ(2,1)=IXCEN(2,I)-IXCEN(1,I)+1 REQ(1,2)=0 REQ(2,2)=0 C C MAKE REQUEST C 170 CONTINUE NCNT=REQ(2,1)+REQ(2,2) !TOTAL BLOCK COUNT OF REQUEST NREC=REQ(1,1) !NEXT RECORD NUMBER TO WRITE C CALL XMINTW(LNKLUN,ISTAT,16,REQ) !MAKE REQUEST IF(ISTAT(1) .NE. 1) GOTO 900 C C READ REQUESTED BLOCKS FROM 'CENTRAL' AND WRITE TO FILE C DO 180 J=1,NCNT !DO FOR EACH BLOCK CALL RECNTW(LNKLUN,ISTAT,512,DATBUF) !READ DATA IF(ISTAT(1) .NE. 1) GOTO 900 !OK? IF(NREC .GT. RECMAX) GOTO 950 !RECORD NUMBER VALID?? C WRITE(KCWLUN'NREC)DATBUF !WRITE TO FILE NREC=NREC+1 !BUMP RECORD POINTER IF(NREC .LE. IXCEN(2,I))GOTO 180 !WRAP PROBLEM NREC=IXCEN(1,I) IXREM(5,I)=IXCEN(5,I) 180 CONTINUE C C UPDATE INDEX POINTERS FOR THIS SUBFILE C DO 190 J=1,5 IXREM(J,I)=IXCEN(J,I) 190 CONTINUE C WRITE(KCWLUN'1)IDXREM !WRITE INDEX NTOTAL=NTOTAL+NCNT !COUNT TOTAL RECORDS C 200 CONTINUE !END SUBFILE LOOP C IF(NTOTAL .EQ. 0)GOTO 300 !WAIT OR GET MORE DATA?? NTOTAL=0 !CLEAR TOTAL BLOCKS GOTO 100 !TRY AGAIN C C HERE TO WAIT SEC1 SECONDS BEFORE CONTINUING C 300 CONTINUE CALL MARK(32,SEC1,2) !SET COUNTER CALL WAITFR(32) !WAIT C GOTO 100 !ANY NEW DATA??? C C ERRORS C 900 CONTINUE TYPE *, ' KCWREM - *FATAL ERROR* - ISTAT = ',ISTAT GOTO 980 C 920 CONTINUE TYPE *, ' KCWREM - *FATAL ERROR* - BFMT1' GOTO 980 C 950 CONTINUE TYPE *, ' KCWREM - *FATAL ERROR* - INVALID REC NUM ',NREC C 980 CONTINUE CLOSE (UNIT=KCWLUN) !CLOSE KCW.DAT CALL CLSNTW() !CLOSE NETWORK C STOP C END