]> wimlib.net Git - wimlib/blobdiff - src/wim.c
read_header(): Print WIM name in error messages
[wimlib] / src / wim.c
index 776281200b53f4038a5db228286f8bf52e84fa78..9be0f956db63d59f5833dd1175561971b10b7275 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -65,15 +65,11 @@ static WIMStruct *
 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 = -1;
+               w->out_fd = -1;
        }
-#endif
        return w;
-
 }
 
 /*
@@ -294,6 +290,8 @@ wimlib_print_wim_information(const WIMStruct *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'));
 }
 
@@ -386,6 +384,37 @@ wimlib_get_boot_idx(const WIMStruct *w)
        return w->hdr.boot_idx;
 }
 
+static int
+do_open_wim(const tchar *filename, int *fd_ret)
+{
+       int fd;
+
+       fd = topen(filename, O_RDONLY | O_BINARY);
+       if (fd == -1) {
+               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 == -1);
+       return do_open_wim(w->filename, &w->in_fd);
+}
+
+int
+close_wim(WIMStruct *w)
+{
+       if (w->in_fd != -1) {
+               close(w->in_fd);
+               w->in_fd = -1;
+       }
+       return 0;
+}
+
 /*
  * Begins the reading of a WIM file; opens the file and reads its header and
  * lookup table, and optionally checks the integrity.
@@ -399,12 +428,9 @@ begin_read(WIMStruct *w, const tchar *in_wim_path, int open_flags,
 
        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
@@ -427,7 +453,7 @@ begin_read(WIMStruct *w, const tchar *in_wim_path, int open_flags,
                        return WIMLIB_ERR_OPEN;
        }
 
-       ret = read_header(w->fp, &w->hdr, open_flags);
+       ret = read_header(w->filename, w->in_fd, &w->hdr, open_flags);
        if (ret)
                return ret;
 
@@ -470,8 +496,7 @@ begin_read(WIMStruct *w, const tchar *in_wim_path, int open_flags,
        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;
 
@@ -537,7 +562,7 @@ destroy_image_metadata(struct wim_image_metadata *imd,
        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
@@ -646,25 +671,14 @@ wimlib_free(WIMStruct *w)
 
        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 != -1)
+               close(w->in_fd);
+       if (w->out_fd != -1)
+               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++)
@@ -690,16 +704,17 @@ test_locale_ctype_utf8()
 #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