]> wimlib.net Git - wimlib/blobdiff - src/resource.c
A few cleanups and fixes from recent changes
[wimlib] / src / resource.c
index f7684b10baee9bab6fffaa109f0977e79a19d1ed..f6e30fc8373e1d8fce547c2ed35ede544c8caff4 100644 (file)
@@ -7,27 +7,31 @@
 /*
  * Copyright (C) 2012, 2013 Eric Biggers
  *
- * This file is part of wimlib, a library for working with WIM files.
+ * This file is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at your option) any
+ * later version.
  *
- * wimlib is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3 of the License, or (at your option) any later
- * version.
+ * This file is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
  *
- * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * wimlib; if not, see http://www.gnu.org/licenses/.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this file; if not, see http://www.gnu.org/licenses/.
  */
 
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
 #endif
 
-#include "wimlib.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "wimlib/alloca.h"
 #include "wimlib/assert.h"
+#include "wimlib/bitops.h"
 #include "wimlib/endianness.h"
 #include "wimlib/error.h"
 #include "wimlib/file_io.h"
 #  include "wimlib/ntfs_3g.h"
 #endif
 
-#ifdef HAVE_ALLOCA_H
-#  include <alloca.h>
-#endif
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <unistd.h>
 
 /*
  *                         Compressed WIM resources
@@ -172,7 +169,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
        const bool is_pipe_read = (rspec->is_pipable && !filedes_is_seekable(in_fd));
 
        /* Determine if the chunk table is in an alternate format.  */
-       const bool alt_chunk_table = (rspec->flags & WIM_RESHDR_FLAG_PACKED_STREAMS)
+       const bool alt_chunk_table = (rspec->flags & WIM_RESHDR_FLAG_SOLID)
                                        && !is_pipe_read;
 
        /* Get the maximum size of uncompressed chunks in this resource, which
@@ -206,7 +203,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
                rspec->wim->decompressor_ctype = WIMLIB_COMPRESSION_TYPE_NONE;
                rspec->wim->decompressor = NULL;
        } else {
-               ret = wimlib_create_decompressor(ctype, chunk_size, NULL,
+               ret = wimlib_create_decompressor(ctype, chunk_size,
                                                 &decompressor);
                if (ret) {
                        if (ret != WIMLIB_ERR_NOMEM)
@@ -215,7 +212,7 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
                }
        }
 
-       const u32 chunk_order = bsr32(chunk_size);
+       const u32 chunk_order = fls32(chunk_size);
 
        /* Calculate the total number of chunks the resource is divided into.  */
        const u64 num_chunks = (rspec->uncompressed_size + chunk_size - 1) >> chunk_order;
