X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Fmain.c;h=ee6717272dc5dd661455eb7b7075f1472278d73a;hp=e1d3db366f67da6e606b922263e438af8fd20852;hb=633963a251fb12a63e43a7f6f2391dc9507972a7;hpb=b82d31dc01e8474d503a86fbf52ddf6d74c245e6 diff --git a/dump/main.c b/dump/main.c index e1d3db3..ee67172 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.61 2001/11/11 00:06:39 stelian Exp $"; + "$Id: main.c,v 1.69 2002/01/31 10:49:17 stelian Exp $"; #endif /* not lint */ #include @@ -55,6 +55,7 @@ static const char rcsid[] = #include #include #include +#include #include #include @@ -104,6 +105,7 @@ 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 */ @@ -140,6 +142,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; @@ -189,12 +192,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; @@ -207,6 +210,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); @@ -237,7 +241,7 @@ main(int argc, char *argv[]) #endif /* USE_QFA */ while ((ch = getopt(argc, argv, - "0123456789aB:b:cd:e:E:f:F:h:I:" + "0123456789A:aB:b:cd:e:E:f:F:h:I:" #ifdef HAVE_BZLIB "j::" #endif @@ -261,6 +265,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; @@ -499,6 +515,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 */ @@ -508,7 +531,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 @@ -675,7 +699,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 @@ -839,10 +863,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"); @@ -914,6 +939,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. @@ -954,6 +986,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); @@ -983,23 +1018,23 @@ usage(void) "k" #endif "MnqSu" - "] [-B records] [-b blocksize] [-d density]\n" - "\t%s [-e inode#,inode#,...] [-E file] [-f file] [-h level] " - "[-I nr errors] " + "] [-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); } @@ -1096,6 +1131,7 @@ obsolete(int *argcp, char **argvp[]) for (flags = 0; *ap; ++ap) { switch (*ap) { + case 'A': case 'B': case 'b': case 'd':