Le mercredi 03 juin 2009 à 11:26 +0200, Vladimir 'phcoder' Serbinenko a
écrit :
> I see a two last problems with your patch:
> +  grub_uint32_t clump_size;  // ignored
> We use /* Ignored.  */ style of comments
> @@ -3106,7 +3112,6 @@
>         (freetype_libs): Likewise.
> 
>         * util/grub-mkfont.c: New file.
> -
> Bogus hunk

Both are fixed in this (hopefully) last version of the patch.

-- 
Michael Scherer
diff --git a/ChangeLog b/ChangeLog
index 893a21c..64a2e04 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2009-06-03  Michael Scherer  <m...@mandriva.org>
+
+	* fs/hfsplus.c: Complete support of hfs+ and hfsx, by doing
+	case insensitive comparaison when needed ( ie for hfsplus, and depending
+	on some settings for hfsx, found in the header )
+
 2009-05-26  Pavel Roskin  <pro...@gnu.org>
 
 	* genmk.rb: Avoid shadowing variable `s', rename the outer `s'
diff --git a/fs/hfsplus.c b/fs/hfsplus.c
index 69794c9..37445c9 100644
--- a/fs/hfsplus.c
+++ b/fs/hfsplus.c
@@ -99,6 +99,13 @@ struct grub_hfsplus_btheader
   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 @@ enum grub_hfsplus_filetype
     GRUB_HFSPLUS_FILETYPE_REG_THREAD = 4
   };
 
+#define GRUB_HFSPLUSX_BINARYCOMPARE 0xCF
+#define GRUB_HFSPLUSX_CASEFOLDING   0xBC
+
 /* Internal representation of a catalog key.  */
 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+
      filesystem (one inside a plain HFS wrapper).  */
   int embedded_offset;
+  int catalog_cmp_key;
 };
 
 static grub_dl_t my_mod;
@@ -464,6 +475,7 @@ grub_hfsplus_mount (grub_disk_t disk)
 
   data->catalog_tree.root = grub_be_to_cpu32 (header.root);
   data->catalog_tree.nodesize = grub_be_to_cpu16 (header.nodesize);
+  data->catalog_cmp_key = header.key_compare;
 
   if (! grub_hfsplus_read_file (&data->extoverflow_tree.file, 0,
 				sizeof (struct grub_hfsplus_btnode),
@@ -694,6 +706,20 @@ grub_hfsplus_btree_search (struct grub_hfsplus_btree *btree,
     }
 }
 
+static inline int
+grub_hfsplus_is_case_insentive (struct grub_hfsplus_data *data)
+{
+  switch (grub_be_to_cpu16 (data->volheader.magic))
+    {
+      case GRUB_HFSPLUS_MAGIC:
+        return 1;
+      case GRUB_HFSPLUSX_MAGIC:
+        return data->catalog_cmp_key == GRUB_HFSPLUSX_CASEFOLDING;
+      default:
+        return 0;
+    }
+}
+
 static int
 grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
 			  int NESTED_FUNC_ATTR
@@ -772,7 +798,8 @@ grub_hfsplus_iterate_dir (grub_fshelp_node_t dir,
 	catkey->name[i] = grub_be_to_cpu16 (catkey->name[i]);
 
       /* hfs+ is case insensitive.  */
-      type |= GRUB_FSHELP_CASE_INSENSITIVE;
+      if (grub_hfsplus_is_case_insentive (dir->data))
+          type |= GRUB_FSHELP_CASE_INSENSITIVE;
 
       /* Only accept valid nodes.  */
       if (grub_strlen (filename) == grub_be_to_cpu16 (catkey->namelen))
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to