X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Fmain.c;h=bc4de017f7b1fa0b526d9798ba9018129428e4f2;hb=d339304329df2d458e54c02eac10a27cb31d9cb1;hp=3348e18ab83637fe2c8ee7cec14028631e88a5c0;hpb=df9ae507502f413c72119dde6ea3d35c91dba5bf;p=dump.git diff --git a/dump/main.c b/dump/main.c index 3348e18..bc4de01 100644 --- a/dump/main.c +++ b/dump/main.c @@ -2,7 +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,7 +40,7 @@ #ifndef lint static const char rcsid[] = - "$Id: main.c,v 1.6 1999/10/13 09:57:19 stelian Exp $"; + "$Id: main.c,v 1.16 2000/02/26 01:35:48 stelian Exp $"; #endif /* not lint */ #include @@ -94,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; @@ -104,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[]) { @@ -137,10 +141,9 @@ 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. */ if (TP_BSIZE / DEV_BSIZE == 0 || TP_BSIZE % DEV_BSIZE != 0) quit("TP_BSIZE must be a multiple of DEV_BSIZE\n"); @@ -151,9 +154,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 @@ -193,9 +196,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': @@ -225,6 +236,10 @@ main(int argc, char *argv[]) } break; + case 'M': /* multi-volume flag */ + Mflag = 1; + break; + case 'n': /* notify operators */ notify = 1; break; @@ -233,6 +248,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) { @@ -277,9 +296,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) @@ -301,12 +320,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); } @@ -335,6 +354,12 @@ main(int argc, char *argv[]) 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, @@ -358,10 +383,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); @@ -392,29 +417,37 @@ main(int argc, char *argv[]) spcl.c_level = 0; } - msg("Date of this level %c dump: %s", level, + 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)); + 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) @@ -477,7 +510,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); @@ -487,11 +521,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); @@ -569,6 +609,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 +622,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,9 +632,14 @@ 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); } @@ -656,8 +704,8 @@ usage(void) #ifdef KERBEROS "k" #endif - "nu] [-B records] [-b blocksize] [-d density]\n" - "\t%s [-f file] [-h level] [-s feet] [-T date] filesystem\n" + "MnSu] [-B records] [-b blocksize] [-d density]\n" + "\t%s [-e inode#] [-f file] [-h level] [-s feet] [-T date] filesystem\n" "\t%s [-W | -w]\n", __progname, white, __progname); exit(X_STARTUP); }