[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[2267] 2009-06-05 Michael Scherer <address@hidden>
From: |
Pavel Roskin |
Subject: |
[2267] 2009-06-05 Michael Scherer <address@hidden> |
Date: |
Fri, 05 Jun 2009 21:00:43 +0000 |
Revision: 2267
http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2267
Author: proski
Date: 2009-06-05 21:00:43 +0000 (Fri, 05 Jun 2009)
Log Message:
-----------
2009-06-05 Michael Scherer <address@hidden>
* 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.
Modified Paths:
--------------
trunk/grub2/ChangeLog
trunk/grub2/fs/hfsplus.c
Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog 2009-06-05 01:28:18 UTC (rev 2266)
+++ trunk/grub2/ChangeLog 2009-06-05 21:00:43 UTC (rev 2267)
@@ -1,3 +1,10 @@
+2009-06-05 Michael Scherer <address@hidden>
+
+ * 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 <address@hidden>
* conf/i386-pc.rmk (efiemu_mod_CFLAGS): remove -Werror -Wall
Modified: trunk/grub2/fs/hfsplus.c
===================================================================
--- trunk/grub2/fs/hfsplus.c 2009-06-05 01:28:18 UTC (rev 2266)
+++ trunk/grub2/fs/hfsplus.c 2009-06-05 21:00:43 UTC (rev 2267)
@@ -99,6 +99,13 @@
grub_uint32_t last_leaf_node;
grub_uint16_t nodesize;
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));
/* The on disk layout of a catalog key. */
@@ -164,6 +171,9 @@
GRUB_HFSPLUS_FILETYPE_REG_THREAD = 4
};
+#define GRUB_HFSPLUSX_BINARYCOMPARE 0xBC
+#define GRUB_HFSPLUSX_CASEFOLDING 0xCF
+
/* Internal representation of a catalog key. */
struct grub_hfsplus_catkey_internal
{
@@ -224,6 +234,7 @@
/* This is the offset into the physical disk for an embedded HFS+
filesystem (one inside a plain HFS wrapper). */
int embedded_offset;
+ int case_sensitive;
};
static grub_dl_t my_mod;
@@ -376,6 +387,7 @@
struct grub_hfsplus_data *data;
struct grub_hfsplus_btheader header;
struct grub_hfsplus_btnode node;
+ grub_uint16_t magic;
union {
struct grub_hfs_sblock hfs;
struct grub_hfsplus_volheader hfsplus;
@@ -423,8 +435,8 @@
/* Make sure this is an HFS+ filesystem. XXX: Do we really support
HFX? */
- if ((grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUS_MAGIC)
- && (grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUSX_MAGIC))
+ magic = grub_be_to_cpu16 (volheader.hfsplus.magic);
+ if ((magic != GRUB_HFSPLUS_MAGIC) && (magic != GRUB_HFSPLUSX_MAGIC))
{
grub_error (GRUB_ERR_BAD_FS, "not a HFS+ filesystem");
goto fail;
@@ -464,6 +476,8 @@
data->catalog_tree.root = grub_be_to_cpu32 (header.root);
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,
sizeof (struct grub_hfsplus_btnode),
@@ -772,7 +786,8 @@
catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
/* hfs+ is case insensitive. */
- type |= GRUB_FSHELP_CASE_INSENSITIVE;
+ if (! dir->data->case_sensitive)
+ type |= GRUB_FSHELP_CASE_INSENSITIVE;
/* Only accept valid nodes. */
if (grub_strlen (filename) == grub_be_to_cpu16 (catkey->namelen))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [2267] 2009-06-05 Michael Scherer <address@hidden>,
Pavel Roskin <=