Check contents of symbolic links.
This commit is contained in:
parent
4a713d8b6d
commit
21c06cfa1f
1 changed files with 36 additions and 0 deletions
|
@ -198,6 +198,8 @@ _PROTOTYPE(int chkdots, (Ino_t ino, off_t pos, dir_struct *dp, Ino_t exp));
|
||||||
_PROTOTYPE(int chkname, (Ino_t ino, dir_struct *dp));
|
_PROTOTYPE(int chkname, (Ino_t ino, dir_struct *dp));
|
||||||
_PROTOTYPE(int chkentry, (Ino_t ino, off_t pos, dir_struct *dp));
|
_PROTOTYPE(int chkentry, (Ino_t ino, off_t pos, dir_struct *dp));
|
||||||
_PROTOTYPE(int chkdirzone, (Ino_t ino, d_inode *ip, off_t pos, zone_nr zno));
|
_PROTOTYPE(int chkdirzone, (Ino_t ino, d_inode *ip, off_t pos, zone_nr zno));
|
||||||
|
_PROTOTYPE(int chksymlinkzone, (Ino_t ino, d_inode *ip, off_t pos,
|
||||||
|
zone_nr zno));
|
||||||
_PROTOTYPE(void errzone, (char *mess, zone_nr zno, int level, off_t pos));
|
_PROTOTYPE(void errzone, (char *mess, zone_nr zno, int level, off_t pos));
|
||||||
_PROTOTYPE(int markzone, (zone_nr zno, int level, off_t pos));
|
_PROTOTYPE(int markzone, (zone_nr zno, int level, off_t pos));
|
||||||
_PROTOTYPE(int chkindzone, (Ino_t ino, d_inode *ip, off_t *pos, zone_nr zno, int level));
|
_PROTOTYPE(int chkindzone, (Ino_t ino, d_inode *ip, off_t *pos, zone_nr zno, int level));
|
||||||
|
@ -1111,6 +1113,37 @@ zone_nr zno;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int chksymlinkzone(ino, ip, pos, zno)
|
||||||
|
ino_t ino;
|
||||||
|
d_inode *ip;
|
||||||
|
off_t pos;
|
||||||
|
zone_nr zno;
|
||||||
|
{
|
||||||
|
long offset;
|
||||||
|
size_t len;
|
||||||
|
char target[PATH_MAX+1];
|
||||||
|
|
||||||
|
if (ip->i_size > PATH_MAX)
|
||||||
|
fatal("chksymlinkzone: fsck program inconsistency\n");
|
||||||
|
offset = zaddr(zno);
|
||||||
|
devread(offset, target, ip->i_size);
|
||||||
|
target[ip->i_size]= '\0';
|
||||||
|
len= strlen(target);
|
||||||
|
if (len != ip->i_size)
|
||||||
|
{
|
||||||
|
printf("bad size in symbolic link (%d instead of %d) ",
|
||||||
|
ip->i_size, len);
|
||||||
|
printpath(2, 0);
|
||||||
|
if (yes(". update")) {
|
||||||
|
setbit(spec_imap, (bit_nr) ino);
|
||||||
|
ip->i_size = len;
|
||||||
|
devwrite(inoaddr(ino), (char *) ip, INODE_SIZE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* There is something wrong with the given zone. Print some details. */
|
/* There is something wrong with the given zone. Print some details. */
|
||||||
void errzone(mess, zno, level, pos)
|
void errzone(mess, zno, level, pos)
|
||||||
char *mess;
|
char *mess;
|
||||||
|
@ -1206,6 +1239,9 @@ int level;
|
||||||
if ((ip->i_mode & I_TYPE) == I_DIRECTORY &&
|
if ((ip->i_mode & I_TYPE) == I_DIRECTORY &&
|
||||||
!chkdirzone(ino, ip, *pos, zno))
|
!chkdirzone(ino, ip, *pos, zno))
|
||||||
return(0);
|
return(0);
|
||||||
|
if ((ip->i_mode & I_TYPE) == I_SYMBOLIC_LINK &&
|
||||||
|
!chksymlinkzone(ino, ip, *pos, zno))
|
||||||
|
return(0);
|
||||||
*pos += ZONE_SIZE;
|
*pos += ZONE_SIZE;
|
||||||
return(1);
|
return(1);
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in a new issue