]> git.wh0rd.org - dump.git/blobdiff - dump/traverse.c
Save ext2 volume label into the dump label.
[dump.git] / dump / traverse.c
index f485ab31ae88a0bc79d14d022387495c764051e9..bda42a999817540cdb059ccc3cfaa174383168be 100644 (file)
@@ -40,7 +40,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: traverse.c,v 1.17 2000/03/03 11:43:35 stelian Exp $";
+       "$Id: traverse.c,v 1.21 2000/11/10 13:52:43 stelian Exp $";
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -84,11 +84,15 @@ static const char rcsid[] =
 #define        HASDUMPEDFILE   0x1
 #define        HASSUBDIRS      0x2
 
+#ifdef __linux__
+typedef u_quad_t fsizeT;
+#else
 #ifdef FS_44INODEFMT
 typedef        quad_t fsizeT;
 #else
 typedef        long fsizeT;
 #endif
+#endif
 
 #ifdef __linux__
 static int searchdir __P((struct ext2_dir_entry *dp, int offset,
@@ -99,19 +103,22 @@ static     void dmpindir __P((ino_t ino, daddr_t blk, int level, fsizeT *size));
 static int searchdir __P((ino_t ino, daddr_t blkno, long size, long filesize));
 #endif
 static void mapfileino __P((ino_t ino, long *tapesize, int *dirskipped));
+static int exclude_ino __P((ino_t ino));
 
-/* #define EXT3_FEATURE_INCOMPAT_RECOVER */
+/* #define EXT3_FEATURE_INCOMPAT_RECOVER       0x0004 */
+#ifdef EXT3_FEATURE_INCOMPAT_RECOVER
+#define FORCE_OPEN     EXT2_FLAG_FORCE
+#else
+#define FORCE_OPEN     0
+#endif
 
 int dump_fs_open(const char *disk, ext2_filsys *fs)
 {
        int retval;
        struct ext2fs_sb *s;
 
-#ifdef EXT3_FEATURE_INCOMPAT_RECOVER
-       retval = ext2fs_open(disk, EXT2_FLAG_FORCE, 0, 0, unix_io_manager, fs);
-#else
-       retval = ext2fs_open(disk, 0, 0, 0, unix_io_manager, fs);
-#endif
+       retval = ext2fs_open(disk, FORCE_OPEN, 0, 0, unix_io_manager, fs);
+#if defined(EXT2_LIB_FEATURE_COMPAT_SUPP) && defined(EXT2_LIB_FEATURE_INCOMPAT_SUPP) && defined(EXT2_LIB_FEATURE_RO_COMPAT_SUPP) && defined(EXT2_ET_UNSUPP_FEATURE) && defined(EXT2_ET_RO_UNSUPP_FEATURE)
        if (!retval) {
                s = (struct ext2fs_sb *) (*fs)->super;
                if ((s->s_feature_compat & ~EXT2_LIB_FEATURE_COMPAT_SUPP) ||
@@ -126,6 +133,7 @@ int dump_fs_open(const char *disk, ext2_filsys *fs)
                        retval = EXT2_ET_RO_UNSUPP_FEATURE;
                }
        }
+#endif /* defined && defined && defined... */
        return retval;
 }
 
@@ -177,21 +185,41 @@ blockest(struct dinode *dp)
        return (blkest + 1);
 }
 
+extern ino_t iexclude_list[IEXCLUDE_MAXNUM];   /* the inode exclude list */
+extern int iexclude_num;       /* number of elements in the list */
+
+/*
+ * This tests whether an inode is in the exclude list 
+ */
+int
+exclude_ino(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))
 
-/* The WANTTODUMP macro decides whether a file should be dumped. */
+/* The NODUMP_FLAG macro tests if a file has the nodump flag. */
 #ifdef UF_NODUMP
-#define        WANTTODUMP(dp) \
-       (CHANGEDSINCE(dp, spcl.c_ddate) && \
-        (nonodump || ((dp)->di_flags & UF_NODUMP) != UF_NODUMP))
+#define NODUMP_FLAG(dp) (!nonodump && (((dp)->di_flags & UF_NODUMP) == UF_NODUMP))
 #else
-#define        WANTTODUMP(dp) CHANGEDSINCE(dp, spcl.c_ddate)
+#define NODUMP_FLAG(dp) 0
 #endif
 
-extern ino_t iexclude_list[IEXCLUDE_MAXNUM];   /* the inode exclude list */
-extern int iexclude_num;       /* number of elements in the list */
+/* The WANTTODUMP macro decides whether a file should be dumped. */
+#define        WANTTODUMP(dp, ino) \
+       (CHANGEDSINCE(dp, spcl.c_ddate) && \
+        (!NODUMP_FLAG(dp)) && \
+        (!exclude_ino(ino)))
 
 /*
  * Determine if given inode should be dumped
@@ -221,20 +249,9 @@ mapfileino(ino_t ino, long *tapesize, int *dirskipped)
         */
        SETINO(ino, usedinomap);
 
-       /* 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]) {
-                               msg("Excluding inode number %d\n", ino);
-                               return; /* if in list then skip */
-                       }
-               }
-       }
-
        if (mode == IFDIR)
                SETINO(ino, dumpdirmap);
-       if (WANTTODUMP(dp)) {
+       if (WANTTODUMP(dp, ino)) {
                SETINO(ino, dumpinomap);
                if (mode != IFREG && mode != IFDIR && mode != IFLNK)
                        *tapesize += 1;
@@ -243,10 +260,8 @@ mapfileino(ino_t ino, long *tapesize, int *dirskipped)
                return;
        }
        if (mode == IFDIR) {
-#ifdef UF_NODUMP
-               if (!nonodump && (dp->di_flags & UF_NODUMP))
+               if ( NODUMP_FLAG(dp) || exclude_ino(ino) )
                        CLRINO(ino, usedinomap);
-#endif
                *dirskipped = 1;
        }
 }