From d60d0cab030e51db780f85ebe4f17e17a7f3c3c5 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Fri, 17 Jul 2009 16:08:57 +0200 Subject: [PATCH] befs works --- fs/befs.c | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/fs/befs.c b/fs/befs.c index f6b38412..76d5208c 100644 --- a/fs/befs.c +++ b/fs/befs.c @@ -35,7 +35,7 @@ #define GRUB_BEFS_INODE_MAGIC 0x64358428 -#define GRUB_BEFS_BTREE_MAGIC 0x65768995 +#define GRUB_BEFS_BTREE_MAGIC 0x69f6c2e8 #define GRUB_BEFS_BNODE_SIZE 1024 @@ -59,8 +59,8 @@ #define B_KEY_INDEX_OFFSET(node) ((grub_uint16_t *) \ ((char *) (node) + \ - sizeof (struct grub_befs_bnode) + \ - ((node->key_size + 3) & ~3))) + ((sizeof (struct grub_befs_bnode) + \ + node->key_size + 7) & ~7))) #define B_KEY_VALUE_OFFSET(node) ((grub_befs_bvalue_t *) \ ((char *) B_KEY_INDEX_OFFSET (node) + \ @@ -81,7 +81,7 @@ struct grub_befs_blockrun grub_uint32_t group; grub_uint16_t start; grub_uint16_t len; -}; +} __attribute__ ((packed)); struct grub_befs_datastream { @@ -92,26 +92,27 @@ struct grub_befs_datastream struct grub_befs_blockrun double_indirect; grub_befs_off_t max_double_indirect_range; grub_befs_off_t size; -}; +} __attribute__ ((packed)); struct grub_befs_bnode { grub_befs_bvalue_t left; grub_befs_bvalue_t right; grub_befs_bvalue_t overflow; - grub_uint32_t key_count; - grub_uint32_t key_size; + grub_uint16_t key_count; + grub_uint16_t key_size; char key_data[0]; -}; +} __attribute__ ((packed)); struct grub_befs_btree { grub_uint32_t magic; - grub_befs_bvalue_t root; + grub_uint32_t unused1; grub_uint32_t tree_depth; - grub_befs_bvalue_t last_node; - grub_befs_bvalue_t first_free; -} ; + grub_uint32_t unused2; + grub_befs_bvalue_t root; + grub_uint32_t unused3[4]; +} __attribute__ ((packed)); struct grub_befs_sblock { @@ -138,7 +139,7 @@ struct grub_befs_sblock struct grub_befs_blockrun index_dir; // Directory of index files. grub_uint32_t boot_loader_size; grub_uint32_t pad[7]; -}; +} __attribute__ ((packed)); struct grub_befs_inode { @@ -148,18 +149,17 @@ struct grub_befs_inode grub_uint32_t gid; grub_uint32_t mode; grub_uint32_t flags; - grub_uint32_t link_count; grub_befs_bigtime create_time; grub_befs_bigtime modified_time; struct grub_befs_blockrun parent; struct grub_befs_blockrun attrib_dir; grub_uint32_t index_type; /* Key data-key only used for index files */ grub_uint32_t inode_size; - void* vnode; + grub_uint32_t unused; struct grub_befs_datastream stream; grub_uint32_t pad[4]; grub_uint32_t small_data[1]; -}; +} __attribute__ ((packed)); struct grub_fshelp_node { @@ -316,7 +316,7 @@ grub_befs_iterate_dir (grub_fshelp_node_t dir, return 0; grub_befs_read_file (dir, 0, U64 (sb, head.root), - GRUB_BEFS_BNODE_SIZE, (char *) node); + GRUB_BEFS_BNODE_SIZE, (char *) node); if (grub_errno) return 0; @@ -343,7 +343,7 @@ grub_befs_iterate_dir (grub_fshelp_node_t dir, key_start = U16 (sb, (cur_key > 0) ? index[cur_key - 1] : 0); key_size = U16 (sb, index[cur_key]) - key_start; - if (key_size) + if (key_size > 0) { char filename [key_size + 1]; struct grub_fshelp_node *fdiro; @@ -357,7 +357,7 @@ grub_befs_iterate_dir (grub_fshelp_node_t dir, if (grub_befs_read_inode (dir->data, U64 (sb, B_KEY_VALUE_OFFSET (node) [cur_key]), &fdiro->inode)) - return 0; + return 0; grub_memcpy (filename, &node->key_data[key_start], key_size); filename [key_size] = 0; @@ -448,11 +448,6 @@ grub_befs_validate_sblock (struct grub_befs_sblock *sb) sb->block_per_group = 1 << (sb->alloc_group_shift); - grub_dprintf ("befs", "tests (%d %d %d) (%d %d %ld)\n", - sb->alloc_group_shift, - sb->block_per_group, sb->block_size, - sb->alloc_group_count, sb->block_per_group, sb->num_blocks); - return 1; } @@ -487,9 +482,9 @@ grub_befs_mount (grub_disk_t disk) data->disk = disk; if (grub_befs_read_inode (data, - grub_befs_run_to_num (&data->sblock, - &data->sblock.root_dir), - data->inode)) + grub_befs_run_to_num (&data->sblock, + &data->sblock.root_dir), + data->inode)) goto fail; return data; @@ -560,7 +555,7 @@ grub_befs_dir (grub_device_t device, const char *path, int (*hook) (const char *filename, const struct grub_dirhook_info *info)) { - struct grub_befs_data *data = 0;; + struct grub_befs_data *data = 0; struct grub_fshelp_node *fdiro = 0; auto int NESTED_FUNC_ATTR iterate (const char *filename, -- 2.11.4.GIT