-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 ????????????)
 ==================================================================
@@ -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.
 
+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)
 ==================================================================
 
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.
 .\"
-.\"    $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
@@ -44,7 +44,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
@@ -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.
-.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
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
  *
- *     $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 */
+int    exclude_ino __P((dump_ino_t ino));
+void   do_exclude_ino __P((dump_ino_t ino));
 
 /*
  *     Exit status codes
index 0d1f4fd19adb082e7ec6ec376db9ce1b6009f15a..2ee429a6c660ef2805d37b585ec4257229d6f728 100644 (file)
@@ -41,7 +41,7 @@
 
 #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>
@@ -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 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[])
@@ -168,7 +170,7 @@ 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
@@ -224,19 +226,19 @@ main(int argc, char *argv[])
                        
                                        /* 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 */
@@ -888,12 +890,11 @@ usage(void)
 #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
@@ -1000,6 +1001,7 @@ obsolete(int *argcp, char **argvp[])
                case 'b':
                case 'd':
                case 'e':
+               case 'E':
                case 'f':
                case 'F':
                case 'h':
@@ -1041,3 +1043,74 @@ obsolete(int *argcp, char **argvp[])
        /* 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[] =
-       "$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>
@@ -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 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)
@@ -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 && 
-                               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;
@@ -224,22 +220,6 @@ blockest(struct dinode const *dp)
        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))