.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $Id: dump.8.in,v 1.29 2001/07/18 13:12:33 stelian Exp $
+.\" $Id: dump.8.in,v 1.30 2001/07/19 09:03:44 stelian Exp $
.\"
.Dd __DATE__
.Dt DUMP 8
.Op Fl B Ar records
.Op Fl b Ar blocksize
.Op Fl d Ar density
-.Op Fl e Ar inode number
+.Op Fl e Ar inode numbers
+.Op Fl E Ar file
.Op Fl f Ar file
.Op Fl F Ar script
.Op Fl h Ar level
Change the defaults for use with a cartridge tape drive, with a density
of 8000 bpi, and a length of 1700 feet. Specifying a cartridge drive
overrides the end-of-media detection.
-.It Fl e Ar inode
+.It Fl e Ar inodes
Exclude
-.Ar inode
-from the dump (you can use
+.Ar inodes
+from the dump. The
+.Ar inodes
+parameter is a comma separated list of inode numbers (you can use
.Ar stat
to find the inode number for a file or directory).
+.It Fl E Ar file
+Read list of inodes to be excluded from the dump from the text file
+.Ar file .
+The file
+.Ar file
+should be an ordinary file containing inode numbers separated by
+newlines.
.It Fl h Ar level
Honor the user
.Dq nodump
#ifndef lint
static const char rcsid[] =
- "$Id: main.c,v 1.52 2001/07/18 13:12:33 stelian Exp $";
+ "$Id: main.c,v 1.53 2001/07/19 09:03:44 stelian Exp $";
#endif /* not lint */
#include <config.h>
static long numarg __P((const char *, long, long));
static void obsolete __P((int *, char **[]));
static void usage __P((void));
+static void do_exclude_from_file __P((char *));
+static void do_exclude_ino_str __P((char *));
-dump_ino_t iexclude_list[IEXCLUDE_MAXNUM];/* the inode exclude list */
-int iexclude_num = 0; /* number of elements in the list */
+static dump_ino_t iexclude_list[IEXCLUDE_MAXNUM];/* the inode exclude list */
+static int iexclude_num = 0; /* number of elements in the list */
int
main(int argc, char *argv[])
#endif /* USE_QFA */
while ((ch = getopt(argc, argv,
- "0123456789aB:b:cd:e:f:F:h:L:"
+ "0123456789aB:b:cd:e:E:f:F:h:L:"
#ifdef KERBEROS
"k"
#endif
/* 04-Feb-00 ILC */
case 'e': /* exclude an inode */
- if (iexclude_num == IEXCLUDE_MAXNUM) {
- msg("Too many -e options\n");
- msg("The ENTIRE dump is aborted.\n");
- exit(X_STARTUP);
+ {
+ char *p = optarg, *q;
+ while ((q = strchr(p, ','))) {
+ *q = '\0';
+ do_exclude_ino_str(p);
+ p = q + 1;
}
- iexclude_list[iexclude_num++] = numarg("inode to exclude",0L,0L);
- if (iexclude_list[iexclude_num-1] <= ROOTINO) {
- msg("Cannot exclude inode %ld\n", (long)iexclude_list[iexclude_num-1]);
- msg("The ENTIRE dump is aborted.\n");
- exit(X_STARTUP);
+ do_exclude_ino_str(p);
}
- msg("Added %d to exclude list\n",
- iexclude_list[iexclude_num-1]);
+ break;
+
+ case 'E': /* exclude inodes read from file */
+ do_exclude_from_file(optarg);
break;
case 'f': /* output file */
#endif
"MnSu"
"] [-B records] [-b blocksize] [-d density]\n"
- "\t%s [-e inode#] [-f file] [-h level] "
+ "\t%s [-e inode#,inode#,...] [-E file] [-f file] [-h level] "
#ifdef USE_QFA
"[-Q file] "
#endif
- "[-s feet]\n"
- "\t%s [-T date] "
+ "\n\t%s [-s feet] [-T date] "
#ifdef HAVE_ZLIB
"[-z zlevel] "
#endif
case 'b':
case 'd':
case 'e':
+ case 'E':
case 'f':
case 'F':
case 'h':
/* Update argument count. */
*argcp = nargv - *argvp - 1;
}
+
+/*
+ * This tests whether an inode is in the exclude list
+ */
+int
+exclude_ino(dump_ino_t ino)
+{
+ /* 04-Feb-00 ILC */
+ if (iexclude_num) { /* if there are inodes in the exclude list */
+ int idx; /* then check this inode against it */
+ for (idx = 0; idx < iexclude_num; idx++)
+ if (ino == iexclude_list[idx])
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * This tests adds an inode to the exclusion list if it isn't already there
+ */
+void
+do_exclude_ino(dump_ino_t ino)
+{
+ if (!exclude_ino(ino)) {
+ if (iexclude_num == IEXCLUDE_MAXNUM) {
+ msg("Too many exclude options\n");
+ msg("The ENTIRE dump is aborted.\n");
+ exit(X_STARTUP);
+ }
+ msg("Added inode %u to exclude list\n", ino);
+ iexclude_list[iexclude_num++] = ino;
+ }
+}
+
+static void
+do_exclude_ino_str(char * ino) {
+ char *r;
+ unsigned long inod;
+
+ inod = strtoul(ino, &r, 10);
+ if (*r != '\0' || inod <= ROOTINO) {
+ msg("Invalid inode argument %s\n", ino);
+ msg("The ENTIRE dump is aborted.\n");
+ exit(X_STARTUP);
+ }
+ do_exclude_ino(inod);
+}
+
+/*
+ * This reads a file containing one inode number per line and exclude them all
+ */
+static void
+do_exclude_from_file(char *file) {
+ FILE *f;
+ char *p, fname[MAXPATHLEN];
+
+
+ if (!( f = fopen(file, "r")) ) {
+ msg("Cannot open file for reading: %s\n", file);
+ msg("The ENTIRE dump is aborted.\n");
+ exit(X_STARTUP);
+ }
+ while (( p = fgets(fname, MAXPATHLEN, f))) {
+ if ( *p && *(p + strlen(p) - 1) == '\n' ) /* possible null string */
+ *(p + strlen(p) - 1) = '\0';
+ if ( !*p ) /* skip empty lines */
+ continue;
+ do_exclude_ino_str(p);
+ }
+ fclose(f);
+}
#ifndef lint
static const char rcsid[] =
- "$Id: traverse.c,v 1.35 2001/07/18 08:50:58 stelian Exp $";
+ "$Id: traverse.c,v 1.36 2001/07/19 09:03:44 stelian Exp $";
#endif /* not lint */
#include <config.h>
static int searchdir __P((dump_ino_t ino, daddr_t blkno, long size, long filesize));
#endif
static void mapfileino __P((dump_ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped));
-static int exclude_ino __P((dump_ino_t ino));
-extern dump_ino_t iexclude_list[IEXCLUDE_MAXNUM]; /* the inode exclude list */
-extern int iexclude_num; /* number of elements in list */
#ifdef HAVE_EXT2_JOURNAL_INUM
#define ext2_journal_ino(sb) (sb->s_journal_inum)
else {
if (es->s_feature_compat &
EXT3_FEATURE_COMPAT_HAS_JOURNAL &&
- journal_ino && !exclude_ino(journal_ino)) {
- iexclude_list[iexclude_num++] = journal_ino;
- msg("Exclude ext3 journal inode %u\n",
+ journal_ino) {
+ msg("Exclude journal inode %u\n",
journal_ino);
+ do_exclude_ino(journal_ino);
}
- if (!exclude_ino(EXT2_RESIZE_INO))
- iexclude_list[iexclude_num++] = EXT2_RESIZE_INO;
+ do_exclude_ino(EXT2_RESIZE_INO);
}
}
return retval;
return (blkest + 1);
}
-/*
- * This tests whether an inode is in the exclude list
- */
-int
-exclude_ino(dump_ino_t ino)
-{
- /* 04-Feb-00 ILC */
- if (iexclude_num) { /* if there are inodes in the exclude list */
- int idx; /* then check this inode against it */
- for (idx = 0; idx < iexclude_num; idx++)
- if (ino == iexclude_list[idx])
- return 1;
- }
- return 0;
-}
-
/* Auxiliary macro to pick up files changed since previous dump. */
#define CHANGEDSINCE(dp, t) \
((dp)->di_mtime >= (t) || (dp)->di_ctime >= (t))