X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Ftape.c;h=644ed8a2ba92ab6a555598b1c234086f6f34cf4c;hp=3f2ae89a651bedf6f37189240cc2b5ff8352b09f;hb=caea5c768eb239f9b987791f0c665b10d7550741;hpb=86fab47e75fc141db053271654a2570fddcd0f46 diff --git a/dump/tape.c b/dump/tape.c index 3f2ae89..644ed8a 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.46 2001/05/12 11:36:12 stelian Exp $"; + "$Id: tape.c,v 1.56 2001/09/12 09:02:51 stelian Exp $"; #endif /* not lint */ #include @@ -52,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #ifdef __STDC__ #include #include @@ -62,16 +63,22 @@ int write(), read(); #ifdef __linux__ #include +#include #include -#include #endif #include #include -#include #include #include #ifdef __linux__ +#include +#undef atomic_read /* this get wrongly defined in kernel */ + /* headers and we don't want it */ +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #include #elif defined sunos @@ -90,6 +97,10 @@ int write(), read(); #include #endif /* HAVE_ZLIB */ +#ifdef HAVE_BZLIB +#include +#endif /* HAVE_BZLIB */ + #include "dump.h" int writesize; /* size of malloc()ed buffer for tape */ @@ -107,12 +118,11 @@ long long tapea_bytes = 0; /* bytes_written at start of current volume */ static ssize_t atomic_read __P((int, void *, size_t)); static ssize_t atomic_write __P((int, const void *, size_t)); -static void doslave __P((int, int)); +static void doslave __P((int, int, int)); 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 @@ -441,54 +451,20 @@ flushtape(void) asize += tenths + returned.clen / density; 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 ? (bytes_written - tapea_bytes + SLAVES * (writesize + sizeof(struct tapebuf))) >= 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 +524,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) { @@ -586,7 +564,7 @@ close_rewind(void) void rollforward(void) { - register struct req *p, *q, *prev; + register struct req *p, *q = NULL, *prev; register struct slave *tslp; int i, size, savedtapea, got; union u_spcl *ntb, *otb; @@ -993,7 +971,7 @@ enslave(void) != sizeof i) quit("master/slave protocol botched 3\n"); #endif - doslave(cmd[0], i); + doslave(cmd[0], i, (slaves[i].pid == slp->pid)); Exit(X_FINOK); } else @@ -1039,17 +1017,20 @@ killall(void) * slaves. */ static void -doslave(int cmd, int slave_number) +doslave(int cmd, int slave_number, int first) { register int nread; int nextslave, size, eot_count, bufsize; volatile int wrote = 0; char *buffer; -#ifdef HAVE_ZLIB +#if defined(HAVE_ZLIB) || defined(HAVE_BZLIB) struct tapebuf *comp_buf = NULL; - int compresult, do_compress = slave_number > 0; + int compresult, do_compress = !first; unsigned long worklen; -#endif /* HAVE_ZLIB */ +#ifdef HAVE_BZLIB + unsigned int worklen2; +#endif +#endif /* HAVE_ZLIB || HAVE_BZLIB */ struct slave_results returns; #ifdef __linux__ errcode_t retval; @@ -1067,6 +1048,9 @@ doslave(int cmd, int slave_number) if ((diskfd = OPEN(disk, O_RDONLY)) < 0) quit("slave couldn't reopen disk: %s\n", strerror(errno)); #ifdef __linux__ +#ifdef BLKFLSBUF + (void)ioctl(diskfd, BLKFLSBUF); +#endif ext2fs_close(fs); retval = dump_fs_open(disk, &fs); if (retval) @@ -1081,15 +1065,18 @@ doslave(int cmd, int slave_number) quit("master/slave protocol botched - didn't get pid of next slave.\n"); } -#ifdef HAVE_ZLIB +#if defined(HAVE_ZLIB) || defined(HAVE_BZLIB) /* if we're doing a compressed dump, allocate the compress buffer */ if (compressed) { 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; + if (bzipflag) + comp_buf->flags = COMPRESS_BZLIB; + else + comp_buf->flags = COMPRESS_ZLIB; } -#endif /* HAVE_ZLIB */ +#endif /* HAVE_ZLIB || HAVE_BZLIB */ /* * Get list of blocks to dump, read the blocks into tape buffer @@ -1118,7 +1105,7 @@ doslave(int cmd, int slave_number) bufsize = writesize; /* length to write */ returns.clen = returns.unclen = bufsize; -#ifdef HAVE_ZLIB +#if defined(HAVE_ZLIB) || defined(HAVE_BZLIB) /* * When writing a compressed dump, each block except * the first one on each tape is written @@ -1135,9 +1122,38 @@ doslave(int cmd, int slave_number) if (compressed && do_compress) { comp_buf->length = bufsize; worklen = TP_BSIZE + writesize; - compresult = compress2(comp_buf->buf, &worklen, - (char *)slp->tblock[0], writesize, compressed); - if (compresult == Z_OK && worklen <= (writesize - 16)) { +#ifdef HAVE_ZLIB + if (!bzipflag) { + compresult = compress2(comp_buf->buf, + &worklen, + (char *)slp->tblock[0], + writesize, + compressed); + if (compresult == Z_OK) + compresult = 1; + else + compresult = 0; + } +#endif /* HAVE_ZLIB */ +#ifdef HAVE_BZLIB + if (bzipflag) { + worklen2 = worklen; + compresult = BZ2_bzBuffToBuffCompress( + comp_buf->buf, + &worklen2, + (char *)slp->tblock[0], + writesize, + compressed, + 0, 30); + worklen = worklen2; + if (compresult == BZ_OK) + compresult = 1; + else + compresult = 0; + } + +#endif /* HAVE_BZLIB */ + if (compresult && worklen <= (writesize - 16)) { /* write the compressed buffer */ comp_buf->length = worklen; comp_buf->compressed = 1; @@ -1156,7 +1172,7 @@ doslave(int cmd, int slave_number) } /* compress the remaining blocks if we're compressing */ do_compress = compressed; -#endif /* HAVE_ZLIB */ +#endif /* HAVE_ZLIB || HAVE_BZLIB */ if (sigsetjmp(jmpbuf, 1) == 0) { ready = 1; @@ -1171,7 +1187,8 @@ doslave(int cmd, int slave_number) uspclptr = (union u_spcl *)&slp->tblock[0]; spclptr = &uspclptr->s_spcl; if ((spclptr->c_magic == NFS_MAGIC) && - (spclptr->c_type == TS_INODE)) { + (spclptr->c_type == TS_INODE) && + (spclptr->c_date == gThisDumpDate)) { /* if an error occured previously don't * try again */ if (gtperr == 0) {