X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Ftape.c;h=125b15884074869ed1d7b4b4adcf0c58bfcf18f0;hp=df8676362d65c5bbab59772eb0c0c77bcbef02ee;hb=35952b8fbb9df4f18fe7c470dc62ed318d4ce695;hpb=103122b3455278bdf377ce24821168be90238fda diff --git a/dump/tape.c b/dump/tape.c index df86763..125b158 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.60 2002/01/22 11:12:28 stelian Exp $"; + "$Id: tape.c,v 1.63 2002/02/21 09:25:31 stelian Exp $"; #endif /* not lint */ #include @@ -80,6 +80,7 @@ int write(), read(); #include #endif #include +#include #include #elif defined sunos #include @@ -110,7 +111,6 @@ extern long blocksperfile; /* number of blocks per output file */ long blocksthisvol; /* number of blocks on current output file */ extern int ntrec; /* blocking factor on tape */ extern int cartridge; -extern char *host; char *nexttape; extern pid_t rshpid; int eot_code = 1; @@ -125,8 +125,8 @@ static void flushtape __P((void)); static void killall __P((void)); static void rollforward __P((void)); #ifdef USE_QFA -static int GetTapePos __P((long *)); -static void MkTapeString __P((struct s_spcl *, long)); +static int GetTapePos __P((long long *)); +static void MkTapeString __P((struct s_spcl *, long long)); #endif /* @@ -234,6 +234,30 @@ writerec(const void *dp, int isspcl) slp->req[trecno].count = 1; /* XXX post increment triggers an egcs-1.1.2-12 bug on alpha/sparc */ *(union u_spcl *)(*(nextblock)) = *(union u_spcl *)dp; + + /* Need to write it to the archive file */ + if (Afile < 0 && isspcl && (spcl.c_type == TS_END)) + Afile = -Afile; + if (Afile > 0) { + /* When we dump an inode which is not a directory, + * it means we ended the archive contents */ + if (isspcl && (spcl.c_type == TS_INODE) && + ((spcl.c_dinode.di_mode & S_IFMT) != IFDIR)) + Afile = -Afile; + else { + union u_spcl tmp; + tmp = *(union u_spcl *)dp; + /* Write the record, _uncompressed_ */ + if (isspcl) { + tmp.s_spcl.c_flags &= ~DR_COMPRESSED; + mkchecksum(&tmp); + } + if (write(Afile, &tmp, TP_BSIZE) != TP_BSIZE) + msg("error writing archive file: %s\n", + strerror(errno)); + } + } + nextblock++; if (isspcl) lastspclrec = spcl.c_tapea; @@ -569,8 +593,8 @@ close_rewind(void) void rollforward(void) { - register struct req *p, *q = NULL, *prev; - register struct slave *tslp; + struct req *p, *q = NULL, *prev; + struct slave *tslp; int i, size, savedtapea, got; union u_spcl *ntb, *otb; struct slave_results returned; @@ -892,6 +916,8 @@ restore_check_point: if (tapeno > 1) msg("Volume %d begins with blocks from inode %d\n", tapeno, slp->inode); + if (tapeno < TP_NINOS) + volinfo[tapeno] = slp->inode; } } @@ -940,7 +966,7 @@ enslave(void) #ifdef LINUX_FORK_BUG int i, j; #else - register int i, j; + int i, j; #endif master = getpid(); @@ -1016,7 +1042,7 @@ enslave(void) void killall(void) { - register int i; + int i; for (i = 0; i < SLAVES; i++) if (slaves[i].pid > 0) { @@ -1035,7 +1061,7 @@ killall(void) static void doslave(int cmd, int slave_number, int first) { - register int nread; + int nread; int nextslave, size, eot_count, bufsize; volatile int wrote = 0; char *buffer; @@ -1052,7 +1078,7 @@ doslave(int cmd, int slave_number, int first) errcode_t retval; #endif #ifdef USE_QFA - long curtapepos; + long long curtapepos; union u_spcl *uspclptr; struct s_spcl *spclptr; #endif /* USE_QFA */ @@ -1104,7 +1130,7 @@ doslave(int cmd, int slave_number, int first) * Get list of blocks to dump, read the blocks into tape buffer */ while ((nread = atomic_read( cmd, (char *)slp->req, reqsiz)) == reqsiz) { - register struct req *p = slp->req; + struct req *p = slp->req; for (trecno = 0; trecno < ntrec; trecno += p->count, p += p->count) { @@ -1213,6 +1239,7 @@ doslave(int cmd, int slave_number, int first) spclptr = &uspclptr->s_spcl; if ((spclptr->c_magic == NFS_MAGIC) && (spclptr->c_type == TS_INODE) && + ((spclptr->c_dinode.di_mode & S_IFMT) != IFDIR) && (spclptr->c_date == gThisDumpDate)) { /* if an error occured previously don't * try again */ @@ -1320,21 +1347,32 @@ atomic_write(int fd, const void *buf, size_t count) * read the current tape position */ static int -GetTapePos(long *pos) +GetTapePos(long long *pos) { int err = 0; +#ifdef RDUMP + if (host) { + *pos = (long long) rmtseek(0, SEEK_CUR); + err = *pos < 0; + } + else +#endif + { if (magtapeout) { + long mtpos; *pos = 0; - err = (ioctl(tapefd, MTIOCPOS, pos) < 0); + err = (ioctl(tapefd, MTIOCPOS, &mtpos) < 0); + *pos = (long long)mtpos; } else { - *pos = lseek(tapefd, 0, SEEK_CUR); + *pos = LSEEK(tapefd, 0, SEEK_CUR); err = (*pos < 0); } + } if (err) { err = errno; - msg("[%ld] error: %d (getting tapepos: %ld)\n", getpid(), + msg("[%ld] error: %d (getting tapepos: %lld)\n", getpid(), err, *pos); return err; } @@ -1342,13 +1380,13 @@ GetTapePos(long *pos) } static void -MkTapeString(struct s_spcl *spclptr, long curtapepos) { +MkTapeString(struct s_spcl *spclptr, long long curtapepos) { #ifdef DEBUG_QFA - msg("inode %ld at tapepos %ld\n", spclptr->c_inumber, curtapepos); + msg("inode %ld at tapepos %lld\n", spclptr->c_inumber, curtapepos); #endif - snprintf(gTps, sizeof(gTps), "%ld\t%d\t%ld\n", + snprintf(gTps, sizeof(gTps), "%ld\t%d\t%lld\n", (unsigned long)spclptr->c_inumber, tapeno, curtapepos);