arbitrarily cut off searching around orphaned directory loops
[unix-history] / usr / src / sbin / dump / traverse.c
index fb89bc3..27b4db6 100644 (file)
@@ -1,7 +1,6 @@
-static char *sccsid = "@(#)traverse.c  1.9 (Berkeley) %G%";
+static char *sccsid = "@(#)traverse.c  1.14 (Berkeley) %G%";
 
 #include "dump.h"
 
 #include "dump.h"
-#include <dir.h>
 
 pass(fn, map)
        int (*fn)();
 
 pass(fn, map)
        int (*fn)();
@@ -53,18 +52,21 @@ add(ip)
        register struct dinode  *ip;
 {
        register int i;
        register struct dinode  *ip;
 {
        register int i;
+       long filesize;
 
        if(BIT(ino, nodmap))
                return;
        nsubdir = 0;
        dadded = 0;
 
        if(BIT(ino, nodmap))
                return;
        nsubdir = 0;
        dadded = 0;
+       filesize = ip->di_size;
        for (i = 0; i < NDADDR; i++) {
                if (ip->di_db[i] != 0)
        for (i = 0; i < NDADDR; i++) {
                if (ip->di_db[i] != 0)
-                       dsrch(ip->di_db[i], dblksize(sblock, ip, i));
+                       dsrch(ip->di_db[i], dblksize(sblock, ip, i), filesize);
+               filesize -= sblock->fs_bsize;
        }
        for (i = 0; i < NIADDR; i++) {
                if (ip->di_ib[i] != 0)
        }
        for (i = 0; i < NIADDR; i++) {
                if (ip->di_ib[i] != 0)
-                       indir(ip->di_ib[i], i);
+                       indir(ip->di_ib[i], i, &filesize);
        }
        if(dadded) {
                nadded++;
        }
        if(dadded) {
                nadded++;
@@ -78,9 +80,9 @@ add(ip)
                        BIC(ino, dirmap);
 }
 
                        BIC(ino, dirmap);
 }
 
-indir(d, n)
+indir(d, n, filesize)
        daddr_t d;
        daddr_t d;
-       int n;
+       int n, *filesize;
 {
        register i;
        daddr_t idblk[MAXNINDIR];
 {
        register i;
        daddr_t idblk[MAXNINDIR];
@@ -90,14 +92,15 @@ indir(d, n)
                for(i=0; i < NINDIR(sblock); i++) {
                        d = idblk[i];
                        if(d != 0)
                for(i=0; i < NINDIR(sblock); i++) {
                        d = idblk[i];
                        if(d != 0)
-                               dsrch(d, sblock->fs_bsize);
+                               dsrch(d, sblock->fs_bsize, *filesize);
+                       *filesize -= sblock->fs_bsize;
                }
        } else {
                n--;
                for(i=0; i < NINDIR(sblock); i++) {
                        d = idblk[i];
                        if(d != 0)
                }
        } else {
                n--;
                for(i=0; i < NINDIR(sblock); i++) {
                        d = idblk[i];
                        if(d != 0)
-                               indir(d, n);
+                               indir(d, n, filesize);
                }
        }
 }
                }
        }
 }
@@ -147,7 +150,7 @@ dmpindir(blk, lvl, size)
        if (blk != 0)
                bread(fsbtodb(sblock, blk), (char *)idblk, sblock->fs_bsize);
        else
        if (blk != 0)
                bread(fsbtodb(sblock, blk), (char *)idblk, sblock->fs_bsize);
        else
-               blkclr(idblk, sblock->fs_bsize);
+               bzero(idblk, sblock->fs_bsize);
        if (lvl <= 0) {
                if (*size < NINDIR(sblock) * sblock->fs_bsize)
                        cnt = howmany(*size, sblock->fs_fsize);
        if (lvl <= 0) {
                if (*size < NINDIR(sblock) * sblock->fs_bsize)
                        cnt = howmany(*size, sblock->fs_fsize);
@@ -171,8 +174,8 @@ blksout(blkp, frags)
 {
        int i, j, count, blks, tbperdb;
 
 {
        int i, j, count, blks, tbperdb;
 
-       blks = frags * BLKING(sblock);
-       tbperdb = BLKING(sblock) * sblock->fs_frag;
+       blks = howmany(frags * sblock->fs_fsize, TP_BSIZE);
+       tbperdb = sblock->fs_bsize / TP_BSIZE;
        for (i = 0; i < blks; i += TP_NINDIR) {
                if (i + TP_NINDIR > blks)
                        count = blks;
        for (i = 0; i < blks; i += TP_NINDIR) {
                if (i + TP_NINDIR > blks)
                        count = blks;
@@ -232,9 +235,9 @@ spclrec()
        taprec((char *)&spcl);
 }
 
        taprec((char *)&spcl);
 }
 
-dsrch(d, size)
+dsrch(d, size, filesize)
        daddr_t d;
        daddr_t d;
-       int size;
+       int size, filesize;
 {
        register struct direct *dp;
        long loc;
 {
        register struct direct *dp;
        long loc;
@@ -243,10 +246,14 @@ dsrch(d, size)
        if(dadded)
                return;
        bread(fsbtodb(sblock, d), dblk, size);
        if(dadded)
                return;
        bread(fsbtodb(sblock, d), dblk, size);
-       for (loc = 0; loc < size; ) {
+       if (filesize > size)
+               filesize = size;
+       for (loc = 0; loc < filesize; ) {
                dp = (struct direct *)(dblk + loc);
                dp = (struct direct *)(dblk + loc);
-               if (dp->d_reclen == 0)
+               if (dp->d_reclen == 0) {
+                       msg("corrupted directory, inumber %d\n", ino);
                        break;
                        break;
+               }
                loc += dp->d_reclen;
                if(dp->d_ino == 0)
                        continue;
                loc += dp->d_reclen;
                if(dp->d_ino == 0)
                        continue;
@@ -316,10 +323,3 @@ bread(da, ba, c)
                }
        }
 }
                }
        }
 }
-
-blkclr(cp, size)
-       char *cp;
-       long size;
-{
-       asm("movc5      $0,(r0),$0,8(ap),*4(ap)");
-}