X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftape.c;h=c6161bedbec52d4863d00af48831f349ec474f0b;hb=a9c5ed48f9b7e1889ee7694c5666ddb39814fe56;hp=125b15884074869ed1d7b4b4adcf0c58bfcf18f0;hpb=35952b8fbb9df4f18fe7c470dc62ed318d4ce695;p=dump.git diff --git a/dump/tape.c b/dump/tape.c index 125b158..c6161be 100644 --- a/dump/tape.c +++ b/dump/tape.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.63 2002/02/21 09:25:31 stelian Exp $"; + "$Id: tape.c,v 1.69 2002/07/01 11:54:40 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,8 +114,8 @@ 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)); static void doslave __P((int, int, int)); static void enslave __P((void)); static void flushtape __P((void)); @@ -413,7 +410,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 +421,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 +446,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 +479,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 +510,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 +542,7 @@ trewind(void) #ifdef RDUMP if (host) { rmtclose(); - while (rmtopen(tape, 0) < 0) + while (rmtopen(tape, "O_RDONLY") < 0) sleep(10); rmtclose(); } @@ -554,7 +551,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); } @@ -648,7 +645,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 +693,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 +864,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); } @@ -1009,7 +1007,7 @@ 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 @@ -1027,12 +1025,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); @@ -1108,7 +1106,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,7 +1127,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) { + while ((nread = dump_atomic_read( cmd, (char *)slp->req, reqsiz)) == reqsiz) { struct req *p = slp->req; for (trecno = 0; trecno < ntrec; @@ -1138,7 +1136,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"); @@ -1234,6 +1232,7 @@ 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; @@ -1243,10 +1242,13 @@ doslave(int cmd, int slave_number, int first) (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); } } } @@ -1296,7 +1298,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. @@ -1313,7 +1315,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; @@ -1330,7 +1332,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;