X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fwrite.c;h=dff5118c86d8e6e992589a51e6ed6560b2e6ae6a;hb=9170e867885893b163dd7d67e3096302931e229f;hp=930c61b1d5dad40f0694102c061d4b2514c3f6cb;hpb=707700a1f8f41a8e27bc87d4debffe4fb1d24ec7;p=wimlib diff --git a/src/write.c b/src/write.c index 930c61b1..dff5118c 100644 --- a/src/write.c +++ b/src/write.c @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2012, 2013, 2014, 2015 Eric Biggers + * Copyright (C) 2012-2016 Eric Biggers * * 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 @@ -288,7 +288,7 @@ write_pwm_blob_header(const struct blob_descriptor *blob, blob_hdr.flags = cpu_to_le32(reshdr_flags); ret = full_write(out_fd, &blob_hdr, sizeof(blob_hdr)); if (ret) - ERROR_WITH_ERRNO("Write error"); + ERROR_WITH_ERRNO("Error writing blob header to WIM file"); return ret; } @@ -461,8 +461,11 @@ begin_chunk_table(struct write_blobs_ctx *ctx, u64 res_expected_size) reserve_size += sizeof(struct alt_chunk_table_header_disk); memset(ctx->chunk_csizes, 0, reserve_size); ret = full_write(ctx->out_fd, ctx->chunk_csizes, reserve_size); - if (ret) + if (ret) { + ERROR_WITH_ERRNO("Error reserving space for chunk " + "table in WIM file"); return ret; + } } return 0; } @@ -588,7 +591,7 @@ end_chunk_table(struct write_blobs_ctx *ctx, u64 res_actual_size, return 0; write_error: - ERROR_WITH_ERRNO("Write error"); + ERROR_WITH_ERRNO("Error writing chunk table to WIM file"); return ret; } @@ -639,6 +642,7 @@ do_done_with_blob(struct blob_descriptor *blob, { int ret; struct wim_inode *inode; + const tchar *path; tchar *cookie1; tchar *cookie2; @@ -652,10 +656,12 @@ do_done_with_blob(struct blob_descriptor *blob, if (--inode->i_num_remaining_streams > 0) return 0; - cookie1 = progress_get_streamless_path(blob->file_on_disk); - cookie2 = progress_get_win32_path(blob->file_on_disk); + path = blob_file_path(blob); + + cookie1 = progress_get_streamless_path(path); + cookie2 = progress_get_win32_path(path); - ret = done_with_file(blob->file_on_disk, progfunc, progctx); + ret = done_with_file(path, progfunc, progctx); progress_put_win32_path(cookie2); progress_put_streamless_path(cookie1); @@ -980,7 +986,7 @@ write_chunk(struct write_blobs_ctx *ctx, const void *cchunk, completed_blob_count, false); write_error: - ERROR_WITH_ERRNO("Write error"); + ERROR_WITH_ERRNO("Error writing chunk data to WIM file"); return ret; } @@ -1237,12 +1243,18 @@ write_raw_copy_resource(struct wim_resource_descriptor *in_rdesc, ret = full_pread(in_fd, buf, bytes_to_read, cur_read_offset); - if (ret) + if (ret) { + ERROR_WITH_ERRNO("Error reading raw data " + "from WIM file"); return ret; + } ret = full_write(out_fd, buf, bytes_to_read); - if (ret) + if (ret) { + ERROR_WITH_ERRNO("Error writing raw data " + "to WIM file"); return ret; + } cur_read_offset += bytes_to_read; @@ -2430,7 +2442,10 @@ finish_write(WIMStruct *wim, int image, int write_flags, ret = WIMLIB_ERR_WRITE; if (unlikely(write_flags & WIMLIB_WRITE_FLAG_UNSAFE_COMPACT)) { /* Truncate any data the compaction freed up. */ - if (ftruncate(wim->out_fd.fd, wim->out_fd.offset)) { + if (ftruncate(wim->out_fd.fd, wim->out_fd.offset) && + errno != EINVAL) /* allow compaction on untruncatable files, + e.g. block devices */ + { ERROR_WITH_ERRNO("Failed to truncate the output WIM file"); goto out; } @@ -3110,8 +3125,11 @@ overwrite_wim_inplace(WIMStruct *wim, int write_flags, unsigned num_threads) * this data would be overwritten. */ old_xml_begin = wim->hdr.xml_data_reshdr.offset_in_wim; old_xml_end = old_xml_begin + wim->hdr.xml_data_reshdr.size_in_wim; - old_blob_table_end = wim->hdr.blob_table_reshdr.offset_in_wim + - wim->hdr.blob_table_reshdr.size_in_wim; + if (wim->hdr.blob_table_reshdr.offset_in_wim == 0) + old_blob_table_end = WIM_HEADER_DISK_SIZE; + else + old_blob_table_end = wim->hdr.blob_table_reshdr.offset_in_wim + + wim->hdr.blob_table_reshdr.size_in_wim; if (wim_has_integrity_table(wim) && wim->hdr.integrity_table_reshdr.offset_in_wim < old_xml_end) { WARNING("Didn't expect the integrity table to be " @@ -3214,9 +3232,8 @@ out_truncate: WIMLIB_WRITE_FLAG_UNSAFE_COMPACT))) { WARNING("Truncating \"%"TS"\" to its original size " "(%"PRIu64" bytes)", wim->filename, old_wim_end); - /* Return value of ftruncate() is ignored because this is - * already an error path. */ - (void)ftruncate(wim->out_fd.fd, old_wim_end); + if (ftruncate(wim->out_fd.fd, old_wim_end)) + WARNING_WITH_ERRNO("Failed to truncate WIM file!"); } out_restore_hdr: (void)write_wim_header_flags(wim->hdr.flags, &wim->out_fd);