X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftape.c;h=a9e3c52bc2cab2e47d9b7b189137f16f5def2703;hb=dbb649e870428cffea2583ed34233d0239b80992;hp=66fc821cdaaab154898d8eb21f64233b47e935a9;hpb=e51470bfc05d83f82c37d24504220c7163bbd4c1;p=dump.git diff --git a/dump/tape.c b/dump/tape.c index 66fc821..a9e3c52 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.61 2002/01/25 14:59:53 stelian Exp $"; + "$Id: tape.c,v 1.72 2003/01/10 10:52:48 stelian Exp $"; #endif /* not lint */ #include @@ -71,9 +71,6 @@ int write(), read(); #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 @@ -117,9 +114,13 @@ int eot_code = 1; long long tapea_bytes = 0; /* bytes_written at start of current volume */ static int magtapeout; /* output is really a tape */ -static ssize_t atomic_read __P((int, void *, size_t)); -static ssize_t atomic_write __P((int, const void *, size_t)); +static ssize_t dump_atomic_read __P((int, void *, size_t)); +static ssize_t dump_atomic_write __P((int, const void *, size_t)); +#ifdef WRITEDEBUG static void doslave __P((int, int, int)); +#else +static void doslave __P((int, int)); +#endif static void enslave __P((void)); static void flushtape __P((void)); static void killall __P((void)); @@ -314,7 +315,7 @@ tperror(int errnum) } static void -sigpipe(int signo) +sigpipe(UNUSED(int signo)) { quit("Broken pipe\n"); @@ -335,7 +336,7 @@ do_stats(void) blocks = spcl.c_tapea - tapea_volume; msg("Volume %d completed at: %s", tapeno, ctime(&tnow)); if (! compressed) - msg("Volume %d %ld tape blocks (%.2fMB)\n", tapeno, + msg("Volume %d %ld blocks (%.2fMB)\n", tapeno, blocks, ((double)blocks * TP_BSIZE / 1048576)); if (ttaken > 0) { long volkb = (bytes_written - tapea_bytes) / 1024; @@ -413,7 +414,7 @@ flushtape(void) slp->req[trecno].count = 0; /* Sentinel */ - if (atomic_write( slp->fd, (char *)slp->req, siz) != siz) + if (dump_atomic_write( slp->fd, (char *)slp->req, siz) != siz) quit("error writing command pipe: %s\n", strerror(errno)); slp->sent = 1; /* we sent a request, read the response later */ @@ -424,7 +425,7 @@ flushtape(void) /* Read results back from next slave */ if (slp->sent) { - if (atomic_read( slp->fd, (char *)&returned, sizeof returned) + if (dump_atomic_read( slp->fd, (char *)&returned, sizeof returned) != sizeof returned) { perror(" DUMP: error reading command pipe in master"); dumpabort(0); @@ -449,7 +450,7 @@ flushtape(void) */ for (i = 0; i < SLAVES; i++) { if (slaves[i].sent) { - if (atomic_read( slaves[i].fd, + if (dump_atomic_read( slaves[i].fd, (char *)&returned, sizeof returned) != sizeof returned) { perror(" DUMP: error reading command pipe in master"); @@ -482,7 +483,7 @@ flushtape(void) blocksthisvol += ntrec; if (!pipeout && !unlimited) { if (blocksperfile) { - if ( compressed ? (bytes_written - tapea_bytes + SLAVES * (writesize + sizeof(struct tapebuf))) >= blocksperfile * 1024 + if ( compressed ? (bytes_written - tapea_bytes + SLAVES * (writesize + sizeof(struct tapebuf))) >= (((long long)blocksperfile) * 1024) : blocksthisvol >= blocksperfile ) { close_rewind(); startnewtape(0); @@ -513,7 +514,7 @@ trewind(void) * fixme: punt for now. */ if (slaves[f].sent) { - if (atomic_read( slaves[f].fd, (char *)&returned, sizeof returned) + if (dump_atomic_read( slaves[f].fd, (char *)&returned, sizeof returned) != sizeof returned) { perror(" DUMP: error reading command pipe in master"); dumpabort(0); @@ -545,7 +546,7 @@ trewind(void) #ifdef RDUMP if (host) { rmtclose(); - while (rmtopen(tape, 0) < 0) + while (rmtopen(tape, O_RDONLY) < 0) sleep(10); rmtclose(); } @@ -554,7 +555,7 @@ trewind(void) { (void) close(tapefd); if (!fifoout) { - while ((f = OPEN(tape, 0)) < 0) + while ((f = OPEN(tape, O_RDONLY)) < 0) sleep (10); (void) close(f); } @@ -593,8 +594,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; @@ -648,7 +649,7 @@ rollforward(void) lastspclrec = savedtapea - 1; } size = (char *)ntb - (char *)q; - if (atomic_write( slp->fd, (char *)q, size) != size) { + if (dump_atomic_write( slp->fd, (char *)q, size) != size) { perror(" DUMP: error writing command pipe"); dumpabort(0); } @@ -696,7 +697,7 @@ rollforward(void) * worked ok, otherwise the tape is much too short! */ if (slp->sent) { - if (atomic_read( slp->fd, (char *)&returned, sizeof returned) + if (dump_atomic_read( slp->fd, (char *)&returned, sizeof returned) != sizeof returned) { perror(" DUMP: error reading command pipe in master"); dumpabort(0); @@ -867,15 +868,16 @@ restore_check_point: msg("Dumping volume %d on %s\n", tapeno, tape); } #ifdef RDUMP - while ((tapefd = (host ? rmtopen(tape, 2) : pipeout ? + while ((tapefd = (host ? rmtopen(tape, O_WRONLY|O_CREAT|O_TRUNC) : pipeout ? fileno(stdout) : - OPEN(tape, O_WRONLY|O_CREAT, 0666))) < 0) + OPEN(tape, O_WRONLY|O_CREAT|O_TRUNC, 0666))) < 0) #else while ((tapefd = (pipeout ? fileno(stdout) : - OPEN(tape, O_RDWR|O_CREAT, 0666))) < 0) + OPEN(tape, O_WRONLY|O_CREAT|O_TRUNC, 0666))) < 0) #endif { - msg("Cannot open output \"%s\".\n", tape); + msg("Cannot open output \"%s\": %s\n", tape, + strerror(errno)); if (!query("Do you want to retry the open?")) dumpabort(0); } @@ -916,13 +918,13 @@ restore_check_point: if (tapeno > 1) msg("Volume %d begins with blocks from inode %d\n", tapeno, slp->inode); - if (tapeno < TP_NINOS) + if (tapeno < (int)TP_NINOS) volinfo[tapeno] = slp->inode; } } void -dumpabort(int signo) +dumpabort(UNUSED(int signo)) { if (master != 0 && master != getpid()) @@ -952,7 +954,7 @@ Exit(int status) * proceed - handler for SIGUSR2, used to synchronize IO between the slaves. */ static void -proceed(int signo) +proceed(UNUSED(int signo)) { if (ready) siglongjmp(jmpbuf, 1); @@ -966,7 +968,7 @@ enslave(void) #ifdef LINUX_FORK_BUG int i, j; #else - register int i, j; + int i, j; #endif master = getpid(); @@ -1009,11 +1011,15 @@ enslave(void) sigprocmask(SIG_BLOCK, &sigs, NULL); #ifdef LINUX_FORK_BUG - if (atomic_write( cmd[0], (char *) &i, sizeof i) + if (dump_atomic_write( cmd[0], (char *) &i, sizeof i) != sizeof i) quit("master/slave protocol botched 3\n"); #endif - doslave(cmd[0], i, (slaves[i].pid == slp->pid)); + doslave(cmd[0], +#ifdef WRITEDEBUG + i, +#endif + (slaves[i].pid == slp->pid)); Exit(X_FINOK); } else @@ -1027,12 +1033,12 @@ enslave(void) * returned from fork() causes a SEGV in the child process */ for (i = 0; i < SLAVES; i++) - if (atomic_read( slaves[i].fd, (char *) &j, sizeof j) != sizeof j) + if (dump_atomic_read( slaves[i].fd, (char *) &j, sizeof j) != sizeof j) quit("master/slave protocol botched 4\n"); #endif for (i = 0; i < SLAVES; i++) - (void) atomic_write( slaves[i].fd, + (void) dump_atomic_write( slaves[i].fd, (char *) &slaves[(i + 1) % SLAVES].pid, sizeof slaves[0].pid); @@ -1042,7 +1048,7 @@ enslave(void) void killall(void) { - register int i; + int i; for (i = 0; i < SLAVES; i++) if (slaves[i].pid > 0) { @@ -1059,15 +1065,20 @@ killall(void) * slaves. */ static void -doslave(int cmd, int slave_number, int first) +doslave(int cmd, +#ifdef WRITEDEBUG + int slave_number, +#endif + int first) { - register int nread; - int nextslave, size, eot_count, bufsize; - volatile int wrote = 0; - char *buffer; + int nread; + int nextslave; + volatile int wrote = 0, size, eot_count, bufsize; + char * volatile buffer; #if defined(HAVE_ZLIB) || defined(HAVE_BZLIB) - struct tapebuf *comp_buf = NULL; - int compresult, do_compress = !first; + struct tapebuf * volatile comp_buf = NULL; + int compresult; + volatile int do_compress = !first; unsigned long worklen; #ifdef HAVE_BZLIB unsigned int worklen2; @@ -1108,7 +1119,7 @@ doslave(int cmd, int slave_number, int first) /* * Need the pid of the next slave in the loop... */ - if ((nread = atomic_read( cmd, (char *)&nextslave, sizeof nextslave)) + if ((nread = dump_atomic_read( cmd, (char *)&nextslave, sizeof nextslave)) != sizeof nextslave) { quit("master/slave protocol botched - didn't get pid of next slave.\n"); } @@ -1129,8 +1140,8 @@ 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; + while ((nread = dump_atomic_read( cmd, (char *)slp->req, reqsiz)) == reqsiz) { + struct req *p = slp->req; for (trecno = 0; trecno < ntrec; trecno += p->count, p += p->count) { @@ -1138,7 +1149,7 @@ doslave(int cmd, int slave_number, int first) bread(p->dblk, slp->tblock[trecno], p->count * TP_BSIZE); } else { /* read record from pipe */ - if (p->count != 1 || atomic_read( cmd, + if (p->count != 1 || dump_atomic_read( cmd, (char *)slp->tblock[trecno], TP_BSIZE) != TP_BSIZE) quit("master/slave protocol botched.\n"); @@ -1202,7 +1213,7 @@ doslave(int cmd, int slave_number, int first) } #endif /* HAVE_BZLIB */ - if (compresult && worklen <= (writesize - 16)) { + if (compresult && worklen <= ((unsigned long)writesize - 16)) { /* write the compressed buffer */ comp_buf->length = worklen; comp_buf->compressed = 1; @@ -1234,18 +1245,23 @@ doslave(int cmd, int slave_number, int first) #ifdef USE_QFA if (gTapeposfd >= 0) { int i; + int firstpass = 1; for (i = 0; i < ntrec; ++i) { uspclptr = (union u_spcl *)&slp->tblock[i]; 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 */ - if (gtperr == 0) { - if ((gtperr = GetTapePos(&curtapepos)) == 0) - MkTapeString(spclptr, curtapepos); + if (firstpass) { + firstpass = 0; + if (gtperr == 0) + gtperr = GetTapePos(&curtapepos); } + if (gtperr == 0) + MkTapeString(spclptr, curtapepos); } } } @@ -1295,7 +1311,7 @@ doslave(int cmd, int slave_number, int first) * pass size of data and size of write back to master * (for EOT handling) */ - (void) atomic_write( cmd, (char *)&returns, sizeof returns); + (void) dump_atomic_write( cmd, (char *)&returns, sizeof returns); /* * Signal the next slave to go. @@ -1312,7 +1328,7 @@ doslave(int cmd, int slave_number, int first) * loop until the count is satisfied (or error). */ static ssize_t -atomic_read(int fd, void *buf, size_t count) +dump_atomic_read(int fd, void *buf, size_t count) { int got, need = count; @@ -1320,7 +1336,7 @@ atomic_read(int fd, void *buf, size_t count) while ((got = read(fd, buf, need)) > 0 && (need -= got) > 0) (char *)buf += got; } while (got == -1 && errno == EINTR); - return (got < 0 ? got : count - need); + return (got < 0 ? got : (ssize_t)count - need); } /* @@ -1329,7 +1345,7 @@ atomic_read(int fd, void *buf, size_t count) * loop until the count is satisfied (or error). */ static ssize_t -atomic_write(int fd, const void *buf, size_t count) +dump_atomic_write(int fd, const void *buf, size_t count) { int got, need = count; @@ -1337,7 +1353,7 @@ atomic_write(int fd, const void *buf, size_t count) while ((got = write(fd, buf, need)) > 0 && (need -= got) > 0) (char *)buf += got; } while (got == -1 && errno == EINTR); - return (got < 0 ? got : count - need); + return (got < 0 ? got : (ssize_t)count - need); } @@ -1390,7 +1406,7 @@ MkTapeString(struct s_spcl *spclptr, long long curtapepos) { tapeno, curtapepos); gTps[sizeof(gTps) - 1] = '\0'; - if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps)) { + if (write(gTapeposfd, gTps, strlen(gTps)) != (ssize_t)strlen(gTps)) { warn("error writing tapepos file.\n"); } }