X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Ftape.c;h=f048a78bb6f7fc1b4f7787ad5ce9bf872d8fbbec;hp=984fe07fdde4e80965c1e8321571119cb6419a01;hb=e79790783b6826af94196b1ecb74358a675460ed;hpb=e7850aac218f2c009303b0a65903c54157139d0c diff --git a/dump/tape.c b/dump/tape.c index 984fe07..f048a78 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.49 2001/07/18 09:50:48 stelian Exp $"; + "$Id: tape.c,v 1.52 2001/07/20 09:01:46 stelian Exp $"; #endif /* not lint */ #include @@ -52,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #ifdef __STDC__ #include #include @@ -111,12 +112,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 @@ -448,7 +448,7 @@ flushtape(void) blocksthisvol += ntrec; if (!pipeout && !unlimited) { if (blocksperfile) { - if ( compressed ? csize >= blocksperfile * 1024 + if ( compressed ? csize + writesize >= blocksperfile * 1024 : blocksthisvol >= blocksperfile ) { close_rewind(); startnewtape(0); @@ -462,48 +462,6 @@ flushtape(void) 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; - } - } else { - if (WIFEXITED(status)) - return WEXITSTATUS(status); - else - return -1; - } - } while(1); -} - time_t trewind(void) { @@ -1010,7 +968,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 @@ -1056,7 +1014,7 @@ 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; @@ -1064,7 +1022,7 @@ doslave(int cmd, int slave_number) char *buffer; #ifdef HAVE_ZLIB struct tapebuf *comp_buf = NULL; - int compresult, do_compress = slave_number > 0; + int compresult, do_compress = !first; unsigned long worklen; #endif /* HAVE_ZLIB */ struct slave_results returns; @@ -1188,7 +1146,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) {