X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Ftape.c;h=f846221b502578587e38ea5f508735ca24514bc5;hp=38dd80426f4a798dd3880c70f917e441834f07d6;hb=e4a8bde40a6d8319d1b28e054e1a419ba3df2363;hpb=700b236e8f7d2d64fe86cb231f041f151a0fe02c diff --git a/dump/tape.c b/dump/tape.c index 38dd804..f846221 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,10 +41,11 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.42 2001/04/12 13:14:15 stelian Exp $"; + "$Id: tape.c,v 1.47 2001/06/18 10:58:28 stelian Exp $"; #endif /* not lint */ #include +#include #include #include #include @@ -62,7 +63,6 @@ int write(), read(); #ifdef __linux__ #include #include -#include #endif #include #include @@ -70,7 +70,11 @@ int write(), read(); #include #include #ifdef __linux__ +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #include #elif defined sunos @@ -547,7 +551,7 @@ trewind(void) #endif { (void) close(tapefd); - while ((f = open(tape, 0)) < 0) + while ((f = OPEN(tape, 0)) < 0) sleep (10); (void) close(f); } @@ -861,10 +865,10 @@ restore_check_point: #ifdef RDUMP while ((tapefd = (host ? rmtopen(tape, 2) : pipeout ? fileno(stdout) : - open(tape, O_WRONLY|O_CREAT, 0666))) < 0) + OPEN(tape, O_WRONLY|O_CREAT, 0666))) < 0) #else while ((tapefd = (pipeout ? fileno(stdout) : - open(tape, O_RDWR|O_CREAT, 0666))) < 0) + OPEN(tape, O_RDWR|O_CREAT, 0666))) < 0) #endif { msg("Cannot open output \"%s\".\n", tape); @@ -887,6 +891,7 @@ restore_check_point: spcl.c_volume++; spcl.c_type = TS_TAPE; spcl.c_flags |= DR_NEWHEADER; + spcl.c_ntrec = ntrec; if (compressed) spcl.c_flags |= DR_COMPRESSED; writeheader((dump_ino_t)slp->inode); @@ -1045,7 +1050,7 @@ doslave(int cmd, int slave_number) char *buffer; #ifdef HAVE_ZLIB struct tapebuf *comp_buf = NULL; - int compresult, do_compress = 0; + int compresult, do_compress = slave_number > 0; unsigned long worklen; #endif /* HAVE_ZLIB */ struct slave_results returns; @@ -1056,13 +1061,13 @@ doslave(int cmd, int slave_number) long curtapepos; union u_spcl *uspclptr; struct s_spcl *spclptr; -#endif /* USA_QFA */ +#endif /* USE_QFA */ /* * Need our own seek pointer. */ (void) close(diskfd); - if ((diskfd = open(disk, O_RDONLY)) < 0) + if ((diskfd = OPEN(disk, O_RDONLY)) < 0) quit("slave couldn't reopen disk: %s\n", strerror(errno)); #ifdef __linux__ ext2fs_close(fs); @@ -1108,29 +1113,6 @@ doslave(int cmd, int slave_number) } } -#ifdef USE_QFA - if (gTapeposfd >= 0) { - uspclptr = (union u_spcl *)&slp->tblock[0]; - spclptr = &uspclptr->s_spcl; - if ((spclptr->c_magic == NFS_MAGIC) && - (spclptr->c_type == TS_INODE)) { - /* if an error occured previously don't - * try again */ - if (gtperr == 0) { - if ((gtperr = GetTapePos(&curtapepos)) == 0) { -#ifdef DEBUG_QFA - msg("inode %ld at tapepos %ld\n", spclptr->c_inumber, curtapepos); -#endif - sprintf(gTps, "%ld\t%d\t%ld\n", (unsigned long)spclptr->c_inumber, tapeno, curtapepos); - if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps)) { - quit("error writing tapepos file.\n"); - } - } - } - } - } -#endif /* USE_QFA */ - /* Try to write the data... */ wrote = 0; eot_count = 0; @@ -1141,23 +1123,24 @@ doslave(int cmd, int slave_number) #ifdef HAVE_ZLIB /* - * When writing a compressed dump, each block is - * written from struct tapebuf with an 4 byte prefix + * When writing a compressed dump, each block except + * the first one on each tape is written + * from struct tapebuf with an 4 byte prefix * followed by the data. This can be less than * writesize. Restore, on a short read, can compare the * length read to the compressed length in the header * to verify that the read was good. Blocks which don't * compress well are written uncompressed. - * The first block written by each slave is not compressed. + * The first block written by each slave is not compressed + * and does not have a prefix. */ - if (compressed) { + if (compressed && do_compress) { comp_buf->length = bufsize; worklen = TP_BSIZE + writesize; - if (do_compress) - compresult = compress2(comp_buf->buf, &worklen, - (char *)slp->tblock[0], writesize, compressed); - if (compresult == Z_OK && worklen <= writesize-32) { + compresult = compress2(comp_buf->buf, &worklen, + (char *)slp->tblock[0], writesize, compressed); + if (compresult == Z_OK && worklen <= (writesize - 16)) { /* write the compressed buffer */ comp_buf->length = worklen; comp_buf->compressed = 1; @@ -1174,7 +1157,7 @@ doslave(int cmd, int slave_number) memcpy(comp_buf->buf, (char *)slp->tblock[0], writesize); } } - /* compress the remaining blocks */ + /* compress the remaining blocks if we're compressing */ do_compress = compressed; #endif /* HAVE_ZLIB */ @@ -1186,6 +1169,29 @@ doslave(int cmd, int slave_number) ready = 0; caught = 0; +#ifdef USE_QFA + if (gTapeposfd >= 0) { + uspclptr = (union u_spcl *)&slp->tblock[0]; + spclptr = &uspclptr->s_spcl; + if ((spclptr->c_magic == NFS_MAGIC) && + (spclptr->c_type == TS_INODE)) { + /* if an error occured previously don't + * try again */ + if (gtperr == 0) { + if ((gtperr = GetTapePos(&curtapepos)) == 0) { +#ifdef DEBUG_QFA + msg("inode %ld at tapepos %ld\n", spclptr->c_inumber, curtapepos); +#endif + sprintf(gTps, "%ld\t%d\t%ld\n", (unsigned long)spclptr->c_inumber, tapeno, curtapepos); + if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps)) { + warn("error writing tapepos file.\n"); + } + } + } + } + } +#endif /* USE_QFA */ + while (eot_count < 10 && size < bufsize) { #ifdef RDUMP if (host)