X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;ds=sidebyside;f=dump%2Ftraverse.c;h=a8ca3a4f08cba32c08b0b418be65712bc516d410;hb=54ec08c6ea42e9189423def508c5119f33466db2;hp=0ea5b96f7b355255844bc5f85672543ed2c25f15;hpb=a94ecd1155631b9f88488a19268874c0e3c6601c;p=dump.git diff --git a/dump/traverse.c b/dump/traverse.c index 0ea5b96..a8ca3a4 100644 --- a/dump/traverse.c +++ b/dump/traverse.c @@ -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.37 2001/07/19 09:49:35 stelian Exp $"; #endif /* not lint */ #include @@ -55,7 +55,11 @@ static const char rcsid[] = #include #include #ifdef __linux__ +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #include #include @@ -98,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) @@ -158,13 +159,9 @@ 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); - } - if (!exclude_ino(EXT2_RESIZE_INO)) - iexclude_list[iexclude_num++] = EXT2_RESIZE_INO; + journal_ino) + do_exclude_ino(journal_ino, "journal inode"); + do_exclude_ino(EXT2_RESIZE_INO, "resize inode"); } } return retval; @@ -220,22 +217,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)) @@ -796,9 +777,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 +897,17 @@ 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 */ + if (i_size > bc.next_block*sblock->fs_fsize) { + remaining = i_size - bc.next_block*sblock->fs_fsize; + 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); }