X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftape.c;h=5666b39329d2e774ae52ee64e9c40eeec40f1a85;hb=c534413c6ada5778ccbb76f36bdcff672037d0cc;hp=1464812010f5f3f74ebe043796651115d05ed69c;hpb=95c74f382492999827000f544fcb6844150cda81;p=dump.git diff --git a/dump/tape.c b/dump/tape.c index 1464812..5666b39 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.45 2001/04/27 15:22:47 stelian Exp $"; + "$Id: tape.c,v 1.50 2001/07/18 12:54:06 stelian Exp $"; #endif /* not lint */ #include @@ -52,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #ifdef __STDC__ #include #include @@ -62,8 +63,8 @@ int write(), read(); #ifdef __linux__ #include +#include #include -#include #endif #include #include @@ -71,7 +72,11 @@ int write(), read(); #include #include #ifdef __linux__ +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #include #elif defined sunos @@ -112,7 +117,6 @@ static void enslave __P((void)); static void flushtape __P((void)); static void killall __P((void)); static void rollforward __P((void)); -static int system_command __P((const char *, const char *, int)); /* * Concurrent dump mods (Caltech) - disk block reading and tape writing @@ -439,56 +443,23 @@ flushtape(void) nextblock = slp->tblock; trecno = 0; asize += tenths + returned.clen / density; + csize += returned.clen; blockswritten += ntrec; blocksthisvol += ntrec; - if (!pipeout && !unlimited && (blocksperfile ? - (blocksthisvol >= blocksperfile) : (asize > tsize))) { - close_rewind(); - startnewtape(0); - } - timeest(); -} - -/* - * Executes the command in a shell. - * Returns -1 if an error occured, the exit status of - * the command on success. - */ -int system_command(const char *command, const char *device, int volnum) { - int pid, status; - char commandstr[4096]; - - pid = fork(); - if (pid == -1) { - perror(" DUMP: unable to fork"); - return -1; - } - if (pid == 0) { - setuid(getuid()); - setgid(getgid()); -#if OLD_STYLE_FSCRIPT - snprintf(commandstr, sizeof(commandstr), "%s", command); -#else - snprintf(commandstr, sizeof(commandstr), "%s %s %d", command, device, volnum); -#endif - commandstr[sizeof(commandstr) - 1] = '\0'; - execl("/bin/sh", "sh", "-c", commandstr, NULL); - perror(" DUMP: unable to execute shell"); - exit(-1); - } - do { - if (waitpid(pid, &status, 0) == -1) { - if (errno != EINTR) { - perror(" DUMP: waitpid error"); - return -1; + if (!pipeout && !unlimited) { + if (blocksperfile) { + if ( compressed ? csize >= blocksperfile * 1024 + : blocksthisvol >= blocksperfile ) { + close_rewind(); + startnewtape(0); } - } else { - if (WIFEXITED(status)) - return WEXITSTATUS(status); - else - return -1; } - } while(1); + else if (asize > tsize) { + close_rewind(); + startnewtape(0); + } + } + timeest(); } time_t @@ -548,9 +519,11 @@ trewind(void) #endif { (void) close(tapefd); - while ((f = OPEN(tape, 0)) < 0) - sleep (10); - (void) close(f); + if (!fifoout) { + while ((f = OPEN(tape, 0)) < 0) + sleep (10); + (void) close(f); + } } eot_code = 1; if (eot_script && spcl.c_type != TS_END) { @@ -720,6 +693,7 @@ rollforward(void) slp->count = lastspclrec + blks + 1 - spcl.c_tapea; slp->inode = curino; asize += tenths + returned.clen / density; + csize += returned.clen; blockswritten += ntrec; blocksthisvol += ntrec; #endif @@ -876,6 +850,7 @@ restore_check_point: enslave(); /* Share open tape file descriptor with slaves */ asize = 0; + csize = 0; blocksthisvol = 0; if (top) newtape++; /* new tape signal */ @@ -888,6 +863,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); @@ -1046,7 +1022,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; @@ -1119,24 +1095,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; - compresult = Z_DATA_ERROR; - 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; @@ -1153,7 +1129,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 */