+ dp->d_reclen = DIRBLKSIZ;
+ dp->d_ino = 0;
+ dp->d_namlen = 0;
+ dirty(&fileblk);
+ }
+ if (filsize <= 0 || dirp->loc >= dirp->blksiz)
+ return NULL;
+ dp = (DIRECT *)(dirblk.b_buf + dirp->loc);
+ dirp->loc += dp->d_reclen;
+ filsize -= dp->d_reclen;
+ ndp = (DIRECT *)(dirblk.b_buf + dirp->loc);
+ if (dirp->loc < dirp->blksiz && filsize > 0 &&
+ (ndp->d_ino >= imax ||
+ ndp->d_namlen > MAXNAMLEN || ndp->d_namlen < 0 ||
+ ndp->d_reclen <= 0 ||
+ ndp->d_reclen > DIRBLKSIZ - (dirp->loc % DIRBLKSIZ))) {
+ size = DIRBLKSIZ - (dirp->loc % DIRBLKSIZ);
+ dirp->loc += size;
+ filsize -= size;
+ if (dirp->fix == 0) {
+ pwarn("DIRECTORY %D CORRUPTED", dirp->number);
+ dirp->fix = 1;
+ if (preen) {
+ printf(" (SALVAGED)\n");
+ dirp->fix = 2;
+ } else if (reply("SALVAGE") != 0)
+ dirp->fix = 2;
+ }
+ if (dirp->fix > 2) {
+ dp->d_reclen += size;
+ dirty(&fileblk);