#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.53 2001/07/20 11:02:45 stelian Exp $";
#endif /* not lint */
#include <config.h>
#include <signal.h>
#include <stdio.h>
#include <compaterr.h>
+#include <system.h>
#ifdef __STDC__
#include <stdlib.h>
#include <string.h>
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
nextblock = slp->tblock;
trecno = 0;
asize += tenths + returned.clen / density;
- csize += returned.clen;
blockswritten += ntrec;
blocksthisvol += ntrec;
if (!pipeout && !unlimited) {
if (blocksperfile) {
- if ( compressed ? csize >= blocksperfile * 1024
+ if ( compressed ? (bytes_written - tapea_bytes + SLAVES * (writesize + sizeof(struct tapebuf))) >= blocksperfile * 1024
: blocksthisvol >= blocksperfile ) {
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;
- }
- } else {
- if (WIFEXITED(status))
- return WEXITSTATUS(status);
- else
- return -1;
- }
- } while(1);
-}
-
time_t
trewind(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
enslave(); /* Share open tape file descriptor with slaves */
asize = 0;
- csize = 0;
blocksthisvol = 0;
if (top)
newtape++; /* new tape signal */
!= 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
* 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;
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;
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) {