@@ -327,8 +324,8 @@ read_compressed_wim_resource(const struct wim_resource_spec * const rspec,
                /* Now fill in chunk_offsets from the entries we have read in
                 * chunk_tab_data.  We break aliasing rules here to avoid having
                 * to allocate yet another array.  */
-               typedef le64 __attribute__((may_alias)) aliased_le64_t;
-               typedef le32 __attribute__((may_alias)) aliased_le32_t;
+               typedef le64 _may_alias_attribute aliased_le64_t;
+               typedef le32 _may_alias_attribute aliased_le32_t;
                u64 * chunk_offsets_p = chunk_offsets;
 
                if (alt_chunk_table) {
@@ -745,7 +742,7 @@ int
 skip_wim_stream(struct wim_lookup_table_entry *lte)
 {
        wimlib_assert(lte->resource_location == RESOURCE_IN_WIM);
-       wimlib_assert(!(lte->flags & WIM_RESHDR_FLAG_PACKED_STREAMS));
+       wimlib_assert(!(lte->flags & WIM_RESHDR_FLAG_SOLID));
        DEBUG("Skipping stream (size=%"PRIu64")", lte->size);
        return read_partial_wim_resource(lte->rspec,
                                         0,
@@ -1015,17 +1012,12 @@ streamifier_cb(const void *chunk, size_t size, void *_ctx)
        wimlib_assert(size <= ctx->cur_stream->size - ctx->cur_stream_offset);
 
        if (ctx->cur_stream_offset == 0) {
-               u32 flags;
 
                /* Starting a new stream.  */
                DEBUG("Begin new stream (size=%"PRIu64").",
                      ctx->cur_stream->size);
 
-               flags = BEGIN_STREAM_FLAG_PARTIAL_RESOURCE;
-               if (size == ctx->cur_stream->size)
-                       flags |= BEGIN_STREAM_FLAG_WHOLE_STREAM;
                ret = (*ctx->cbs.begin_stream)(ctx->cur_stream,
-                                              flags,
                                               ctx->cbs.begin_stream_ctx);
                if (ret)
                        return ret;
@@ -1071,8 +1063,7 @@ struct hasher_context {
 /* Callback for starting to read a stream while calculating its SHA1 message
  * digest.  */
 static int
-hasher_begin_stream(struct wim_lookup_table_entry *lte, u32 flags,
-                   void *_ctx)
+hasher_begin_stream(struct wim_lookup_table_entry *lte, void *_ctx)
 {
        struct hasher_context *ctx = _ctx;
 
@@ -1081,8 +1072,7 @@ hasher_begin_stream(struct wim_lookup_table_entry *lte, u32 flags,
        if (ctx->cbs.begin_stream == NULL)
                return 0;
        else
-               return (*ctx->cbs.begin_stream)(lte, flags,
-                                               ctx->cbs.begin_stream_ctx);
+               return (*ctx->cbs.begin_stream)(lte, ctx->cbs.begin_stream_ctx);
 }
 
 /* A consume_data_callback_t implementation that continues calculating the SHA1
@@ -1101,13 +1091,6 @@ hasher_consume_chunk(const void *chunk, size_t size, void *_ctx)
                return (*ctx->cbs.consume_chunk)(chunk, size, ctx->cbs.consume_chunk_ctx);
 }
 
-static void
-get_sha1_string(const u8 md[SHA1_HASH_SIZE], tchar *str)
-{
-       for (size_t i = 0; i < SHA1_HASH_SIZE; i++)
-               str += tsprintf(str, T("%02x"), md[i]);
-}
-
 /* Callback for finishing reading a stream while calculating its SHA1 message
  * digest.  */
 static int
@@ -1142,8 +1125,8 @@ hasher_end_stream(struct wim_lookup_table_entry *lte, int status, void *_ctx)
                                if (wimlib_print_errors) {
                                        tchar expected_hashstr[SHA1_HASH_SIZE * 2 + 1];
                                        tchar actual_hashstr[SHA1_HASH_SIZE * 2 + 1];
-                                       get_sha1_string(lte->hash, expected_hashstr);
-                                       get_sha1_string(hash, actual_hashstr);
+                                       sprint_hash(lte->hash, expected_hashstr);
+                                       sprint_hash(hash, actual_hashstr);
                                        ERROR("The stream is corrupted!\n"
                                              "        (Expected SHA1=%"TS",\n"
                                              "              got SHA1=%"TS")",
@@ -1171,7 +1154,7 @@ read_full_stream_with_cbs(struct wim_lookup_table_entry *lte,
 {
        int ret;
 
-       ret = (*cbs->begin_stream)(lte, 0, cbs->begin_stream_ctx);
+       ret = (*cbs->begin_stream)(lte, cbs->begin_stream_ctx);
        if (ret)
                return ret;
 
@@ -1204,11 +1187,11 @@ read_full_stream_with_sha1(struct wim_lookup_table_entry *lte,
 }
 
 static int
-read_packed_streams(struct wim_lookup_table_entry *first_stream,
-                   struct wim_lookup_table_entry *last_stream,
-                   u64 stream_count,
-                   size_t list_head_offset,
-                   const struct read_stream_list_callbacks *sink_cbs)
+read_streams_in_solid_resource(struct wim_lookup_table_entry *first_stream,
+                              struct wim_lookup_table_entry *last_stream,
+                              u64 stream_count,
+                              size_t list_head_offset,
+                              const struct read_stream_list_callbacks *sink_cbs)
 {
        struct data_range *ranges;
        bool ranges_malloced;
@@ -1283,8 +1266,8 @@ read_packed_streams(struct wim_lookup_table_entry *first_stream,
  * Read a list of streams, each of which may be in any supported location (e.g.
  * in a WIM or in an external file).  Unlike read_stream_prefix() or the
  * functions which call it, this function optimizes the case where multiple
- * streams are packed into a single compressed WIM resource and reads them all
- * consecutively, only decompressing the data one time.
+ * streams are combined into a single solid compressed WIM resource and reads
+ * them all consecutively, only decompressing the data one time.
  *
  * @stream_list
  *     List of streams (represented as `struct wim_lookup_table_entry's) to
@@ -1361,7 +1344,7 @@ read_stream_list(struct list_head *stream_list,
        {
                lte = (struct wim_lookup_table_entry*)((u8*)cur - list_head_offset);
 
-               if (lte->flags & WIM_RESHDR_FLAG_PACKED_STREAMS &&
+               if (lte->flags & WIM_RESHDR_FLAG_SOLID &&
                    lte->size != lte->rspec->uncompressed_size)
                {
 
@@ -1397,10 +1380,10 @@ read_stream_list(struct list_head *stream_list,
                                 * read and @lte_last specifies the last stream
                                 * in the resource that needs to be read.  */
                                next = next2;
-                               ret = read_packed_streams(lte, lte_last,
-                                                         stream_count,
-                                                         list_head_offset,
-                                                         sink_cbs);
+                               ret = read_streams_in_solid_resource(lte, lte_last,
+                                                                    stream_count,
+                                                                    list_head_offset,
+                                                                    sink_cbs);
                                if (ret)
                                        return ret;
                                continue;
@@ -1442,7 +1425,7 @@ extract_stream(struct wim_lookup_table_entry *lte, u64 size,
 
 /* A consume_data_callback_t implementation that writes the chunk of data to a
  * file descriptor.  */
-int
+static int
 extract_chunk_to_fd(const void *chunk, size_t size, void *_fd_p)
 {
        struct filedes *fd = _fd_p;
@@ -1486,7 +1469,7 @@ sha1_stream(struct wim_lookup_table_entry *lte)
 /* Convert a short WIM resource header to a stand-alone WIM resource
  * specification.
  *
- * Note: for packed resources some fields still need to be overridden.
+ * Note: for solid resources some fields still need to be overridden.
  */
 void
 wim_res_hdr_to_spec(const struct wim_reshdr *reshdr, WIMStruct *wim,