static struct ext2_group_desc *ext2_read_gdt(struct ext2_desc *desc) { ssize_t rdlen; struct ext2_group_desc *gdt; size_t gdt_size = desc->group_count * sizeof(*gdt); gdt = malloc(gdt_size); if (gdt == NULL) { pr_error_info("malloc"); return NULL; } rdlen = ffile_readfrom(desc->fd, gdt, gdt_size, BOOT_BLOCK_SIZE + desc->block_size); if ((size_t) rdlen != gdt_size) { pr_error_info("ffile_readfrom"); goto out_free_gdt; } return gdt; out_free_gdt: free(gdt); return NULL; }
static int ext2_read_directory_entry(struct ext2_desc *desc, off_t offset, struct ext2_directory_entry *entry) { ssize_t rdlen; rdlen = ffile_readfrom(desc->fd, entry, EXT2_DIR_ENTRY_HEADER_SIZE, offset); if (rdlen < 0) { pr_error_info("read"); return rdlen; } if (entry->inode == 0) { pr_red_info("inode is zero"); return -EINVAL; } if (entry->name_len == 0) { pr_red_info("name length is zero"); return -EINVAL; } if (entry->rec_len < EXT2_DIR_ENTRY_HEADER_SIZE + entry->name_len) { pr_red_info("rec_len = %d", entry->rec_len); return -EINVAL; } rdlen = ffile_read(desc->fd, entry->name, entry->name_len); if (rdlen < 0) { pr_error_info("read"); return rdlen; } entry->name[rdlen] = 0; #if CAVAN_EXT2_DEBUG show_ext2_directory_entry(entry); #endif return 0; }
static ssize_t ext2_read_block(struct ext2_desc *desc, u64 index, void *blocks, size_t count) { off_t offset = block_index_to_offset(desc, index); return ffile_readfrom(desc->fd, blocks, desc->block_size * count, offset); }
static ssize_t vfat_app_device_read_byte(struct cavan_block_device *bdev, u64 index, u32 offset, void *buff, size_t size) { return ffile_readfrom(*(int *) bdev->context, buff, size, (index << bdev->block_shift) + offset); }
static ssize_t vfat_app_device_read_block(struct cavan_block_device *bdev, u64 index, void *buff, size_t count) { return ffile_readfrom(*(int *) bdev->context, buff, count << bdev->block_shift, index << bdev->block_shift); }