]> wimlib.net Git - wimlib/blobdiff - src/wim.c
Honor WIM_HDR_FLAG_READONLY
[wimlib] / src / wim.c
index c82730c8a5e9e126b2dc8ea49658578503fc6705..4a8e6a8be828c8a5282a0993ea96daf4a0f8293e 100644 (file)
--- a/src/wim.c
+++ b/src/wim.c
@@ -5,8 +5,6 @@
 /*
  * Copyright (C) 2012, 2013 Eric Biggers
  *
- * wimlib - Library for working with WIM files
- *
  * This file is part of wimlib, a library for working with WIM files.
  *
  * wimlib is free software; you can redistribute it and/or modify it under the
  * along with wimlib; if not, see http://www.gnu.org/licenses/.
  */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "wimlib/error.h"
+#include "wimlib/dentry.h"
+#include "wimlib/encoding.h"
+#include "wimlib/file_io.h"
+#include "wimlib/integrity.h"
+#include "wimlib/lookup_table.h"
+#include "wimlib/metadata.h"
+#ifdef WITH_NTFS_3G
+#  include "wimlib/ntfs_3g.h" /* for do_ntfs_umount() */
+#endif
+#include "wimlib/security.h"
+#include "wimlib/wim.h"
+#include "wimlib/xml.h"
+
+#ifdef __WIN32__
+#  include "wimlib/win32.h" /* for realpath() replacement */
+#endif
 
 #include <errno.h>
 #include <fcntl.h>
+#ifndef __WIN32__
+#  include <langinfo.h>
+#endif
 #include <limits.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <unistd.h>
 
-#ifdef __WIN32__
-#  include "win32.h"
-#else
-#  include <langinfo.h>
-#endif
-
-#include "buffer_io.h"
-#include "dentry.h"
-#include "lookup_table.h"
-#include "wimlib_internal.h"
-#include "xml.h"
-
 static int
 image_print_metadata(WIMStruct *w)
 {
        DEBUG("Printing metadata for image %d", w->current_image);
-       print_security_data(wim_security_data(w));
+       print_wim_security_data(wim_security_data(w));
        return for_dentry_in_tree(wim_root_dentry(w), print_dentry,
                                  w->lookup_table);
 }
@@ -62,12 +71,12 @@ image_print_files(WIMStruct *w)
 }
 
 static WIMStruct *
-new_wim_struct()
+new_wim_struct(void)
 {
        WIMStruct *w = CALLOC(1, sizeof(WIMStruct));
        if (w) {
-               w->in_fd = INVALID_FILEDES;
-               w->out_fd = INVALID_FILEDES;
+               w->in_fd = -1;
+               w->out_fd = -1;
        }
        return w;
 }
@@ -197,7 +206,7 @@ select_wim_image(WIMStruct *w, int image)
        }
        w->current_image = image;
        imd = wim_get_current_image_metadata(w);
