]> git.wh0rd.org - dump.git/blobdiff - dump/traverse.c
Small fixes to allow dump to compile with a really old e2fsprogs version.
[dump.git] / dump / traverse.c
index f149b120b13555d31245e7fc9f09ea61d94cde84..ff8e168f40ad11320c1a976278220692ebabe125 100644 (file)
@@ -40,7 +40,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: traverse.c,v 1.14 2000/01/21 10:17:41 stelian Exp $";
+       "$Id: traverse.c,v 1.18 2000/05/28 18:16:42 stelian Exp $";
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -112,6 +112,7 @@ int dump_fs_open(const char *disk, ext2_filsys *fs)
 #else
        retval = ext2fs_open(disk, 0, 0, 0, unix_io_manager, fs);
 #endif
+#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 +127,7 @@ int dump_fs_open(const char *disk, ext2_filsys *fs)
                        retval = EXT2_ET_RO_UNSUPP_FEATURE;
                }
        }
+#endif /* defined && defined && defined... */
        return retval;
 }
 
@@ -164,7 +166,7 @@ blockest(struct dinode *dp)
                /* calculate the number of indirect blocks on the dump tape */
                blkest +=
                        howmany(sizeest - NDADDR * fs->blocksize / TP_BSIZE,
-                       TP_NINDIR);
+                       NINDIR(sblock) * EXT2_FRAGS_PER_BLOCK(fs->super));
        }
 #else
        if (dp->di_size > sblock->fs_bsize * NDADDR) {
@@ -190,6 +192,9 @@ blockest(struct dinode *dp)
 #define        WANTTODUMP(dp) CHANGEDSINCE(dp, spcl.c_ddate)
 #endif
 
+extern ino_t iexclude_list[IEXCLUDE_MAXNUM];   /* the inode exclude list */
+extern int iexclude_num;       /* number of elements in the list */
+
 /*
  * Determine if given inode should be dumped
  */
@@ -217,6 +222,18 @@ mapfileino(ino_t ino, long *tapesize, int *dirskipped)
         * to the usedinomap.
         */
        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)) {
@@ -788,22 +805,21 @@ static int
 convert_dir(struct ext2_dir_entry *dirent, int offset, int blocksize, char *buf, void *private)
 {
        struct convert_dir_context *p;
-       struct direct *dp;
+       struct olddirect *dp;
        int reclen;
 
        p = (struct convert_dir_context *)private;
 
        reclen = EXT2_DIR_REC_LEN((dirent->name_len & 0xFF) + 1);
        if (((p->offset + reclen - 1) / p->bs) != (p->offset / p->bs)) {
-               dp = (struct direct *)(p->buf + p->prev_offset);
+               dp = (struct olddirect *)(p->buf + p->prev_offset);
                dp->d_reclen += p->bs - (p->offset % p->bs);
                p->offset += p->bs - (p->offset % p->bs);
        }
 
-       dp = (struct direct *)(p->buf + p->offset);
+       dp = (struct olddirect *)(p->buf + p->offset);
        dp->d_ino = dirent->inode;
        dp->d_reclen = reclen;
-       dp->d_type = 0;
        dp->d_namlen = dirent->name_len & 0xFF;
        strncpy(dp->d_name, dirent->name, dp->d_namlen);
        dp->d_name[dp->d_namlen] = '\0';