-/* Prepare for multiple reads to a resource by caching a FILE * or NTFS
- * attribute pointer in the lookup table entry. */
-static int prepare_resource_for_read(struct wim_lookup_table_entry *lte
-
- #ifdef WITH_NTFS_3G
- , ntfs_inode **ni_ret
- #endif
- )
-{
- switch (lte->resource_location) {
- case RESOURCE_IN_FILE_ON_DISK:
- if (!lte->file_on_disk_fp) {
- lte->file_on_disk_fp = fopen(lte->file_on_disk, "rb");
- if (!lte->file_on_disk_fp) {
- ERROR_WITH_ERRNO("Failed to open the file "
- "`%s'", lte->file_on_disk);
- return WIMLIB_ERR_OPEN;
- }
- }
- break;
-#ifdef WITH_NTFS_3G
- case RESOURCE_IN_NTFS_VOLUME:
- if (!lte->attr) {
- struct ntfs_location *loc = lte->ntfs_loc;
- ntfs_inode *ni;
- wimlib_assert(loc);
- ni = ntfs_pathname_to_inode(*loc->ntfs_vol_p, NULL, loc->path_utf8);
- if (!ni) {
- ERROR_WITH_ERRNO("Failed to open inode `%s' in NTFS "
- "volume", loc->path_utf8);
- return WIMLIB_ERR_NTFS_3G;
- }
- lte->attr = ntfs_attr_open(ni,
- loc->is_reparse_point ? AT_REPARSE_POINT : AT_DATA,
- (ntfschar*)loc->stream_name_utf16,
- loc->stream_name_utf16_num_chars);
- if (!lte->attr) {
- ERROR_WITH_ERRNO("Failed to open attribute of `%s' in "
- "NTFS volume", loc->path_utf8);
- ntfs_inode_close(ni);
- return WIMLIB_ERR_NTFS_3G;
- }
- *ni_ret = ni;
- }
- break;
-#endif
-#if defined(__CYGWIN__) || defined(__WIN32__)
- case RESOURCE_WIN32:
- if (!lte->file_on_disk_fp) {
- lte->file_on_disk_fp = win32_open_file_readonly(lte->file_on_disk);
- if (!lte->file_on_disk_fp)
- return WIMLIB_ERR_OPEN;
- }
- break;
-#endif
- default:
- break;
- }
- return 0;
-}
-
-/* Undo prepare_resource_for_read() by closing the cached FILE * or NTFS
- * attribute. */
-static void end_wim_resource_read(struct wim_lookup_table_entry *lte
- #ifdef WITH_NTFS_3G
- , ntfs_inode *ni
- #endif
- )
-{
- if (lte->resource_location == RESOURCE_IN_FILE_ON_DISK
- && lte->file_on_disk_fp)
- {
- fclose(lte->file_on_disk_fp);
- lte->file_on_disk_fp = NULL;
- }
-#ifdef WITH_NTFS_3G
- else if (lte->resource_location == RESOURCE_IN_NTFS_VOLUME) {
- if (lte->attr) {
- ntfs_attr_close(lte->attr);
- lte->attr = NULL;
- }
- if (ni)
- ntfs_inode_close(ni);
- }
-#endif
-#if defined(__CYGWIN__) || defined(__WIN32__)
- else if (lte->resource_location == RESOURCE_WIN32
- && lte->file_on_disk_fp)
- {
- win32_close_file(lte->file_on_disk_fp);
- lte->file_on_disk_fp = NULL;
- }
-#endif
-}
-