GEMAR-XFS-Driver - Restore via Desktop (c) Steffen Engel '93-'94 Version 1.10 of 05.03.94 MiNT can be seen as a standard for everone, since MultiTOS is released. Because of this it is very interesting to use a driver for installing a Streamer-Tape as a logical drive. For this there is GEMAR.XFS On the first hand side, a tape with a backup of GEMAR can be installed as a drive for restoring files, on the other hand side there is a device driver in GEMAR.XFS wich allows to access the tape as sequential device by any program (e.g. TAR or CPIO). Volume of Delivery: The driver can be registered by registered GEMAR-Users only and the fee is $ 25 Registration is done with the program REG_XFS.PRG (only on registration disks) ASSUMPTIONS You need a streamer, of course and MiNT or MultiTOS. For use of the XFS-Part of GEMAR.XFS the streamer MUST be able to space backwards. Nowadays all streamers are able to space backwards, but some older drives sometimes do not have this capability (e.g. Tandberg TDC 3620 with Firmware 3.0) INSTALLATION Copy GEMAR.XFS to your MINT/MULTITOS-Folder (C:\MINT\ OR C:\MULTITIOS) Copy the file GEMARXFS.PAR in one of the folders C:\MINT\, C:\MULTITOS\, C:\SYS\ or C:\ as you want. Adjust the file GEMARXFS.PAR to your requirements (see 'PARAMERTERS'). Copy TAPE.TTP to a folder, where it can be found by yout shell. Copy GEMARCNF.CPX into your CPX-Folder. On the next boot with MiNT/MultiTOS the driver will be installed. USE OF XFS The installing of a GEMAR-Backup as a logical drive can be initated with TAPE.TTP or the CPX. For use of TAPE.TTP please refer to the manual-page of TAPE A Backup of GEMAR will be installed by selecting the button 'XFS laden' (sorry, an english Version of the CPX is not available yet). After reading the index from tape the files can be accessed in the drive given in the parameterfile. From this drive you can copy files, start programs and everything else you can do with a hard drive partition. It's not possible to write files to this drive. ***************************** ATTENTION!! ********************************** Never remove the tape without unloading the tape with the CPX or TAPE.TTP before. USING THE DEVICE Load the tape with TAPE.TTP or with the CPX with the button 'DEV laden'. After this EVERY program can access the tape as 'u:\dev\mt' Please pay attention to the restriction, that it is not possible to write and read data in mixed order. This is not possible due to restrictions of SCSI-Streamers. You either write from start of tape (erasing all data on the tape) or you have to wind to end of tape before writing to append data to the tape. By this way it is possible to exchange data with almost every operating system (OS/9, Unix, Minix, Linux...) by using TAR or CPIO for reading and writing the tapes. Examples tar -c u:\dev\mt c:\ save all files of drive C: to the tape tar -t u:\dev\mt show contents of the tape You cann use CPIO, too or you can save a file from an editor as u:\dev\mt to write it to the tape. ***************************** ATTENTION!! ********************************** Never remove the tape without unloading the tape with the CPX or TAPE.TTP before. PARAMETERS The parameterfile contains all information for accessing the streamer and installing the driver. -DEVICE = drv The drive the XFS will be installed in -XFSNAME = name With newer Versions of MiNT (>= 1.08) the XFS can be installed in drive U:\ with a given name. If MiNT >= 1.08 is active and this parameter is given, the drive will be installed with this name. The folder is only accessible in U:\ when an XFS ist loaded. ATTENTION: please read the information in RESTRICTIONS! -BUFFER = num Size in kByte of the buffer used for buffering of accesses to the tape. The buffering of reading from u:\dev\mt (using the driver) can be switched off by the parameter BUFFERED, all other buffering can not be switched off. -BUFFERED = ON Buffering the reads from u:\dev\mt. Buffering is off on default, but can be switched on with TAPE.TTP at any time. -PREMSGTIME = num -POSTMSGTIME = num The parameters 'Wait before SCSI' and 'Wait after SCSI' as known from GEMAR. -DATATIMEOUT = num -LOADTIME = num -REWINDTIME = num -SPACETIME = num The parameters 'Data-Timeout', 'Load-Timeout', 'Rewind-Timeout' and 'Space-Timeout' as known from GEMAR. -BLOCKSIZE = num Blocksize of the streamer. -UNIT = DMA|ALIA|TT|FALCON The port, the streamer is connected to. -TARGET = num Target of the streamer, if connected to the DMA-Port. -SCSIID = num The SCSI-Id of the Streamers if the streamer ist connected to TT|FALCON|ALIA -QFA = NONE|SEEK|LOCATE Capabilities of Quick-File-Access of the streamer. -CMD = LOAD|UNIT_READY|MODE_SELECT|PREVENT_REMOVAL Commands to be used for the streamer. Please use the same Commands as in GEMAR. If you want to use more than one command the line can be used multiple e.g. CMD = LOAD CMD = MODE_SELECT CMD = PREVENT_REMOVAL -KEYFILE = path\name Path an name of GEMAR's Keyfile on you Harddisk. This file is used to check the primary index for valid. RESTRICTIONS The unregistered version is locked after accessing 15 files in XFS-mode (Fopen 15 times). The next access will be rejected by EACCDN. It is not possible to modify data on streamers or write files to the streamer due to the nature of streamers. Streamers not reporting BLANK CHECK, VADD and the missing blocks on Request sense may lead to problems on buffered reading of u:\dev\mt. By the time only the first Backup on a tape can be accessed vir the XFS. Coded Backups (Passowrd) can't be used. Tapes written by GEMAR < 2.0 can't be read. GEMINI 1.21 can't start programs from tape. The reason is unknown. In MiNT 1.08 there are two errors with the use of XFS-drivers not loacted on harddrive. Due to these errors you have to use MiNT 1.04 or fix the errors in MiNT 1.08: **************************************************************************** MiNT 1.08: Correct FILESYS.C: procedure disk_changed: *************************** FILESYS.C ******************************* TRACE(("calling mediach(%d)",d)); r = (int)mediach(d); TRACE(("mediach(%d) == %d", d, r)); if (r < 0) return r; if (r == 1) { /* drive _may_ have changed */ r = rwabs(0, tmpbuf, 1, 0, d, 0L); /* check the BIOS */ if (r != E_CHNG) { /* nope, no change */ TRACE(("rwabs returned %d", r)); return (r < 0) ? r : 0; } r = 2; /* drive was definitely changed */ } ********************************************************************* The problem is: -mediach calls the hard disk driver for via hdvmediach. The driver does not know about this drive and says EUNDEV so disk_changed reports an error. So make this little change: ************************* FILESYS.C ********************************* TRACE(("calling mediach(%d)",d)); r = (int)mediach(d); TRACE(("mediach(%d) == %d", d, r)); /* r = EUNDEV: * maybe the drive is not based on Harddisk, so the HDdriver says * EUNDEV. * Ask the Filesystem for Mediachange. * SE 16.08.93 */ if (r == EUNDEV) { TRACE(("request XFS for media change")); fs = drives[d]; /* get filesystem associated with drive */ if (fs) if ((*fs->dskchng)(d)) { /* does the fs agree that it changed? */ drives[d] = 0; changedrv(d); /* yes -- do the change */ return 1; } else return 0; } if (r < 0) return r; ********************************************************************* *************************************************************************** FS_UNMOUNT can't work, because in uni_fscntl in UNIFS.C the Filecookie does not point to a UNIFILE-structure. UNIFS.C procedure uni_fscntl: ******************************************************************** } else if (cmd == FS_UNMOUNT) { /* remove a file system's directory */ struct fs_descr *d = (struct fs_descr*)arg; FILESYS *fs; UNIFILE *u; /* first check that directory exists */ r = uni_lookup(dir, name, &fc); if (r != 0) return EFILNF; /* name does not exist */ if (!d) return EFILNF; if (!d->file_system) return EFILNF; if (d->file_system != fc.fs) return EFILNF; /* not the right name! */ /* fc->index does not point to a UNIFILE struct, as i can see * in uni_lookup. * So I'll get u via search of u_root. * With this modification FS_UNMOUNT works fine with my XFS. * SE 30.08.93 */ for (u = u_root; u && u->fs != d->file_system; u = u->next) { } /* u = (UNIFILE*)fc.index; Korrigiert: SE 30.08.93 */ #endif *************************************************************************** Any mistakes, bad grammar and formulations by: Steffen Engel, 05.03.94