SCCS-vsn: sbin/fsck/main.c 2.29
-char version[] = "@(#)main.c 2.28 (Berkeley) %G%";
+char version[] = "@(#)main.c 2.29 (Berkeley) %G%";
#endif
#include <stdio.h>
#endif
#include <stdio.h>
if (dirp->d_ino != idesc->id_number) {
direrr(idesc->id_number, "BAD INODE NUMBER FOR '.'");
dirp->d_ino = idesc->id_number;
if (dirp->d_ino != idesc->id_number) {
direrr(idesc->id_number, "BAD INODE NUMBER FOR '.'");
dirp->d_ino = idesc->id_number;
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
} else if (dirp->d_reclen < 2 * entrysize) {
proto.d_reclen = dirp->d_reclen;
bcopy((char *)&proto, (char *)dirp, entrysize);
} else if (dirp->d_reclen < 2 * entrysize) {
proto.d_reclen = dirp->d_reclen;
bcopy((char *)&proto, (char *)dirp, entrysize);
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
} else {
n = dirp->d_reclen - entrysize;
proto.d_reclen = entrysize;
} else {
n = dirp->d_reclen - entrysize;
proto.d_reclen = entrysize;
dirp = (DIRECT *)((char *)(dirp) + entrysize);
bzero((char *)dirp, n);
dirp->d_reclen = n;
dirp = (DIRECT *)((char *)(dirp) + entrysize);
bzero((char *)dirp, n);
dirp->d_reclen = n;
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
}
chk1:
if (idesc->id_entryno > 1)
}
chk1:
if (idesc->id_entryno > 1)
if (dirp->d_ino != idesc->id_parent) {
direrr(idesc->id_number, "BAD INODE NUMBER FOR '..'");
dirp->d_ino = idesc->id_parent;
if (dirp->d_ino != idesc->id_parent) {
direrr(idesc->id_number, "BAD INODE NUMBER FOR '..'");
dirp->d_ino = idesc->id_parent;
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
} else {
proto.d_reclen = dirp->d_reclen;
bcopy((char *)&proto, (char *)dirp, entrysize);
} else {
proto.d_reclen = dirp->d_reclen;
bcopy((char *)&proto, (char *)dirp, entrysize);
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
}
chk2:
if (dirp->d_ino == 0)
}
chk2:
if (dirp->d_ino == 0)
if (dirp->d_namlen == 1) {
direrr(idesc->id_number, "EXTRA '.' ENTRY");
dirp->d_ino = 0;
if (dirp->d_namlen == 1) {
direrr(idesc->id_number, "EXTRA '.' ENTRY");
dirp->d_ino = 0;
- return (KEEPON | dofix(idesc));
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
+ return (KEEPON | ret);
}
if (dirp->d_name[1] == '.') {
direrr(idesc->id_number, "EXTRA '..' ENTRY");
dirp->d_ino = 0;
}
if (dirp->d_name[1] == '.') {
direrr(idesc->id_number, "EXTRA '..' ENTRY");
dirp->d_ino = 0;
- return (KEEPON | dofix(idesc));
+ if (reply("FIX") == 1)
+ ret |= ALTERED;
+ return (KEEPON | ret);
register DINODE *dp;
struct inodesc idesc;
ino_t inumber, orphan;
register DINODE *dp;
struct inodesc idesc;
ino_t inumber, orphan;
bzero((char *)&idesc, sizeof(struct inodesc));
idesc.id_type = DATA;
bzero((char *)&idesc, sizeof(struct inodesc));
idesc.id_type = DATA;
dp->d_ino = 0;
dp->d_namlen = 0;
dp->d_name[0] = '\0';
dp->d_ino = 0;
dp->d_namlen = 0;
dp->d_name[0] = '\0';
- if (idesc->id_fix == DONTKNOW)
- direrr(idesc->id_number, "DIRECTORY CORRUPTED");
if (dofix(idesc))
dirty(&fileblk);
return (dp);
if (dofix(idesc))
dirty(&fileblk);
return (dp);
dp->d_reclen += size;
idesc->id_loc += size;
idesc->id_filesize -= size;
dp->d_reclen += size;
idesc->id_loc += size;
idesc->id_filesize -= size;
- if (idesc->id_fix == DONTKNOW)
- direrr(idesc->id_number, "DIRECTORY CORRUPTED");
if (dofix(idesc))
dirty(&fileblk);
}
if (dofix(idesc))
dirty(&fileblk);
}
dofix(idesc)
register struct inodesc *idesc;
{
dofix(idesc)
register struct inodesc *idesc;
{
switch (idesc->id_fix) {
case DONTKNOW:
switch (idesc->id_fix) {
case DONTKNOW:
- if (reply("FIX") == 0) {
+ direrr(idesc->id_number, "DIRECTORY CORRUPTED");
+ if (reply("SALVAGE") == 0) {
idesc->id_fix = NOFIX;
return (0);
}
idesc->id_fix = NOFIX;
return (0);
}