X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftape.c;h=2390c860bbdd8b0f14905dd78c69aa150e770581;hb=7422942fcabc3e5735e850fce8113e9751ddd399;hp=54961a9a1b93dc92c7eef4d177b8e5a881be8b80;hpb=401a4d13e4c30d46074531c6c26efefcaf3bbdaf;p=dump.git diff --git a/dump/tape.c b/dump/tape.c index 54961a9..2390c86 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,10 +41,24 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.32 2001/02/22 10:57:40 stelian Exp $"; + "$Id: tape.c,v 1.39 2001/03/23 14:40:12 stelian Exp $"; #endif /* not lint */ #include +#include +#include +#include +#include +#include +#include +#ifdef __STDC__ +#include +#include +#include +#else +int write(), read(); +#endif + #ifdef __linux__ #include #include @@ -56,9 +70,9 @@ static const char rcsid[] = #include #ifdef __linux__ #include +#include #include -#else /* __linux__ */ -#ifdef sunos +#elif defined sunos #include #include @@ -66,29 +80,10 @@ static const char rcsid[] = #else #include #include -#endif #endif /* __linux__ */ #include -#include -#include -#include -#include -#include -#include -#ifdef __STDC__ -#include -#include -#include -#else -int write(), read(); -#endif - -#ifdef __linux__ -#include -#endif - #ifdef HAVE_ZLIB #include #endif /* HAVE_ZLIB */ @@ -258,7 +253,8 @@ tperror(int errnum) quit("Cannot recover\n"); /* NOTREACHED */ } - msg("write error %d blocks into volume %d: %s\n", blocksthisvol, tapeno, strerror(errnum)); + msg("write error %d blocks into volume %d: %s\n", + blocksthisvol, tapeno, strerror(errnum)); broadcast("DUMP WRITE ERROR!\n"); if (query("Do you want to rewrite this volume?")) { msg("Closing this volume. Prepare to restart with new media;\n"); @@ -290,19 +286,10 @@ do_stats(void) time_t tnow, ttaken; int blocks; -#ifdef __linux__ - (void)time4(&tnow); -#else - (void)time(&tnow); -#endif + tnow = time(NULL); ttaken = tnow - tstart_volume; blocks = spcl.c_tapea - tapea_volume; - msg("Volume %d completed at: %s", tapeno, -#ifdef __linux__ - ctime4(&tnow)); -#else - ctime(&tnow)); -#endif + msg("Volume %d completed at: %s", tapeno, ctime(&tnow)); if (! compressed) msg("Volume %d %ld tape blocks (%.2fMB)\n", tapeno, blocks, ((double)blocks * TP_BSIZE / 1048576)); @@ -311,13 +298,13 @@ do_stats(void) long txfrate = volkb / ttaken; msg("Volume %d took %d:%02d:%02d\n", tapeno, ttaken / 3600, (ttaken % 3600) / 60, ttaken % 60); - msg("Volume %d transfer rate: %ld KB/s\n", tapeno, + msg("Volume %d transfer rate: %ld kB/s\n", tapeno, txfrate); xferrate += txfrate; if (compressed) { double rate = .0005 + (double) blocks / (double) volkb; - msg("Volume %d %ldKB uncompressed, %ldKB compressed," - " compression ratio %1.3f\n", + msg("Volume %d %ldKB uncompressed, %ldkB compressed," + " %1.3f:1\n", tapeno, blocks, volkb, rate); } } @@ -361,16 +348,10 @@ mktimeest(time_t tnow) void statussig(int notused) { - time_t tnow; int save_errno = errno; char *buf; -#ifdef __linux__ - (void) time4(&tnow); -#else - (void) time((time_t *) &tnow); -#endif - buf = mktimeest(tnow); + buf = mktimeest(time(NULL)); if (buf) write(STDERR_FILENO, buf, strlen(buf)); errno = save_errno; @@ -410,13 +391,13 @@ flushtape(void) uncomprblks++; slp->sent = 0; - /* Check for errors */ - if (got < 0) - tperror(-got); - - /* Check for end of tape */ - if (got == 0) { - msg("End of tape detected\n"); + /* Check for errors or end of tape */ + if (got <= 0) { + /* Check for errors */ + if (got < 0) + tperror(-got); + else + msg("End of tape detected\n"); /* * Drain the results, don't care what the values were. @@ -774,11 +755,7 @@ startnewtape(int top) parentpid = getpid(); tapea_volume = spcl.c_tapea; tapea_bytes = bytes_written; -#ifdef __linux__ - (void)time4(&tstart_volume); -#else - (void)time((&tstart_volume); -#endif + tstart_volume = time(NULL); restore_check_point: #ifdef __linux__ @@ -908,14 +885,10 @@ restore_check_point: spcl.c_flags |= DR_NEWHEADER; if (compressed) spcl.c_flags |= DR_COMPRESSED; - writeheader((ino_t)slp->inode); + writeheader((dump_ino_t)slp->inode); spcl.c_flags &=~ DR_NEWHEADER; - msg("Volume %d started at: %s", tapeno, -#ifdef __linux__ - ctime4(&tstart_volume)); -#else - ctime(&tstart_volume)); -#endif + msg("Volume %d started with block %ld at: %s", tapeno, + spcl.c_tapea, ctime(&tstart_volume)); if (tapeno > 1) msg("Volume %d begins with blocks from inode %d\n", tapeno, slp->inode); @@ -1066,7 +1039,7 @@ doslave(int cmd, int slave_number) char *buffer; #ifdef HAVE_ZLIB struct tapebuf *comp_buf = NULL; - int compresult, complevel = 6, do_compress = 0; + int compresult, do_compress = 0; unsigned long worklen; #endif /* HAVE_ZLIB */ struct slave_results returns; @@ -1101,6 +1074,7 @@ doslave(int cmd, int slave_number) comp_buf = malloc(sizeof(struct tapebuf) + TP_BSIZE + writesize); if (comp_buf == NULL) quit("couldn't allocate a compress buffer.\n"); + comp_buf->flags = 0; } #endif /* HAVE_ZLIB */ @@ -1122,13 +1096,6 @@ doslave(int cmd, int slave_number) quit("master/slave protocol botched.\n"); } } - if (sigsetjmp(jmpbuf, 1) == 0) { - ready = 1; - if (!caught) - (void) pause(); - } - ready = 0; - caught = 0; /* Try to write the data... */ wrote = 0; @@ -1140,31 +1107,51 @@ doslave(int cmd, int slave_number) #ifdef HAVE_ZLIB /* - * If the data can't be compressed it's written with no - * prefix as writesize bytes. If it's compressible, it's - * written from struct tapebuf with an 8 byte prefix - * followed by the data. This will always be less than + * When writing a compressed dump, each block 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. + * 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. */ - if (do_compress) { /* don't compress the first block */ - comp_buf->clen = comp_buf->unclen = bufsize; + if (compressed) { + comp_buf->length = bufsize; worklen = TP_BSIZE + writesize; - compresult = compress2(comp_buf->buf, &worklen, - (char *)slp->tblock[0], writesize, complevel); + if (do_compress) + compresult = compress2(comp_buf->buf, &worklen, + (char *)slp->tblock[0], writesize, compressed); if (compresult == Z_OK && worklen <= writesize-32) { /* write the compressed buffer */ - comp_buf->clen = worklen; + comp_buf->length = worklen; + comp_buf->compressed = 1; + buffer = (char *) comp_buf; + returns.clen = bufsize = worklen + sizeof(struct tapebuf); + } + else { + /* write the data uncompressed */ + comp_buf->length = writesize; + comp_buf->compressed = 0; buffer = (char *) comp_buf; - returns.clen = bufsize = worklen + 8; + returns.clen = bufsize = writesize + sizeof(struct tapebuf); + returns.unclen = returns.clen; + memcpy(comp_buf->buf, (char *)slp->tblock[0], writesize); } } /* compress the remaining blocks */ do_compress = compressed; #endif /* HAVE_ZLIB */ + if (sigsetjmp(jmpbuf, 1) == 0) { + ready = 1; + if (!caught) + (void) pause(); + } + ready = 0; + caught = 0; + while (eot_count < 10 && size < bufsize) { #ifdef RDUMP if (host)