in src/native/tools/dumpextfs/load_ext4.cpp [246:312]
static int list_dir_proc(
[[maybe_unused]] ext2_ino_t dir EXT2FS_ATTR((unused)),
int entry,
struct ext2_dir_entry *dirent,
[[maybe_unused]] int offset EXT2FS_ATTR((unused)),
[[maybe_unused]] int blocksize EXT2FS_ATTR((unused)),
[[maybe_unused]] char *buf EXT2FS_ATTR((unused)),
void *priv)
{
if (entry != DIRENT_OTHER_FILE)
{
return 0;
}
int name_len = ext2fs_dirent_name_len(dirent);
std::string name(dirent->name, name_len);
struct list_dir_proc_data *context = reinterpret_cast<struct list_dir_proc_data *>(priv);
ext2_filsys fs = context->fs;
auto all_files_ptr = context->all_files_ptr;
std::string full_path = context->parent_dir;
if (full_path.back() != '/')
{
full_path += "/";
}
full_path += name;
int retval = ext2fs_check_directory(fs, dirent->inode);
if (retval == EXT2_ET_NO_DIRECTORY)
{
file_details details;
details.full_path = full_path;
details.name = name;
retval = populate_file_details_from_inode(fs, dirent->inode, &details);
if (retval)
{
printf("populate_file_details_from_inode() for %s failed: %d\n", full_path.c_str(), retval);
return retval;
}
if (details.regions.size() > 0)
{
all_files_ptr->emplace_back(std::move(details));
}
return 0;
}
else if (retval)
{
printf("ext2fs_check_directory() failed: %d\n", retval);
return retval;
}
struct list_dir_proc_data context_new;
context_new = *context;
context_new.parent_dir = full_path.c_str();
retval = ext2fs_dir_iterate2(fs, dirent->inode, 0, 0, list_dir_proc, (void *)&context_new);
if (retval)
{
printf("ext2fs_dir_iterate2() failed: %d\n", retval);
return retval;
}
return 0;
}