new_wim_struct()
{
WIMStruct *w = CALLOC(1, sizeof(WIMStruct));
-#ifdef WITH_FUSE
- if (pthread_mutex_init(&w->fp_tab_mutex, NULL) != 0) {
- ERROR_WITH_ERRNO("Failed to initialize mutex");
- FREE(w);
- w = NULL;
+ if (w) {
+ w->in_fd = INVALID_FILEDES;
+ w->out_fd = INVALID_FILEDES;
}
-#endif
return w;
-
}
/*
wim_info_get_total_bytes(w->wim_info));
tprintf(T("Integrity Info: %"TS"\n"),
(w->hdr.integrity.offset != 0) ? T("yes") : T("no"));
+ tprintf(T("Relative path junction: %"TS"\n"),
+ (hdr->flags & WIM_HDR_FLAG_RP_FIX) ? T("yes") : T("no"));
tputchar(T('\n'));
}
return w->hdr.boot_idx;
}
+static int
+do_open_wim(const tchar *filename, filedes_t *fd_ret)
+{
+ int fd;
+
+ fd = topen(filename, O_RDONLY);
+ if (fd == INVALID_FILEDES) {
+ ERROR_WITH_ERRNO("Can't open \"%"TS"\" read-only", filename);
+ return WIMLIB_ERR_OPEN;
+ }
+ *fd_ret = fd;
+ return 0;
+}
+
+int
+reopen_wim(WIMStruct *w)
+{
+ wimlib_assert(w->in_fd == INVALID_FILEDES);
+ return do_open_wim(w->filename, &w->in_fd);
+}
+
+int
+close_wim(WIMStruct *w)
+{
+ if (w->in_fd != INVALID_FILEDES) {
+ close(w->in_fd);
+ w->in_fd = INVALID_FILEDES;
+ }
+ return 0;
+}
+
/*
* Begins the reading of a WIM file; opens the file and reads its header and
* lookup table, and optionally checks the integrity.
DEBUG("Reading the WIM file `%"TS"'", in_wim_path);
- w->fp = tfopen(in_wim_path, T("rb"));
- if (!w->fp) {
- ERROR_WITH_ERRNO("Failed to open `%"TS"' for reading",
- in_wim_path);
- return WIMLIB_ERR_OPEN;
- }
+ ret = do_open_wim(in_wim_path, &w->in_fd);
+ if (ret)
+ return ret;
/* The absolute path to the WIM is requested so that wimlib_overwrite()
* still works even if the process changes its working directory. This
return WIMLIB_ERR_OPEN;
}
- ret = read_header(w->fp, &w->hdr, open_flags);
+ ret = read_header(w->in_fd, &w->hdr, open_flags);
if (ret)
return ret;
if (ret)
return ret;
- ret = read_xml_data(w->fp, &w->hdr.xml_res_entry,
- &w->xml_data, &w->wim_info);
+ ret = read_xml_data(w->in_fd, &w->hdr.xml_res_entry, &w->wim_info);
if (ret)
return ret;
INIT_LIST_HEAD(&imd->inode_list);
#ifdef WITH_NTFS_3G
if (imd->ntfs_vol) {
- do_ntfs_umount(imd->ntfs_vol);
+ do_ntfs_umount(imd->ntfs_vol);
imd->ntfs_vol = NULL;
}
#endif
return imd_array;
}
+/* Checksum all streams that are unhashed (other than the metadata streams),
+ * merging them into the lookup table as needed. This is a no-op unless the
+ * library has previously used to add or mount an image using the same
+ * WIMStruct. */
int
wim_checksum_unhashed_streams(WIMStruct *w)
{
int ret;
for (int i = 0; i < w->hdr.image_count; i++) {
struct wim_lookup_table_entry *lte, *tmp;
- list_for_each_entry_safe(lte, tmp,
- &w->image_metadata[i]->unhashed_streams,
- unhashed_list)
- {
+ struct wim_image_metadata *imd = w->image_metadata[i];
+ image_for_each_unhashed_stream_safe(lte, tmp, imd) {
ret = hash_unhashed_stream(lte, w->lookup_table, NULL);
if (ret)
return ret;
if (!w)
return;
- if (w->fp)
- fclose(w->fp);
- if (w->out_fp)
- fclose(w->out_fp);
-
-#ifdef WITH_FUSE
- if (w->fp_tab) {
- for (size_t i = 0; i < w->num_allocated_fps; i++)
- if (w->fp_tab[i])
- fclose(w->fp_tab[i]);
- FREE(w->fp_tab);
- }
- pthread_mutex_destroy(&w->fp_tab_mutex);
-#endif
+ if (w->in_fd != INVALID_FILEDES)
+ close(w->in_fd);
+ if (w->out_fd != INVALID_FILEDES)
+ close(w->out_fd);
free_lookup_table(w->lookup_table);
FREE(w->filename);
- FREE(w->xml_data);
free_wim_info(w->wim_info);
if (w->image_metadata) {
for (unsigned i = 0; i < w->hdr.image_count; i++)
#endif
}
-/* Get global memory allocations out of the way,
- * single-threaded programs like 'imagex'. */
WIMLIBAPI int
-wimlib_global_init()
+wimlib_global_init(int init_flags)
{
libxml_global_init();
-#ifdef WITH_NTFS_3G
- libntfs3g_global_init();
-#endif
- wimlib_mbs_is_utf8 = test_locale_ctype_utf8();
+ if (!(init_flags & WIMLIB_INIT_FLAG_ASSUME_UTF8)) {
+ wimlib_mbs_is_utf8 = test_locale_ctype_utf8();
+ #ifdef WITH_NTFS_3G
+ if (!wimlib_mbs_is_utf8)
+ libntfs3g_global_init();
+ #endif
+ }
#ifdef __WIN32__
win32_global_init();
#endif