X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=dump%2Ftraverse.c;h=b0a1f145ddbb8f8e9323767fb0ec8101cfbd5b49;hb=28ba5caee0ed25d3b38da769967173e5710bc10c;hp=00f03211e3da82babac98b85754f0d8dc7b7fd02;hpb=3211c85bf71bbbe784de3f4fa01a8c0f96a060d6;p=dump.git diff --git a/dump/traverse.c b/dump/traverse.c index 00f0321..b0a1f14 100644 --- a/dump/traverse.c +++ b/dump/traverse.c @@ -18,11 +18,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -41,7 +37,7 @@ #ifndef lint static const char rcsid[] = - "$Id: traverse.c,v 1.53 2003/01/10 10:31:10 stelian Exp $"; + "$Id: traverse.c,v 1.60 2004/03/10 16:26:30 stelian Exp $"; #endif /* not lint */ #include @@ -134,6 +130,17 @@ typedef ino_t ext2_ino_t; #ifndef EXT2_RESIZE_INO #define EXT2_RESIZE_INO 7 #endif +#ifndef EXT2_FT_UNKNOWN +#define EXT2_FT_UNKNOWN 0 +#define EXT2_FT_REG_FILE 1 +#define EXT2_FT_DIR 2 +#define EXT2_FT_CHRDEV 3 +#define EXT2_FT_BLKDEV 4 +#define EXT2_FT_FIFO 5 +#define EXT2_FT_SOCK 6 +#define EXT2_FT_SYMLINK 7 +#define EXT2_FT_MAX 8 +#endif int dump_fs_open(const char *disk, ext2_filsys *fs) { @@ -195,17 +202,25 @@ blockest(struct dinode const *dp) * dump blocks (sizeest vs. blkest in the indirect block * calculation). */ - blkest = howmany((u_quad_t)dp->di_blocks * 512, TP_BSIZE); + blkest = howmany((u_quad_t)dp->di_blocks * 512, fs->blocksize) * (fs->blocksize / TP_BSIZE); i_size = dp->di_size + ((u_quad_t) dp->di_size_high << 32); - sizeest = howmany(i_size, TP_BSIZE); + sizeest = howmany(i_size, fs->blocksize) * (fs->blocksize / TP_BSIZE); if (blkest > sizeest) blkest = sizeest; #ifdef __linux__ + if ((dp->di_mode & IFMT) == IFDIR) { + /* + * for directories, assume only half of space is filled + * with entries. + */ + blkest = blkest / 2; + sizeest = sizeest / 2; + } if (i_size > (u_quad_t)fs->blocksize * NDADDR) { /* calculate the number of indirect blocks on the dump tape */ blkest += howmany(sizeest - NDADDR * fs->blocksize / TP_BSIZE, - NINDIR(sblock) * EXT2_FRAGS_PER_BLOCK(fs->super)); + TP_NINDIR); } #else if (i_size > sblock->fs_bsize * NDADDR) { @@ -1231,7 +1246,7 @@ dumpmap(char *map, int type, dump_ino_t ino) writerec(cp, 0); } -#if defined __linux__ && !defined(int32_t) +#if defined(__linux__) && !defined(int32_t) #define int32_t __s32 #endif @@ -1304,7 +1319,7 @@ getino(dump_ino_t inum) /* * Read a chunk of data from the disk. * Try to recover from hard errors by reading in sector sized pieces. - * Error recovery is attempted at most breademax times before seeking + * Error recovery is attempted at most BREADEMAX times before seeking * consent from the operator to continue. */ int breaderrors = 0;