2004-06-27 Tomas Ebenlendr <ebik@ucw.cz>
* fs/ext2.c (FILETYPE_INO_MASK, FILETYPE_INO_DIRECTORY) (FILETYPE_INO_SYMLINK): New macros. (grub_ext2_find_file): Check if the node is a directory using the inode stat information instead of using the filetype in the dirent. Exclude the first character of an absolute symlink. (grub_ext2_dir): Mask out the filetype part of the mode member of the inode.
This commit is contained in:
parent
66e19ef8ba
commit
6eabba74e7
2 changed files with 28 additions and 10 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2004-06-27 Tomas Ebenlendr <ebik@ucw.cz>
|
||||||
|
|
||||||
|
* fs/ext2.c (FILETYPE_INO_MASK, FILETYPE_INO_DIRECTORY)
|
||||||
|
(FILETYPE_INO_SYMLINK): New macros.
|
||||||
|
(grub_ext2_find_file): Check if the node is a directory using the
|
||||||
|
inode stat information instead of using the filetype in the
|
||||||
|
dirent. Exclude the first character of an absolute symlink.
|
||||||
|
(grub_ext2_dir): Mask out the filetype part of the mode member of
|
||||||
|
the inode.
|
||||||
|
|
||||||
2004-05-24 Marco Gerards <metgerards@student.han.nl>
|
2004-05-24 Marco Gerards <metgerards@student.han.nl>
|
||||||
|
|
||||||
Add support for UFS version 1 and 2. Add support for the minix
|
Add support for UFS version 1 and 2. Add support for the minix
|
||||||
|
|
28
fs/ext2.c
28
fs/ext2.c
|
@ -31,6 +31,11 @@
|
||||||
#define FILETYPE_DIRECTORY 2
|
#define FILETYPE_DIRECTORY 2
|
||||||
#define FILETYPE_SYMLINK 7
|
#define FILETYPE_SYMLINK 7
|
||||||
|
|
||||||
|
/* Filetype information as used in inodes. */
|
||||||
|
#define FILETYPE_INO_MASK 0170000
|
||||||
|
#define FILETYPE_INO_DIRECTORY 0040000
|
||||||
|
#define FILETYPE_INO_SYMLINK 0120000
|
||||||
|
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
#include <grub/file.h>
|
#include <grub/file.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
|
@ -451,8 +456,14 @@ grub_ext2_find_file (struct grub_ext2_data *data, const char *path, int *ino)
|
||||||
if (dirent.namelen == namesize
|
if (dirent.namelen == namesize
|
||||||
&& !grub_strncmp (name, filename, namesize))
|
&& !grub_strncmp (name, filename, namesize))
|
||||||
{
|
{
|
||||||
|
/* Stat the inode. */
|
||||||
|
grub_ext2_read_inode (data,
|
||||||
|
grub_le_to_cpu32 (dirent.inode),
|
||||||
|
inode);
|
||||||
|
|
||||||
/* If this is a symlink, follow it. */
|
/* If this is a symlink, follow it. */
|
||||||
if (dirent.filetype == FILETYPE_SYMLINK)
|
if ((grub_le_to_cpu16 (data->inode.mode)
|
||||||
|
& FILETYPE_INO_MASK) == FILETYPE_INO_SYMLINK)
|
||||||
{
|
{
|
||||||
/* XXX: Use malloc instead? */
|
/* XXX: Use malloc instead? */
|
||||||
char symlink[blocksize];
|
char symlink[blocksize];
|
||||||
|
@ -464,11 +475,6 @@ grub_ext2_find_file (struct grub_ext2_data *data, const char *path, int *ino)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read the symlink. */
|
|
||||||
grub_ext2_read_inode (data,
|
|
||||||
grub_le_to_cpu32 (dirent.inode),
|
|
||||||
inode);
|
|
||||||
|
|
||||||
/* If the filesize of the symlink is bigger than
|
/* If the filesize of the symlink is bigger than
|
||||||
60 the symlink is stored in a separate block,
|
60 the symlink is stored in a separate block,
|
||||||
otherwise it is stored in the inode. */
|
otherwise it is stored in the inode. */
|
||||||
|
@ -490,7 +496,7 @@ grub_ext2_find_file (struct grub_ext2_data *data, const char *path, int *ino)
|
||||||
/* Check if the symlink is absolute or relative. */
|
/* Check if the symlink is absolute or relative. */
|
||||||
if (symlink[0] == '/')
|
if (symlink[0] == '/')
|
||||||
{
|
{
|
||||||
grub_strncpy (fpath, symlink, EXT2_PATH_MAX);
|
grub_strncpy (fpath, symlink + 1, EXT2_PATH_MAX);
|
||||||
name = fpath;
|
name = fpath;
|
||||||
currinode = 2;
|
currinode = 2;
|
||||||
}
|
}
|
||||||
|
@ -516,7 +522,7 @@ grub_ext2_find_file (struct grub_ext2_data *data, const char *path, int *ino)
|
||||||
grub_free (bak);
|
grub_free (bak);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fpos = 0;
|
fpos = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -526,7 +532,8 @@ grub_ext2_find_file (struct grub_ext2_data *data, const char *path, int *ino)
|
||||||
currinode = grub_le_to_cpu32 (dirent.inode);
|
currinode = grub_le_to_cpu32 (dirent.inode);
|
||||||
name = next;
|
name = next;
|
||||||
|
|
||||||
if (dirent.filetype != FILETYPE_DIRECTORY)
|
if ((grub_le_to_cpu16 (data->inode.mode)
|
||||||
|
& FILETYPE_INO_MASK) != FILETYPE_INO_DIRECTORY)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FILE_TYPE,
|
grub_error (GRUB_ERR_BAD_FILE_TYPE,
|
||||||
"not a directory");
|
"not a directory");
|
||||||
|
@ -653,7 +660,8 @@ grub_ext2_dir (grub_device_t device, const char *path,
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (!(grub_le_to_cpu16 (data->inode.mode) & 040000))
|
if ((grub_le_to_cpu16 (data->inode.mode)
|
||||||
|
& FILETYPE_INO_MASK) != FILETYPE_INO_DIRECTORY)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
grub_error (GRUB_ERR_BAD_FILE_TYPE, "not a directory");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
Loading…
Reference in a new issue