2009-06-05 Michael Scherer <misc@mandriva.org>
* fs/hfsplus.c (grub_hfsplus_mount): Determine if the filesystem uses case sensitive btree. (grub_hfsplus_iterate_dir): Use GRUB_FSHELP_CASE_INSENSITIVE only for case insensitive filesystems.
This commit is contained in:
parent
8ee1e0d939
commit
408305be7a
2 changed files with 25 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2009-06-05 Michael Scherer <misc@mandriva.org>
|
||||||
|
|
||||||
|
* fs/hfsplus.c (grub_hfsplus_mount): Determine if the filesystem
|
||||||
|
uses case sensitive btree.
|
||||||
|
(grub_hfsplus_iterate_dir): Use GRUB_FSHELP_CASE_INSENSITIVE
|
||||||
|
only for case insensitive filesystems.
|
||||||
|
|
||||||
2009-06-05 Vladimir Serbinenko <phcoder@gmail.com>
|
2009-06-05 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* conf/i386-pc.rmk (efiemu_mod_CFLAGS): remove -Werror -Wall
|
* conf/i386-pc.rmk (efiemu_mod_CFLAGS): remove -Werror -Wall
|
||||||
|
|
21
fs/hfsplus.c
21
fs/hfsplus.c
|
@ -99,6 +99,13 @@ struct grub_hfsplus_btheader
|
||||||
grub_uint32_t last_leaf_node;
|
grub_uint32_t last_leaf_node;
|
||||||
grub_uint16_t nodesize;
|
grub_uint16_t nodesize;
|
||||||
grub_uint16_t keysize;
|
grub_uint16_t keysize;
|
||||||
|
grub_uint32_t total_nodes;
|
||||||
|
grub_uint32_t free_nodes;
|
||||||
|
grub_uint16_t reserved1;
|
||||||
|
grub_uint32_t clump_size; /* ignored */
|
||||||
|
grub_uint8_t btree_type;
|
||||||
|
grub_uint8_t key_compare;
|
||||||
|
grub_uint32_t attributes;
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
/* The on disk layout of a catalog key. */
|
/* The on disk layout of a catalog key. */
|
||||||
|
@ -164,6 +171,9 @@ enum grub_hfsplus_filetype
|
||||||
GRUB_HFSPLUS_FILETYPE_REG_THREAD = 4
|
GRUB_HFSPLUS_FILETYPE_REG_THREAD = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define GRUB_HFSPLUSX_BINARYCOMPARE 0xBC
|
||||||
|
#define GRUB_HFSPLUSX_CASEFOLDING 0xCF
|
||||||
|
|
||||||
/* Internal representation of a catalog key. */
|
/* Internal representation of a catalog key. */
|
||||||
struct grub_hfsplus_catkey_internal
|
struct grub_hfsplus_catkey_internal
|
||||||
{
|
{
|
||||||
|
@ -224,6 +234,7 @@ struct grub_hfsplus_data
|
||||||
/* This is the offset into the physical disk for an embedded HFS+
|
/* This is the offset into the physical disk for an embedded HFS+
|
||||||
filesystem (one inside a plain HFS wrapper). */
|
filesystem (one inside a plain HFS wrapper). */
|
||||||
int embedded_offset;
|
int embedded_offset;
|
||||||
|
int case_sensitive;
|
||||||
};
|
};
|
||||||
|
|
||||||
static grub_dl_t my_mod;
|
static grub_dl_t my_mod;
|
||||||
|
@ -376,6 +387,7 @@ grub_hfsplus_mount (grub_disk_t disk)
|
||||||
struct grub_hfsplus_data *data;
|
struct grub_hfsplus_data *data;
|
||||||
struct grub_hfsplus_btheader header;
|
struct grub_hfsplus_btheader header;
|
||||||
struct grub_hfsplus_btnode node;
|
struct grub_hfsplus_btnode node;
|
||||||
|
grub_uint16_t magic;
|
||||||
union {
|
union {
|
||||||
struct grub_hfs_sblock hfs;
|
struct grub_hfs_sblock hfs;
|
||||||
struct grub_hfsplus_volheader hfsplus;
|
struct grub_hfsplus_volheader hfsplus;
|
||||||
|
@ -423,8 +435,8 @@ grub_hfsplus_mount (grub_disk_t disk)
|
||||||
|
|
||||||
/* Make sure this is an HFS+ filesystem. XXX: Do we really support
|
/* Make sure this is an HFS+ filesystem. XXX: Do we really support
|
||||||
HFX? */
|
HFX? */
|
||||||
if ((grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUS_MAGIC)
|
magic = grub_be_to_cpu16 (volheader.hfsplus.magic);
|
||||||
&& (grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUSX_MAGIC))
|
if ((magic != GRUB_HFSPLUS_MAGIC) && (magic != GRUB_HFSPLUSX_MAGIC))
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FS, "not a HFS+ filesystem");
|
grub_error (GRUB_ERR_BAD_FS, "not a HFS+ filesystem");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -464,6 +476,8 @@ grub_hfsplus_mount (grub_disk_t disk)
|
||||||
|
|
||||||
data->catalog_tree.root = grub_be_to_cpu32 (header.root);
|
data->catalog_tree.root = grub_be_to_cpu32 (header.root);
|
||||||
data->catalog_tree.nodesize = grub_be_to_cpu16 (header.nodesize);
|
data->catalog_tree.nodesize = grub_be_to_cpu16 (header.nodesize);
|
||||||
|
data->case_sensitive = ((magic == GRUB_HFSPLUSX_MAGIC) &&
|
||||||
|
(header.key_compare == GRUB_HFSPLUSX_BINARYCOMPARE));
|
||||||
|
|
||||||
if (! grub_hfsplus_read_file (&data->extoverflow_tree.file, 0,
|
if (! grub_hfsplus_read_file (&data->extoverflow_tree.file, 0,
|
||||||
sizeof (struct grub_hfsplus_btnode),
|
sizeof (struct grub_hfsplus_btnode),
|
||||||
|
@ -772,7 +786,8 @@ grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
|
||||||
catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
|
catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
|
||||||
|
|
||||||
/* hfs+ is case insensitive. */
|
/* hfs+ is case insensitive. */
|
||||||
type |= GRUB_FSHELP_CASE_INSENSITIVE;
|
if (! dir->data->case_sensitive)
|
||||||
|
type |= GRUB_FSHELP_CASE_INSENSITIVE;
|
||||||
|
|
||||||
/* Only accept valid nodes. */
|
/* Only accept valid nodes. */
|
||||||
if (grub_strlen (filename) == grub_be_to_cpu16 (catkey->namelen))
|
if (grub_strlen (filename) == grub_be_to_cpu16 (catkey->namelen))
|
||||||
|
|
Loading…
Reference in a new issue