arbitrarily cut off searching around orphaned directory loops
[unix-history] / usr / src / sbin / dump / traverse.c
index f202a7b..27b4db6 100644 (file)
@@ -1,4 +1,4 @@
-static char *sccsid = "@(#)traverse.c  1.4 (Berkeley) %G%";
+static char *sccsid = "@(#)traverse.c  1.14 (Berkeley) %G%";
 
 #include "dump.h"
 
 
 #include "dump.h"
 
@@ -40,7 +40,7 @@ mark(ip)
        if ((ip->di_mtime >= spcl.c_ddate || ip->di_ctime >= spcl.c_ddate) &&
            !BIT(ino, nodmap)) {
                BIS(ino, nodmap);
        if ((ip->di_mtime >= spcl.c_ddate || ip->di_ctime >= spcl.c_ddate) &&
            !BIT(ino, nodmap)) {
                BIS(ino, nodmap);
-               if (f != IFREG && f != IFDIR) {
+               if (f != IFREG && f != IFDIR && f != IFLNK) {
                        esize += 1;
                        return;
                }
                        esize += 1;
                        return;
                }
@@ -52,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++;
@@ -77,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];
@@ -89,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);
                }
        }
 }
                }
        }
 }
@@ -116,7 +120,7 @@ dump(ip)
        spcl.c_type = TS_INODE;
        spcl.c_count = 0;
        i = ip->di_mode & IFMT;
        spcl.c_type = TS_INODE;
        spcl.c_count = 0;
        i = ip->di_mode & IFMT;
-       if ((i != IFDIR && i != IFREG) || ip->di_size == 0) {
+       if ((i != IFDIR && i != IFREG && i != IFLNK) || ip->di_size == 0) {
                spclrec();
                return;
        }
                spclrec();
                return;
        }
@@ -146,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);
@@ -170,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;
@@ -221,7 +225,7 @@ spclrec()
        register int s, i, *ip;
 
        spcl.c_inumber = ino;
        register int s, i, *ip;
 
        spcl.c_inumber = ino;
-       spcl.c_magic = MAGIC;
+       spcl.c_magic = NFS_MAGIC;
        spcl.c_checksum = 0;
        ip = (int *)&spcl;
        s = 0;
        spcl.c_checksum = 0;
        ip = (int *)&spcl;
        s = 0;
@@ -231,34 +235,39 @@ 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 char *cp;
-       register i;
-       register ino_t in;
-       struct direct dblk[MAXDIRPB];
+       register struct direct *dp;
+       long loc;
+       char dblk[MAXBSIZE];
 
        if(dadded)
                return;
 
        if(dadded)
                return;
-       bread(fsbtodb(sblock, d), (char *)dblk, size);
-       for(i=0; i < DIRPB(sblock); i++) {
-               in = dblk[i].d_ino;
-               if(in == 0)
+       bread(fsbtodb(sblock, d), dblk, size);
+       if (filesize > size)
+               filesize = size;
+       for (loc = 0; loc < filesize; ) {
+               dp = (struct direct *)(dblk + loc);
+               if (dp->d_reclen == 0) {
+                       msg("corrupted directory, inumber %d\n", ino);
+                       break;
+               }
+               loc += dp->d_reclen;
+               if(dp->d_ino == 0)
                        continue;
                        continue;
-               cp = dblk[i].d_name;
-               if(cp[0] == '.') {
-                       if(cp[1] == '\0')
+               if(dp->d_name[0] == '.') {
+                       if(dp->d_name[1] == '\0')
                                continue;
                                continue;
-                       if(cp[1] == '.' && cp[2] == '\0')
+                       if(dp->d_name[1] == '.' && dp->d_name[2] == '\0')
                                continue;
                }
                                continue;
                }
-               if(BIT(in, nodmap)) {
+               if(BIT(dp->d_ino, nodmap)) {
                        dadded++;
                        return;
                }
                        dadded++;
                        return;
                }
-               if(BIT(in, dirmap))
+               if(BIT(dp->d_ino, dirmap))
                        nsubdir++;
        }
 }
                        nsubdir++;
        }
 }
@@ -273,7 +282,7 @@ getino(ino)
        if (ino >= minino && ino < maxino) {
                return (&itab[ino - minino]);
        }
        if (ino >= minino && ino < maxino) {
                return (&itab[ino - minino]);
        }
-       bread(fsbtodb(sblock, itod(ino, sblock)), itab, sblock->fs_bsize);
+       bread(fsbtodb(sblock, itod(sblock, ino)), itab, sblock->fs_bsize);
        minino = ino - (ino % INOPB(sblock));
        maxino = minino + INOPB(sblock);
        return (&itab[ino - minino]);
        minino = ino - (ino % INOPB(sblock));
        maxino = minino + INOPB(sblock);
        return (&itab[ino - minino]);
@@ -314,10 +323,3 @@ bread(da, ba, c)
                }
        }
 }
                }
        }
 }
-
-blkclr(cp, size)
-       char *cp;
-       long size;
-{
-       asm("movc5      $0,(r0),$0,8(ap),*4(ap)");
-}