#ifndef lint
static const char rcsid[] =
- "$Id: tape.c,v 1.39 2001/05/26 11:04:46 stelian Exp $";
+ "$Id: tape.c,v 1.45 2001/07/20 09:01:46 stelian Exp $";
#endif /* not lint */
#include <config.h>
#include <compatlfs.h>
#include <errno.h>
#include <compaterr.h>
+#include <system.h>
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __linux__
#include <sys/time.h>
#include <time.h>
+#ifdef HAVE_EXT2FS_EXT2_FS_H
+#include <ext2fs/ext2_fs.h>
+#else
#include <linux/ext2_fs.h>
+#endif
#include <ext2fs/ext2fs.h>
#include <bsdcompat.h>
#else /* __linux__ */
void
setup(void)
{
- int i, j, *ip;
+ int i, j, *ip, bot_code;
struct STAT stbuf;
Vprintf(stdout, "Verify tape and initialize maps\n");
+ if (bot_script) {
+ msg("Launching %s\n", bot_script);
+ bot_code = system_command(bot_script, magtape, 1);
+ if (bot_code != 0 && bot_code != 1) {
+ msg("Restore aborted by the beginning of tape script\n");
+ exit(1);
+ }
+ }
#ifdef RRESTORE
if (host)
mt = rmtopen(magtape, 0);
void
getvol(long nextvol)
{
- long newvol = 0, savecnt = 0, wantnext = 0, i;
+ long newvol = 0, wantnext = 0, i;
+ long saved_blksread = 0, saved_tpblksread = 0;
union u_spcl tmpspcl;
# define tmpbuf tmpspcl.s_spcl
char buf[TP_BSIZE];
- int haderror = 0;
+ int haderror = 0, bot_code = 1;
if (nextvol == 1) {
tapesread = 0;
return;
goto gethdr;
}
- savecnt = blksread;
+ saved_blksread = blksread;
+ saved_tpblksread = tpblksread;
again:
if (pipein)
exit(1); /* pipes do not get a second chance */
snprintf(magtape, MAXPATHLEN, "%s%03ld", magtapeprefix, newvol);
magtape[MAXPATHLEN - 1] = '\0';
}
- if (!Mflag || haderror) {
+ if (bot_script && !haderror) {
+ msg("Launching %s\n", bot_script);
+ bot_code = system_command(bot_script, magtape, newvol);
+ if (bot_code != 0 && bot_code != 1) {
+ msg("Restore aborted by the beginning of tape script\n");
+ exit(1);
+ }
+ }
+ if (haderror || (bot_code && !Mflag)) {
haderror = 0;
fprintf(stderr, "Mount tape volume %ld\n", (long)newvol);
fprintf(stderr, "Enter ``none'' if there are no more tapes\n");
return;
}
if (buf[0] != '\n') {
+ char *pos;
(void) strncpy(magtape, buf, sizeof(magtape));
magtape[sizeof(magtape) - 1] = '\0';
+ if ((pos = strchr(magtape, '\n')))
+ magtape[pos - magtape] = '\0';
}
}
#ifdef RRESTORE
volno = newvol;
setdumpnum();
FLUSHTAPEBUF();
+ findtapeblksize();
if (gethead(&tmpbuf) == FAIL) {
Dprintf(stdout, "header read failed at %ld blocks\n", (long)blksread);
fprintf(stderr, "tape is not dump tape\n");
volno = 0;
haderror = 1;
+ blksread = saved_blksread;
+ tpblksread = saved_tpblksread;
goto again;
}
if (tmpbuf.c_volume != volno) {
fprintf(stderr, "Wrong volume (%d)\n", tmpbuf.c_volume);
volno = 0;
haderror = 1;
+ blksread = saved_blksread;
+ tpblksread = saved_tpblksread;
goto again;
}
if (tmpbuf.c_date != dumpdate || tmpbuf.c_ddate != dumptime) {
fprintf(stderr, "\twanted: %s", ctime(&dumpdate));
volno = 0;
haderror = 1;
+ blksread = saved_blksread;
+ tpblksread = saved_tpblksread;
goto again;
}
tapesread |= 1 << volno;
- blksread = savecnt;
+ blksread = saved_blksread;
+ tpblksread = saved_tpblksread;
/*
* If continuing from the previous volume, skip over any
* blocks read already at the end of the previous volume.