-       if (imd->root_dentry) {
+       if (imd->root_dentry || imd->modified) {
                ret = 0;
        } else {
                #ifdef ENABLE_DEBUG
@@ -357,15 +366,16 @@ wimlib_print_files(WIMStruct *w, int image)
 
 /* Sets the index of the bootable image. */
 WIMLIBAPI int
-wimlib_set_boot_idx(WIMStruct *w, int boot_idx)
+wimlib_set_boot_idx(WIMStruct *wim, int boot_idx)
 {
-       if (w->hdr.total_parts != 1) {
-               ERROR("Cannot modify the boot index of a split WIM!");
-               return WIMLIB_ERR_SPLIT_UNSUPPORTED;
-       }
-       if (boot_idx < 0 || boot_idx > w->hdr.image_count)
+       int ret;
+
+       ret = can_modify_wim(wim);
+       if (ret)
+               return ret;
+       if (boot_idx < 0 || boot_idx > wim->hdr.image_count)
                return WIMLIB_ERR_INVALID_IMAGE;
-       w->hdr.boot_idx = boot_idx;
+       wim->hdr.boot_idx = boot_idx;
        return 0;
 }
 
@@ -385,12 +395,12 @@ wimlib_get_boot_idx(const WIMStruct *w)
 }
 
 static int
-do_open_wim(const tchar *filename, filedes_t *fd_ret)
+do_open_wim(const tchar *filename, int *fd_ret)
 {
        int fd;
 
-       fd = topen(filename, O_RDONLY);
-       if (fd == INVALID_FILEDES) {
+       fd = topen(filename, O_RDONLY | O_BINARY);
+       if (fd == -1) {
                ERROR_WITH_ERRNO("Can't open \"%"TS"\" read-only", filename);
                return WIMLIB_ERR_OPEN;
        }
@@ -401,16 +411,16 @@ do_open_wim(const tchar *filename, filedes_t *fd_ret)
 int
 reopen_wim(WIMStruct *w)
 {
-       wimlib_assert(w->in_fd == INVALID_FILEDES);
+       wimlib_assert(w->in_fd == -1);
        return do_open_wim(w->filename, &w->in_fd);
 }
 
 int
 close_wim(WIMStruct *w)
 {
-       if (w->in_fd != INVALID_FILEDES) {
+       if (w->in_fd != -1) {
                close(w->in_fd);
-               w->in_fd = INVALID_FILEDES;
+               w->in_fd = -1;
        }
        return 0;
 }
@@ -453,7 +463,7 @@ begin_read(WIMStruct *w, const tchar *in_wim_path, int open_flags,
                        return WIMLIB_ERR_OPEN;
        }
 
-       ret = read_header(w->in_fd, &w->hdr, open_flags);
+       ret = read_header(w->filename, w->in_fd, &w->hdr, open_flags);
        if (ret)
                return ret;
 
@@ -546,7 +556,7 @@ destroy_image_metadata(struct wim_image_metadata *imd,
 {
        free_dentry_tree(imd->root_dentry, table);
        imd->root_dentry = NULL;
-       free_security_data(imd->security_data);
+       free_wim_security_data(imd->security_data);
        imd->security_data = NULL;
 
        if (free_metadata_lte) {
@@ -599,7 +609,7 @@ append_image_metadata(WIMStruct *w, struct wim_image_metadata *imd)
 
 
 struct wim_image_metadata *
-new_image_metadata()
+new_image_metadata(void)
 {
        struct wim_image_metadata *imd;
 
@@ -662,6 +672,33 @@ wim_checksum_unhashed_streams(WIMStruct *w)
        return 0;
 }
 
+int
+can_modify_wim(WIMStruct *wim)
+{
+       if (wim->hdr.total_parts != 1) {
+               ERROR("Cannot modify \"%"TS"\": is part of a spanned set",
+                     wim->filename);
+               return WIMLIB_ERR_SPLIT_UNSUPPORTED;
+       }
+       if (wim->hdr.flags & WIM_HDR_FLAG_READONLY) {
+               ERROR("Cannot modify \"%"TS"\": is marked read-only",
+                     wim->filename);
+               return WIMLIB_ERR_WIM_IS_MARKED_READONLY;
+       }
+       return 0;
+}
+
+int
+can_delete_from_wim(WIMStruct *wim)
+{
+       int ret;
+
+       ret = can_modify_wim(wim);
+       if (ret == 0 && !wim->all_images_verified)
+               ret = wim_run_full_verifications(wim);
+       return ret;
+}
+
 /* Frees the memory for the WIMStruct, including all internal memory; also
  * closes all files associated with the WIMStruct.  */
 WIMLIBAPI void
@@ -671,9 +708,9 @@ wimlib_free(WIMStruct *w)
 
        if (!w)
                return;
-       if (w->in_fd != INVALID_FILEDES)
+       if (w->in_fd != -1)
                close(w->in_fd);
-       if (w->out_fd != INVALID_FILEDES)
+       if (w->out_fd != -1)
                close(w->out_fd);
 
        free_lookup_table(w->lookup_table);
@@ -690,7 +727,7 @@ wimlib_free(WIMStruct *w)
 }
 
 static bool
-test_locale_ctype_utf8()
+test_locale_ctype_utf8(void)
 {
 #ifdef __WIN32__
        return false;
@@ -724,7 +761,7 @@ wimlib_global_init(int init_flags)
 /* Free global memory allocations.  Not strictly necessary if the process using
  * wimlib is just about to exit (as is the case for 'imagex'). */
 WIMLIBAPI void
-wimlib_global_cleanup()
+wimlib_global_cleanup(void)
 {
        libxml_global_cleanup();
        iconv_global_cleanup();