112
112
grub_uint32_t dummy2;
113
113
grub_uint16_t dummy3;
114
114
grub_uint16_t offset;
115
} __attribute__ ((packed)) long_dir;
115
} GRUB_PACKED long_dir;
117
117
grub_uint32_t dummy;
118
118
grub_uint32_t namelen;
120
} __attribute__ ((packed)) symlink;
121
} __attribute__ ((packed));
122
} __attribute__ ((packed));
120
} GRUB_PACKED symlink;
124
124
struct grub_squash_cache_inode
480
480
grub_squash_iterate_dir (grub_fshelp_node_t dir,
482
(*hook) (const char *filename,
483
enum grub_fshelp_filetype filetype,
484
grub_fshelp_node_t node))
481
grub_fshelp_iterate_dir_hook_t hook, void *hook_data)
486
483
grub_uint32_t off;
487
484
grub_uint32_t endoff;
515
512
grub_memcpy (node, dir,
516
513
sizeof (*node) + dir->stsize * sizeof (dir->stack[0]));
517
if (hook (".", GRUB_FSHELP_DIR, node))
514
if (hook (".", GRUB_FSHELP_DIR, node, hook_data))
520
517
if (dir->stsize != 1)
604
601
node->stack[node->stsize].ino_chunk = grub_le_to_cpu32 (dh.ino_chunk);
605
602
node->stack[node->stsize].ino_offset = grub_le_to_cpu16 (di.ino_offset);
607
r = hook (buf, filetype, node);
604
r = hook (buf, filetype, node, hook_data);
640
/* Context for grub_squash_dir. */
641
struct grub_squash_dir_ctx
643
grub_fs_dir_hook_t hook;
647
/* Helper for grub_squash_dir. */
649
grub_squash_dir_iter (const char *filename, enum grub_fshelp_filetype filetype,
650
grub_fshelp_node_t node, void *data)
652
struct grub_squash_dir_ctx *ctx = data;
653
struct grub_dirhook_info info;
655
grub_memset (&info, 0, sizeof (info));
656
info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR);
658
info.mtime = grub_le_to_cpu32 (node->ino.mtime);
660
return ctx->hook (filename, &info, ctx->hook_data);
643
663
static grub_err_t
644
664
grub_squash_dir (grub_device_t device, const char *path,
645
int (*hook) (const char *filename,
646
const struct grub_dirhook_info *info))
665
grub_fs_dir_hook_t hook, void *hook_data)
648
auto int NESTED_FUNC_ATTR iterate (const char *filename,
649
enum grub_fshelp_filetype filetype,
650
grub_fshelp_node_t node);
652
int NESTED_FUNC_ATTR iterate (const char *filename,
653
enum grub_fshelp_filetype filetype,
654
grub_fshelp_node_t node)
656
struct grub_dirhook_info info;
657
grub_memset (&info, 0, sizeof (info));
658
info.dir = ((filetype & GRUB_FSHELP_TYPE_MASK) == GRUB_FSHELP_DIR);
660
info.mtime = grub_le_to_cpu32 (node->ino.mtime);
662
return hook (filename, &info);
667
struct grub_squash_dir_ctx ctx = { hook, hook_data };
665
668
struct grub_squash_data *data = 0;
666
669
struct grub_fshelp_node *fdiro = 0;
667
670
struct grub_fshelp_node root;
678
681
grub_fshelp_find_file (path, &root, &fdiro, grub_squash_iterate_dir,
679
682
grub_squash_read_symlink, GRUB_FSHELP_DIR);
681
grub_squash_iterate_dir (fdiro, iterate);
684
grub_squash_iterate_dir (fdiro, grub_squash_dir_iter, &ctx);
683
686
squash_unmount (data);