projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
arbitrarily cut off searching around orphaned directory loops
[unix-history]
/
usr
/
src
/
sbin
/
dump
/
traverse.c
diff --git
a/usr/src/sbin/dump/traverse.c
b/usr/src/sbin/dump/traverse.c
index
fb89bc3
..
27b4db6
100644
(file)
--- a/
usr/src/sbin/dump/traverse.c
+++ b/
usr/src/sbin/dump/traverse.c
@@
-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
- b
lkclr
(idblk, sblock->fs_bsize);
+ b
zero
(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)");
-}