X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Fmain.c;h=806de5efe278b990f2844d9f994f9b39d02b7cb1;hb=20c345aa6780d2b021ce6cdbd812e4f021273640;hp=ca30a9c03483f9d97ded33f3388a479fb97241fe;hpb=ddd2ef55b78a62c4bc3daad18bef8a90e85a2052;p=dump.git diff --git a/dump/main.c b/dump/main.c index ca30a9c..806de5e 100644 --- a/dump/main.c +++ b/dump/main.c @@ -2,8 +2,7 @@ * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit * Remy Card , 1994-1997 - * Stelian Pop , 1999 - * + * Stelian Pop , 1999-2000 */ /*- @@ -40,17 +39,8 @@ */ #ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1980, 1991, 1993, 1994\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/1/95"; -#endif static const char rcsid[] = - "$Id: main.c,v 1.3 1999/10/11 12:59:18 stelian Exp $"; + "$Id: main.c,v 1.15 2000/02/04 20:22:21 stelian Exp $"; #endif /* not lint */ #include @@ -104,6 +94,7 @@ int dokerberos = 0; /* Use Kerberos authentication */ long dev_bsize = 1; /* recalculated below */ long blocksperfile; /* output blocks per file */ char *host = NULL; /* remote host (if any) */ +int sizest = 0; /* return size estimate only */ #ifdef __linux__ char *__progname; @@ -114,6 +105,9 @@ static long numarg __P((const char *, long, long)); static void obsolete __P((int *, char **[])); static void usage __P((void)); +ino_t iexclude_list[IEXCLUDE_MAXNUM]; /* the inode exclude list */ +int iexclude_num = 0; /* number of elements in the list */ + int main(int argc, char *argv[]) { @@ -147,8 +141,8 @@ main(int argc, char *argv[]) #endif tsize = 0; /* Default later, based on 'c' option for cart tapes */ - if ((tape = getenv("TAPE")) == NULL) - tape = _PATH_DEFTAPE; + if ((tapeprefix = getenv("TAPE")) == NULL) + tapeprefix = _PATH_DEFTAPE; dumpdates = _PATH_DUMPDATES; temp = _PATH_DTMP; strcpy(labelstr, "none"); /* XXX safe strcpy. */ @@ -161,9 +155,9 @@ main(int argc, char *argv[]) obsolete(&argc, &argv); #ifdef KERBEROS -#define optstring "0123456789aB:b:cd:f:h:kL:ns:T:uWw" +#define optstring "0123456789aB:b:cd:e:f:h:kL:Mns:ST:uWw" #else -#define optstring "0123456789aB:b:cd:f:h:L:ns:T:uWw" +#define optstring "0123456789aB:b:cd:e:f:h:L:Mns:ST:uWw" #endif while ((ch = getopt(argc, argv, optstring)) != -1) #undef optstring @@ -203,9 +197,17 @@ main(int argc, char *argv[]) if (density >= 625 && !bflag) ntrec = HIGHDENSITYTREC; break; + + /* 04-Feb-00 ILC */ + case 'e': /* exclude an inode */ + iexclude_list[iexclude_num++] = + numarg("inode to exclude",0L,0L); + msg("Added %d to exclude list\n", + iexclude_list[iexclude_num-1]); + break; case 'f': /* output file */ - tape = optarg; + tapeprefix = optarg; break; case 'h': @@ -235,6 +237,10 @@ main(int argc, char *argv[]) } break; + case 'M': /* multi-volume flag */ + Mflag = 1; + break; + case 'n': /* notify operators */ notify = 1; break; @@ -243,6 +249,10 @@ main(int argc, char *argv[]) tsize = numarg("tape size", 1L, 0L) * 12 * 10; break; + case 'S': + sizest = 1; /* return size estimate only */ + break; + case 'T': /* time of last dump */ spcl.c_ddate = unctime(optarg); if (spcl.c_ddate < 0) { @@ -287,9 +297,9 @@ main(int argc, char *argv[]) "You cannot use the T and u flags together.\n"); exit(X_STARTUP); } - if (strcmp(tape, "-") == 0) { + if (strcmp(tapeprefix, "-") == 0) { pipeout++; - tape = "standard output"; + tapeprefix = "standard output"; } if (blocksperfile) @@ -311,12 +321,12 @@ main(int argc, char *argv[]) tsize = cartridge ? 1700L*120L : 2300L*120L; } - if (strchr(tape, ':')) { - host = tape; - tape = strchr(host, ':'); - *tape++ = '\0'; + if (strchr(tapeprefix, ':')) { + host = tapeprefix; + tapeprefix = strchr(host, ':'); + *tapeprefix++ = '\0'; #ifdef RDUMP - if (index(tape, '\n')) { + if (index(tapeprefix, '\n')) { (void)fprintf(stderr, "invalid characters in tape\n"); exit(X_STARTUP); } @@ -343,9 +353,14 @@ main(int argc, char *argv[]) signal(SIGTERM, sig); if (signal(SIGINT, interrupt) == SIG_IGN) signal(SIGINT, SIG_IGN); - set_operators(); /* /etc/group snarfed */ getfstab(); /* /etc/fstab snarfed */ + /* + * disk may end in / and this can confuse + * fstabsearch. + */ + if (strlen(disk) > 1 && disk[strlen(disk) - 1] == '/') + disk[strlen(disk) - 1] = '\0'; /* * disk can be either the full special file name, * the suffix of the special file name, @@ -369,10 +384,10 @@ main(int argc, char *argv[]) dt = fstabsearchdir(pathname, directory); if (dt != NULL) { char name[MAXPATHLEN]; + (void)strncpy(spcl.c_dev, dt->fs_spec, NAMELEN); (void)sprintf(name, "%s (dir %s)", - dt->fs_spec, directory); - (void)strncpy(spcl.c_dev, name, NAMELEN); - (void)strncpy(spcl.c_filesys, dt->fs_file, NAMELEN); + dt->fs_file, directory); + (void)strncpy(spcl.c_filesys, name, NAMELEN); disk = rawname(dt->fs_spec); } else { (void)strncpy(spcl.c_dev, disk, NAMELEN); @@ -394,31 +409,46 @@ main(int argc, char *argv[]) spcl.c_level = level - '0'; spcl.c_type = TS_TAPE; if (!Tflag) - getdumptime(); /* dumpdates snarfed */ + getdumptime(uflag); /* dumpdates snarfed */ - msg("Date of this level %c dump: %s", level, -#ifdef __linux - spcl.c_date == 0 ? "the epoch\n" : ctime4(&spcl.c_date)); + if (spcl.c_ddate == 0 && spcl.c_level) { + msg("WARNING: There is no inferior level dump on this filesystem\n"); + msg("WARNING: Assuming a level 0 dump by default\n"); + level = '0'; + spcl.c_level = 0; + } + + if (Mflag) + snprintf(tape, NAME_MAX, "%s%03d", tapeprefix, tapeno + 1); + else + strncpy(tape, tapeprefix, NAME_MAX); + tape[NAME_MAX - 1] = '\0'; + + if (!sizest) { + + msg("Date of this level %c dump: %s", level, +#ifdef __linux__ + spcl.c_date == 0 ? "the epoch\n" : ctime4(&spcl.c_date)); #else - spcl.c_date == 0 ? "the epoch\n" : ctime(&spcl.c_date)); + spcl.c_date == 0 ? "the epoch\n" : ctime(&spcl.c_date)); #endif - msg("Date of last level %c dump: %s", lastlevel, + msg("Date of last level %c dump: %s", lastlevel, #ifdef __linux__ - spcl.c_ddate == 0 ? "the epoch\n" : ctime4(&spcl.c_ddate)); + spcl.c_ddate == 0 ? "the epoch\n" : ctime4(&spcl.c_ddate)); #else - spcl.c_ddate == 0 ? "the epoch\n" : ctime(&spcl.c_ddate)); + spcl.c_ddate == 0 ? "the epoch\n" : ctime(&spcl.c_ddate)); #endif - msg("Dumping %s ", disk); - if (dt != NULL) - msgtail("(%s) ", dt->fs_file); - if (host) - msgtail("to %s on host %s\n", tape, host); - else - msgtail("to %s\n", tape); - msg("Label: %s\n", labelstr); + msg("Dumping %s (%s) ", disk, spcl.c_filesys); + if (host) + msgtail("to %s on host %s\n", tape, host); + else + msgtail("to %s\n", tape); + msg("Label: %s\n", labelstr); + + } /* end of size estimate */ #ifdef __linux__ - retval = ext2fs_open(disk, 0, 0, 0, unix_io_manager, &fs); + retval = dump_fs_open(disk, &fs); if (retval) { com_err(disk, retval, "while opening filesystem"); if (retval == EXT2_ET_REV_TOO_HIGH) @@ -481,7 +511,8 @@ main(int argc, char *argv[]) (void)signal(SIGINFO, statussig); #endif - msg("mapping (Pass I) [regular files]\n"); + if (!sizest) + msg("mapping (Pass I) [regular files]\n"); #ifdef __linux__ if (directory[0] == 0) anydirskipped = mapfiles(maxino, &tapesize); @@ -491,11 +522,17 @@ main(int argc, char *argv[]) anydirskipped = mapfiles(maxino, &tapesize); #endif - msg("mapping (Pass II) [directories]\n"); + if (!sizest) + msg("mapping (Pass II) [directories]\n"); while (anydirskipped) { anydirskipped = mapdirs(maxino, &tapesize); } + if (sizest) { + printf("%.0f\n", ((double)tapesize + 10) * TP_BSIZE); + exit(X_FINOK); + } /* stop here for size estimate */ + if (pipeout || unlimited) { tapesize += 10; /* 10 trailer blocks */ msg("estimated %ld tape blocks.\n", tapesize); @@ -550,7 +587,11 @@ main(int argc, char *argv[]) "can't allocate tape buffers - try a smaller blocking factor.\n"); startnewtape(1); +#ifdef __linux__ + (void)time4(&(tstart_writing)); +#else (void)time((time_t *)&(tstart_writing)); +#endif dumpmap(usedinomap, TS_CLRI, maxino - 1); msg("dumping (Pass III) [directories]\n"); @@ -569,6 +610,11 @@ main(int argc, char *argv[]) if ((dp->di_mode & IFMT) != IFDIR) continue; #ifdef __linux__ + /* + * Skip directory inodes deleted and not yes reallocated... + */ + if (dp->di_nlink == 0 || dp->di_dtime != 0) + continue; (void)dumpdirino(dp, ino); #else (void)dumpino(dp, ino); @@ -577,8 +623,6 @@ main(int argc, char *argv[]) msg("dumping (Pass IV) [regular files]\n"); for (map = dumpinomap, ino = 1; ino < maxino; ino++) { - int mode; - if (((ino - 1) % NBBY) == 0) /* map is offset by 1 */ dirty = *map++; else @@ -589,13 +633,22 @@ main(int argc, char *argv[]) * Skip inodes deleted and reallocated as directories. */ dp = getino(ino); - mode = dp->di_mode & IFMT; - if (mode == IFDIR) + if ((dp->di_mode & IFMT) == IFDIR) continue; +#ifdef __linux__ + /* + * No need to check here for deleted and not yes reallocated inodes + * since this is done in dumpino(). + */ +#endif (void)dumpino(dp, ino); } +#ifdef __linux__ + (void)time4(&(tend_writing)); +#else (void)time((time_t *)&(tend_writing)); +#endif spcl.c_type = TS_END; for (i = 0; i < ntrec; i++) writeheader(maxino - 1); @@ -637,14 +690,24 @@ main(int argc, char *argv[]) static void usage(void) { + char white[MAXPATHLEN]; + int i; + + strncpy(white, __progname, MAXPATHLEN-1); + white[MAXPATHLEN-1] = '\0'; + for (i=0; i