]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Various changes/fixes
[wimlib] / src / wim.c
index 9dd9718d9500e03f574e175d33dd1b488ae12184..cd024b1807bce4ba71f5e00b693be2aa80fd560e 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -43,7 +43,6 @@
 #include "lookup_table.h"
 #include "xml.h"
 
-
 static int print_metadata(WIMStruct *w)
 {
        DEBUG("Printing metadata for image %d", w->current_image);
@@ -226,6 +225,7 @@ int select_wim_image(WIMStruct *w, int image)
                        destroy_image_metadata(imd, NULL);
                        imd->root_dentry = NULL;
                        imd->security_data = NULL;
+                       INIT_HLIST_HEAD(&imd->inode_list);
                }
        }
 
@@ -276,15 +276,15 @@ WIMLIBAPI int wimlib_resolve_image(WIMStruct *w, const char *image_name_or_num)
        int image;
        int i;
 
-       if (!image_name_or_num)
+       if (!image_name_or_num || !*image_name_or_num)
                return WIMLIB_NO_IMAGE;
 
        if (strcmp(image_name_or_num, "all") == 0
            || strcmp(image_name_or_num, "*") == 0)
                return WIMLIB_ALL_IMAGES;
        image = strtol(image_name_or_num, &p, 10);
-       if (p != image_name_or_num && *p == '\0') {
-               if (image < 1 || image > w->hdr.image_count)
+       if (p != image_name_or_num && *p == '\0' && image > 0) {
+               if (image > w->hdr.image_count)
                        return WIMLIB_NO_IMAGE;
                return image;
        } else {
@@ -420,45 +420,6 @@ WIMLIBAPI int wimlib_get_boot_idx(const WIMStruct *w)
        return w->hdr.boot_idx;
 }
 
-/* Opens a WIM readable */
-int open_wim_readable(WIMStruct *w, const char *path)
-{
-       if (w->fp != NULL)
-               fclose(w->fp);
-       wimlib_assert(path != NULL);
-       w->fp = fopen(path, "rb");
-       if (!w->fp) {
-               ERROR_WITH_ERRNO("Failed to open `%s' for reading",
-                                path);
-               return WIMLIB_ERR_OPEN;
-       }
-       return 0;
-}
-
-/* Opens a WIM writable */
-int open_wim_writable(WIMStruct *w, const char *path,
-                     bool trunc, bool readable)
-{
-       const char *mode;
-       if (trunc)
-               if (readable)
-                       mode = "w+b";
-               else
-                       mode = "wb";
-       else
-               mode = "r+b";
-
-       DEBUG("Opening `%s' read-write", path);
-       wimlib_assert(w->out_fp == NULL);
-       wimlib_assert(path != NULL);
-       w->out_fp = fopen(path, mode);
-       if (!w->out_fp) {
-               ERROR_WITH_ERRNO("Failed to open `%s' for writing", path);
-               return WIMLIB_ERR_OPEN;
-       }
-       return 0;
-}
-
 /*
  * Begins the reading of a WIM file; opens the file and reads its header and
  * lookup table, and optionally checks the integrity.
@@ -471,10 +432,22 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
 
        DEBUG("Reading the WIM file `%s'", in_wim_path);
 
-       ret = open_wim_readable(w, in_wim_path);
-       if (ret != 0)
-               goto out;
+       w->fp = fopen(in_wim_path, "rb");
+       if (!w->fp) {
+               ERROR_WITH_ERRNO("Failed to open `%s' for reading",
+                                in_wim_path);
+               return WIMLIB_ERR_OPEN;
+       }
 
+       /* The absolute path to the WIM is requested so that wimlib_overwrite()
+        * still works even if the process changes its working directory.  This
+        * actually happens if a WIM is mounted read-write, since the FUSE
+        * thread changes directory to "/", and it needs to be able to find the
+        * WIM file again.
+        *
+        * This will break if the full path to the WIM changes in the
+        * intervening time...
+        */
        w->filename = realpath(in_wim_path, NULL);
        if (!w->filename) {
                ERROR_WITH_ERRNO("Failed to resolve WIM filename");
@@ -622,7 +595,8 @@ WIMLIBAPI int wimlib_open_wim(const char *wim_file, int open_flags,
        WIMStruct *w;
        int ret;
 
-       DEBUG("wim_file = `%s', open_flags = %#x", wim_file, open_flags);
+       if (!wim_file || !w_ret)
+               return WIMLIB_ERR_INVALID_PARAM;
        w = new_wim_struct();
        if (!w) {
                ERROR("Failed to allocate memory for WIMStruct");