]> git.wh0rd.org - dump.git/blobdiff - dump/traverse.c
Check for the e2fsprogs header <ext2fs/ext2_fs.h> instead of the kernel header if...
[dump.git] / dump / traverse.c
index 0ea5b96f7b355255844bc5f85672543ed2c25f15..df59305113a4288ca7b9b148099b9af8f87a6fe5 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: traverse.c,v 1.32 2001/04/10 13:42:22 stelian Exp $";
+       "$Id: traverse.c,v 1.34 2001/06/18 10:58:28 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -55,7 +55,11 @@ static const char rcsid[] =
 #include <sys/param.h>
 #include <sys/stat.h>
 #ifdef __linux__
+#ifdef HAVE_EXT2FS_EXT2_FS_H
+#include <ext2fs/ext2_fs.h>
+#else
 #include <linux/ext2_fs.h>
+#endif
 #include <ext2fs/ext2fs.h>
 #include <bsdcompat.h>
 #include <compaterr.h>
@@ -796,9 +800,10 @@ void
 dumpino(struct dinode *dp, dump_ino_t ino)
 {
        unsigned long cnt;
-       fsizeT size;
+       fsizeT size, remaining;
        char buf[TP_BSIZE];
        struct old_bsd_inode obi;
+       int i;
 #ifdef __linux__
        struct block_context bc;
 #else
@@ -915,6 +920,16 @@ dumpino(struct dinode *dp, dump_ino_t ino)
        bc.next_block = NDADDR;
 
        ext2fs_block_iterate2(fs, (ext2_ino_t)ino, 0, NULL, dumponeblock, (void *)&bc);
+       /* deal with holes at the end of the inode */
+       remaining = i_size - bc.next_block*sblock->fs_fsize;
+       if (remaining > 0) 
+               for (i = 0; i < howmany(remaining, sblock->fs_fsize); i++) {
+                       bc.buf[bc.cnt++] = 0;
+                       if (bc.cnt == bc.max) {
+                               blksout (bc.buf, bc.cnt, bc.ino);
+                               bc.cnt = 0;
+                       }
+               }
        if (bc.cnt > 0) {
                blksout (bc.buf, bc.cnt, bc.ino);
        }