FATMEN can make copies of a dataset with automatic update of the catalogue. This is available both through the shell and the FORTRAN interface. The shell version provides an interface to the file transfer routines of CSPACK (the same as those used by ZFTP) and hence permits the network transfer of files. The files are transferred from disk to disk. If the local file resides on tape, it is first staged to disk. For reasons of program size this facility is not yet enabled on VM or MVS machines, but just for VMS and Unix systems. An interface to remote tapes is not yet provided.
Both the shell COPY command and the FORTRAN routine FMCOPY permit conversion of data representation and record format during copy. That is, one may copy an input Zebra FZ binary exchange file to an output Zebra FZ native file, or an input file with VBS format to an output file with record format U. The following example shows the use of FMCOPY. This example was written for DELPHI, but similar programs are in use by CPLEAR, L3 and OPAL.
Example of copy data with FMCOPY
***********************************************************************
* PROGRAM DELRCOPY *
* ================ *
* Make copies of all files corresponding to generic names on unit 10 *
* into the robot (SMCF) allocating volumes from pool XX_RAWD *
***********************************************************************
PARAMETER (LURCOR=100000)
COMMON/CRZT/IXSTOR,IXDIV,IFENCE(2),LEV,LEVIN,BLVECT(LURCOR)
DIMENSION LQ(999),IQ(999),Q(999)
EQUIVALENCE (IQ(1),Q(1),LQ(9)),(LQ(1),LEV)
COMMON /USRLNK/LUSRK1,LUSRBK,LUSRLS
COMMON /QUEST/IQUEST(100)
*
* Start of FATMEN sequence FATPARA
*
** *** Data set bank mnemonics
*
* Keys
PARAMETER ( MKSRFA= 1, MKFNFA= 2, MKCLFA=7, MKMTFA=8
1 ,MKLCFA= 9, MKNBFA=10, NKDSFA=10 )
*
** *** Bank offsets
*
PARAMETER ( MFQNFA= 1, MHSNFA= 65, MCPLFA= 67, MMTPFA= 68
1 ,MLOCFA= 69, MHSTFA= 70, MHOSFA= 74
2 ,MVSNFA= 77, MVIDFA= 79, MVIPFA= 81, MDENFA= 82
3 ,MVSQFA= 83, MFSQFA= 84, MSRDFA= 85, MERDFA= 86
4 ,MSBLFA= 87, MEBLFA= 88, MRFMFA= 89, MRLNFA= 90
5 ,MBLNFA= 91, MFLFFA= 92, MFUTFA= 93, MCRTFA= 94
6 ,MCTTFA= 95, MLATFA= 96, MCURFA= 97, MCIDFA= 99
7 ,MCNIFA=101, MCJIFA=103, MFPRFA=105, MSYWFA=106
8 ,MUSWFA=116, MUCMFA=126, NWDSFA=145
9 ,MFSZFA=MSYWFA,MUSCFA=MSYWFA+1)
* End of FATMEN sequence FATPARA
CHARACTER*6 DENS
CHARACTER*8 LIB
CHARACTER*4 LABTYP
CHARACTER*1 MNTTYP
CHARACTER*8 MODEL
CHARACTER*7 ROBMAN(2)
DATA ROBMAN(1)/'-Robot '/,ROBMAN(2)/'-Manual'/
PARAMETER (LKEYFA=10)
PARAMETER (MAXFIL=1000)
DIMENSION KEYS(LKEYFA,MAXFIL)
DIMENSION JSORT(MAXFIL)
DIMENSION KEYSIN(LKEYFA),KEYSOU(LKEYFA,MAXFIL)
CHARACTER*255 FILES(MAXFIL)
CHARACTER THRONG*8, DSN*8, VSN*6, VID*6
CHARACTER*80 TOPDIR,GENAME
CHARACTER*26 CHOPT
*
* Initialise ZEBRA
*
CALL MZEBRA(-3)
CALL MZSTOR(IXSTOR,'/CRZT/','Q',IFENCE,LEV,BLVECT(1),BLVECT(1),
+ BLVECT(5000),BLVECT(LURCOR))
CALL MZLOGL(IXSTOR,-3)
*
* *** Define user division and link area like:
*
CALL MZDIV (IXSTOR, IXDIV, 'USERS', 50000, LURCOR, 'L')
CALL MZLINK (IXSTOR, '/USRLNK/', LUSRK1, LUSRLS, LUSRK1)
*
* Units for FATMEN RZ/FZ files
*
LUNRZ = 1
LUNFZ = 2
*
* Initialise FATMEN
*
CALL FMINIT(IXSTOR,LUNRZ,LUNFZ,'//CERN/DELPHI',IRC)
CALL FMLOGL(1)
IDEBFA = 2
NPROC = 0
10 CONTINUE
CALL TIMEL(T)
IF(T.LT.100) THEN
PRINT *,'Stopping due to time limit'
GOTO 99
ENDIF
READ(10,9001,END=99) GENAME
9001 FORMAT(A80)
* GENAME = FILES(JSORT(I))
LGN = LENOCC(GENAME)
PRINT *,'Processing ',GENAME(1:LGN)
IROBOT = 0
*
* First, check that a robot copy does not already exist
*
CALL VBLANK(KEYSIN(2),5)
LFN = INDEXB(GENAME(1:LGN),'/') + 1
*
* Don't compare copy level or location code
*
KEYSIN(MKCLFA) = -1
KEYSIN(MKLCFA) = -1
*
* Restrict search to 3480s
*
KEYSIN(MKMTFA) = 2
CALL FMSELK(GENAME(1:LGN),KEYSIN,KEYSOU,NMATCH,MAXFIL,IRC)
IF(IRC.NE.0) THEN
PRINT *,'Return code ',IRC,' from FMSELK'
PRINT *,'Skipping ',GENAME(1:LGN)
GOTO 10
ENDIF
IF(IDEBFA.GE.2)
+PRINT *,'Found ',nmatch,' matches for media type 2'
DO 30 J=1,NMATCH
CALL FMQVOL(GENAME(1:LGN),LBANKR,KEYSOU(1,J),
+ LIB,MODEL,DENS,MNTTYP,LABTYP,IC)
IF(INDEX(LIB,'*Unknown') .NE.0) THEN
IF(IDEBFA.GE.0) PRINT *,'Cannot determine mount type'
ENDIF
IF(MNTTYP.EQ.'R') THEN
IF(IDEBFA.GE.0) PRINT *,'Robot copy already exists'
IROBOT = 1
ENDIF
30 CONTINUE
IF(IROBOT.EQ.0) THEN
PRINT *,'Robot copy does not exist for ',GENAME(1:LGN)
*
* Now make a robot copy
* First, allocate a new tape
*
CALL FMALLO('3480','38K',' ','SMCF_1','XX_RAWD',
+ LBANKR,' ',VSN,VID,IRC)
IF(IRC.NE.0) THEN
PRINT *,'Cannot allocate new tape - STOP!'
GOTO 99
ENDIF
*
* Display the bank
*
CALL FMSHOW(GENAME(1:LGN),LBANKR,KEYSOU(1,J),'A',IRC)
LZERO = 0
CALL VZERO(KEYSIN,10)
*
* and make the copy
*
CALL FMLOGL(3)
CALL FMCOPY(GENAME(1:LGN),LZERO,KEYSIN,
+ GENAME(1:LGN),LBANKR,KEYSOU(1,J),' ',IRC)
IF(IRC.NE.0) THEN
PRINT *,'Error from FMCOPY - STOP!'
GOTO 99
ENDIF
CALL MZDROP(IXSTOR,LBANKR,' ')
CALL MZDROP(IXSTOR,LZERO,' ')
NPROC = NPROC + 1
ENDIF
GOTO 10
99 CONTINUE
PRINT *,'Made ',NPROC,' copies, ',T,' seconds left'
*
* Terminate cleanly
*
CALL FMEND(IRC)
END