static int list_dir_proc()

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;
}