X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Fmain.c;h=3d4e693fc4ea6cb8672edd8a38716cd1959f0121;hp=722ca71e1764bb5fd381818210011d26155fa5ca;hb=7ad0e4095900bf99e57eedf254d7162ef5112f43;hpb=103245b6fea8e7d77722e85ccb404ac1d928987d diff --git a/dump/main.c b/dump/main.c index 722ca71..3d4e693 100644 --- a/dump/main.c +++ b/dump/main.c @@ -2,8 +2,8 @@ * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit * Remy Card , 1994-1997 - * Stelian Pop , 1999-2000 - * Stelian Pop - Alcôve , 2000 + * Stelian Pop , 1999-2000 + * Stelian Pop - Alcôve , 2000-2002 */ /*- @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: main.c,v 1.60 2001/09/06 09:00:32 stelian Exp $"; + "$Id: main.c,v 1.70 2002/03/11 10:17:43 stelian Exp $"; #endif /* not lint */ #include @@ -55,12 +55,12 @@ static const char rcsid[] = #include #include #include +#include #include #include #include #ifdef __linux__ -#include #ifdef HAVE_EXT2FS_EXT2_FS_H #include #else @@ -104,9 +104,11 @@ char *dumpdates; /* name of the file containing dump date information*/ char lastlevel; /* dump level of previous dump */ char level; /* dump level of this dump */ int bzipflag; /* compression is done using bzlib */ +int Afile = 0; /* archive file descriptor */ int uflag; /* update flag */ int Mflag; /* multi-volume flag */ int qflag; /* quit on errors flag */ +int breademax = 32; /* maximum number of bread errors before we quit */ char *eot_script; /* end of volume script fiag */ int diskfd; /* disk file descriptor */ int tapefd; /* tape file descriptor */ @@ -139,6 +141,7 @@ long xferrate; /* averaged transfer rate of all volumes */ long dev_bsize; /* block size of underlying disk device */ int dev_bshift; /* log2(dev_bsize) */ int tp_bshift; /* log2(TP_BSIZE) */ +dump_ino_t volinfo[TP_NINOS];/* which inode on which volume archive info */ #ifdef USE_QFA int gTapeposfd; @@ -188,12 +191,12 @@ static int iexclude_num = 0; /* number of elements in the list */ int main(int argc, char *argv[]) { - register dump_ino_t ino; - register int dirty; - register struct dinode *dp; - register struct fstab *dt; - register char *map; - register int ch; + dump_ino_t ino; + int dirty; + struct dinode *dp; + struct fstab *dt; + char *map; + int ch; int i, anydirskipped; int aflag = 0, bflag = 0, Tflag = 0, honorlevel = 1; dump_ino_t maxino; @@ -206,6 +209,7 @@ main(int argc, char *argv[]) #endif time_t tnow; char *diskparam; + char *Apath = NULL; spcl.c_label[0] = '\0'; spcl.c_date = time(NULL); @@ -236,7 +240,7 @@ main(int argc, char *argv[]) #endif /* USE_QFA */ while ((ch = getopt(argc, argv, - "0123456789aB:b:cd:e:E:f:F:h:" + "0123456789A:aB:b:cd:e:E:f:F:h:I:" #ifdef HAVE_BZLIB "j::" #endif @@ -260,6 +264,18 @@ main(int argc, char *argv[]) level = ch; break; + case 'A': /* archive file */ + Apath = optarg; + if ((Afile = open(Apath, O_RDWR|O_CREAT|O_TRUNC, + S_IRUSR | S_IWUSR)) < 0) { + msg("Cannot open %s for writing: %s\n", + optarg, strerror(errno)); + msg("The ENTIRE dump is aborted.\n"); + exit(X_STARTUP); + } + memset(volinfo, 0, TP_NINOS * sizeof(dump_ino_t)); + break; + case 'a': /* `auto-size', Write to EOM. */ unlimited = 1; aflag = 1; @@ -333,6 +349,11 @@ main(int argc, char *argv[]) break; #endif /* HAVE_BZLIB */ + case 'I': + breademax = + numarg ("number of errors to ignore", 1L, 0L); + break; + #ifdef KERBEROS case 'k': dokerberos = 1; @@ -493,6 +514,13 @@ main(int argc, char *argv[]) signal(SIGTERM, sig); if (signal(SIGINT, interrupt) == SIG_IGN) signal(SIGINT, SIG_IGN); +#ifdef SIGXCPU + signal(SIGXCPU, SIG_IGN); +#endif /* SIGXCPU */ +#ifdef SIGXFSZ + signal(SIGXFSZ, SIG_IGN); +#endif /* SIGXFSZ */ + set_operators(); /* /etc/group snarfed */ getfstab(); /* /etc/fstab snarfed */ @@ -502,7 +530,8 @@ main(int argc, char *argv[]) */ i = strlen(diskparam) - 1; if (i > 1 && diskparam[i] == '/') - diskparam[i] = '\0'; + if (!(i == 6 && !strcmp(diskparam, "LABEL=/"))) + diskparam[i] = '\0'; disk = get_device_name(diskparam); if (!disk) { /* null means the disk is some form @@ -669,7 +698,7 @@ main(int argc, char *argv[]) tp_bshift = ffs(TP_BSIZE) - 1; if (TP_BSIZE != (1 << tp_bshift)) quit("TP_BSIZE (%d) is not a power of 2", TP_BSIZE); - maxino = fs->super->s_inodes_count; + maxino = fs->super->s_inodes_count + 1; #if 0 spcl.c_flags |= DR_NEWINODEFMT; #endif @@ -833,10 +862,11 @@ main(int argc, char *argv[]) #ifdef USE_QFA if (tapepos) { msg("writing QFA positions to %s\n", gTapeposfile); - if ((gTapeposfd = open(gTapeposfile, O_RDWR|O_CREAT, S_IRUSR | S_IWUSR)) < 0) + if ((gTapeposfd = open(gTapeposfile, O_RDWR|O_CREAT|O_TRUNC, S_IRUSR | S_IWUSR)) < 0) quit("can't open tapeposfile\n"); /* print QFA-file header */ - sprintf(gTps, "%s\n%s\n%ld\n\n", QFA_MAGIC, QFA_VERSION, (unsigned long)spcl.c_date); + snprintf(gTps, sizeof(gTps), "%s\n%s\n%ld\n\n", QFA_MAGIC, QFA_VERSION, (unsigned long)spcl.c_date); + gTps[sizeof(gTps) - 1] = '\0'; if (write(gTapeposfd, gTps, strlen(gTps)) != strlen(gTps)) quit("can't write tapeposfile\n"); sprintf(gTps, "ino\ttapeno\ttapepos\n"); @@ -908,6 +938,13 @@ main(int argc, char *argv[]) tend_writing = time(NULL); spcl.c_type = TS_END; + + if (Afile) { + volinfo[1] = ROOTINO; + memcpy(spcl.c_inos, volinfo, TP_NINOS * sizeof(dump_ino_t)); + spcl.c_flags |= DR_INODEINFO; + } + /* * Finish off the current tape record with trailer blocks, to ensure * at least the data in the last partial record makes it to tape. @@ -948,6 +985,9 @@ main(int argc, char *argv[]) spcl.c_tapea, tapekb, rate); } + if (Afile) + msg("Archiving dump to %s\n", Apath); + broadcast("DUMP IS DONE!\7\7\n"); msg("DUMP IS DONE\n"); Exit(X_FINOK); @@ -977,22 +1017,23 @@ usage(void) "k" #endif "MnqSu" - "] [-B records] [-b blocksize] [-d density]\n" - "\t%s [-e inode#,inode#,...] [-E file] [-f file] [-h level] " + "] [-A file] [-B records] [-b blocksize]\n" + "\t%s [-d density] [-e inode#,inode#,...] [-E file] [-f file]\n" + "\t%s [-h level] [-I nr errors] " #ifdef HAVE_BZLIB "[-j zlevel] " #endif - "\n\t%s " #ifdef USE_QFA "[-Q file] " #endif - "[-s feet] [-T date] " + "[-s feet]\n" + "\t%s [-T date] " #ifdef HAVE_ZLIB "[-z zlevel] " #endif "filesystem\n" "\t%s [-W | -w]\n", - __progname, white, white, __progname); + __progname, white, white, white, __progname); exit(X_STARTUP); } @@ -1089,6 +1130,7 @@ obsolete(int *argcp, char **argvp[]) for (flags = 0; *ap; ++ap) { switch (*ap) { + case 'A': case 'B': case 'b': case 'd':