]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Various cleanups
[wimlib] / src / wim.c
index 500fc1ebc08f7407028be9041fb9f2defe7fbbe2..cbda006139a12ba1ae8bc4ff4255f8e7694611f7 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -28,6 +28,7 @@
 #include <limits.h>
 #include <stdlib.h>
 #include <stdarg.h>
+#include <errno.h>
 
 #include "dentry.h"
 #include <unistd.h>
@@ -43,7 +44,6 @@
 #include "lookup_table.h"
 #include "xml.h"
 
-
 static int print_metadata(WIMStruct *w)
 {
        DEBUG("Printing metadata for image %d", w->current_image);
@@ -208,6 +208,11 @@ int select_wim_image(WIMStruct *w, int image)
 
        DEBUG("Selecting image %d", image);
 
+       if (image == WIMLIB_NO_IMAGE) {
+               ERROR("Invalid image: %d", WIMLIB_NO_IMAGE);
+               return WIMLIB_ERR_INVALID_IMAGE;
+       }
+
        if (image == w->current_image)
                return 0;
 
@@ -226,6 +231,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);
                }
        }
 
@@ -420,45 +426,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.
@@ -467,18 +434,33 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
                      wimlib_progress_func_t progress_func)
 {
        int ret;
-       uint xml_num_images;
+       int xml_num_images;
 
        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");
-               ret = WIMLIB_ERR_NOMEM;
+               if (errno == ENOMEM)
+                       ret = WIMLIB_ERR_NOMEM;
+               else
+                       ret = WIMLIB_ERR_OPEN;
                goto out_close;
        }
 
@@ -486,7 +468,7 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
        if (ret != 0)
                goto out_close;
 
-       DEBUG("Wim file contains %u images", w->hdr.image_count);
+       DEBUG("According to header, WIM contains %u images", w->hdr.image_count);
 
        /* If the boot index is invalid, print a warning and set it to 0 */
        if (w->hdr.boot_idx > w->hdr.image_count) {
@@ -586,7 +568,7 @@ static int begin_read(WIMStruct *w, const char *in_wim_path, int open_flags,
        }
 
        DEBUG("Done beginning read of WIM file `%s'.", in_wim_path);
-       return 0;
+       /*return 0;*/
 
        //
        // Everything is freed in wimlib_free() anyway, so no need to roll back
@@ -607,7 +589,6 @@ out_free_lookup_table:
 out_close:
        /*fclose(w->fp);*/
        /*w->fp = NULL;*/
-out:
        return ret;
 }
 
@@ -622,7 +603,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");