]> git.wh0rd.org - dump.git/commitdiff
-e inode,inode and -E file implementation.
authorStelian Pop <stelian@popies.net>
Thu, 19 Jul 2001 09:03:44 +0000 (09:03 +0000)
committerStelian Pop <stelian@popies.net>
Thu, 19 Jul 2001 09:03:44 +0000 (09:03 +0000)
CHANGES
dump/dump.8.in
dump/dump.h
dump/main.c
dump/traverse.c

diff --git a/CHANGES b/CHANGES
index 7a4457a89cd8cca365ab4b47b26cb341450d7987..c2280dd6f0abee6b4f9457b1700a775d3a79aab4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,4 @@
-$Id: CHANGES,v 1.124 2001/07/18 14:57:46 stelian Exp $
+$Id: CHANGES,v 1.125 2001/07/19 09:03:44 stelian Exp $
 
 Changes between versions 0.4b22 and 0.4b23 (released ????????????)
 ==================================================================
 
 Changes between versions 0.4b22 and 0.4b23 (released ????????????)
 ==================================================================
@@ -43,6 +43,12 @@ Changes between versions 0.4b22 and 0.4b23 (released ????????????)
        to the 'Mount next tape' prompt caused several blocks to
        be lost.
 
        to the 'Mount next tape' prompt caused several blocks to
        be lost.
 
+11.    Enhanced the -e option of dump to take as a parameter a
+       comma separated list of inode numbers.
+
+12.    Added the -E option to dump which specify a file containing
+       inode numbers to exclude from the dump.
+
 Changes between versions 0.4b21 and 0.4b22 (released May 12, 2001)
 ==================================================================
 
 Changes between versions 0.4b21 and 0.4b22 (released May 12, 2001)
 ==================================================================
 
index a3763a52ac352d83f7be423d94f55dceb8705231..abbda7363ad047bce7a0161d01b9a7b8ac0c7dcc 100644 (file)
@@ -30,7 +30,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
 .\" 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
 .\"
 .Dd __DATE__
 .Dt DUMP 8
@@ -44,7 +44,8 @@
 .Op Fl B Ar records
 .Op Fl b Ar blocksize
 .Op Fl d Ar density
 .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
 .Op Fl f Ar file
 .Op Fl F Ar script
 .Op Fl h Ar level
@@ -141,12 +142,21 @@ The default blocksize is 10.
 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.
 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 
 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).
 .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
 .It Fl h Ar level
 Honor the user
 .Dq nodump
index 2f570ecb977b06b8858c744af3e1ed1ea4842b97..825a7fc54d3b9eee7ff8c8ffe809252839fdeb86 100644 (file)
@@ -5,7 +5,7 @@
  *     Stelian Pop <pop@noos.fr>, 1999-2000
  *     Stelian Pop <pop@noos.fr> - Alcôve <www.alcove.fr>, 2000
  *
  *     Stelian Pop <pop@noos.fr>, 1999-2000
  *     Stelian Pop <pop@noos.fr> - Alcôve <www.alcove.fr>, 2000
  *
- *     $Id: dump.h,v 1.26 2001/07/18 13:12:33 stelian Exp $
+ *     $Id: dump.h,v 1.27 2001/07/19 09:03:44 stelian Exp $
  */
 
 /*-
  */
 
 /*-
@@ -187,6 +187,8 @@ int rmtioctl __P((int cmd, int count));
 #endif /* RDUMP */
 
 void   interrupt __P((int signo));     /* in case operator bangs on console */
 #endif /* RDUMP */
 
 void   interrupt __P((int signo));     /* in case operator bangs on console */
+int    exclude_ino __P((dump_ino_t ino));
+void   do_exclude_ino __P((dump_ino_t ino));
 
 /*
  *     Exit status codes
 
 /*
  *     Exit status codes
index 0d1f4fd19adb082e7ec6ec376db9ce1b6009f15a..2ee429a6c660ef2805d37b585ec4257229d6f728 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #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>
 #endif /* not lint */
 
 #include <config.h>
@@ -114,9 +114,11 @@ int        maxbsize = 64*1024;     /* XXX MAXBSIZE from sys/param.h */
 static long numarg __P((const char *, long, long));
 static void obsolete __P((int *, char **[]));
 static void usage __P((void));
 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[])
 
 int
 main(int argc, char *argv[])
@@ -168,7 +170,7 @@ main(int argc, char *argv[])
 #endif /* USE_QFA */
 
        while ((ch = getopt(argc, 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
 #ifdef KERBEROS
                            "k"
 #endif
@@ -224,19 +226,19 @@ main(int argc, char *argv[])
                        
                                        /* 04-Feb-00 ILC */
                case 'e':               /* exclude an inode */
                        
                                        /* 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 */
                        break;
 
                case 'f':               /* output file */
@@ -888,12 +890,11 @@ usage(void)
 #endif
                "MnSu"
                "] [-B records] [-b blocksize] [-d density]\n"
 #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
 #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
 #ifdef HAVE_ZLIB
                "[-z zlevel] "
 #endif
@@ -1000,6 +1001,7 @@ obsolete(int *argcp, char **argvp[])
                case 'b':
                case 'd':
                case 'e':
                case 'b':
                case 'd':
                case 'e':
+               case 'E':
                case 'f':
                case 'F':
                case 'h':
                case 'f':
                case 'F':
                case 'h':
@@ -1041,3 +1043,74 @@ obsolete(int *argcp, char **argvp[])
        /* Update argument count. */
        *argcp = nargv - *argvp - 1;
 }
        /* 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);
+}
index 632a6a39d4350823cd042318a36b17dd41ff3fab..2a160fa95f31a3ff716ad78bd6a34a49784af95a 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
 
 #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>
 #endif /* not lint */
 
 #include <config.h>
@@ -102,9 +102,6 @@ static      void dmpindir __P((dump_ino_t ino, daddr_t blk, int level, fsizeT *size))
 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 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)
 
 #ifdef HAVE_EXT2_JOURNAL_INUM
 #define ext2_journal_ino(sb) (sb->s_journal_inum)
@@ -162,13 +159,12 @@ int dump_fs_open(const char *disk, ext2_filsys *fs)
                else {
                        if (es->s_feature_compat &
                                EXT3_FEATURE_COMPAT_HAS_JOURNAL && 
                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);
                                    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 retval;
@@ -224,22 +220,6 @@ blockest(struct dinode const *dp)
        return (blkest + 1);
 }
 
        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))
 /* Auxiliary macro to pick up files changed since previous dump. */
 #define        CHANGEDSINCE(dp, t) \
        ((dp)->di_mtime >= (t) || (dp)->di_ctime >= (t))