X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fresource.c;h=8c88129626795b3a3a2c0e76f17c6a66b56cfd1a;hp=dc5b7a806fe24d3bb61aad2bb5528ffd787e2a18;hb=78da4e026457e507e0d4fc930dcfe2855075dc11;hpb=7ce0d372fae285051cbc9740c9fa316d22465d9d diff --git a/src/resource.c b/src/resource.c index dc5b7a80..8c881296 100644 --- a/src/resource.c +++ b/src/resource.c @@ -320,11 +320,11 @@ read_compressed_resource(FILE *fp, * is equal to the uncompressed chunk size. */ if (compressed_chunk_size == uncompressed_chunk_size) { /* Uncompressed chunk */ - if (start_offset != 0) if (fseeko(fp, start_offset, SEEK_CUR)) goto read_error; - if (fread(out_p, 1, partial_chunk_size, fp) != partial_chunk_size) + if (fread(cb ? out_p + start_offset : out_p, + 1, partial_chunk_size, fp) != partial_chunk_size) goto read_error; } else { /* Compressed chunk */ @@ -463,7 +463,7 @@ put_resource_entry(void *p, const struct resource_entry *entry) static FILE * wim_get_fp(WIMStruct *w) { -#ifdef WITH_FUSE +#if defined(WITH_FUSE) || defined(ENABLE_MULTITHREADED_COMPRESSION) pthread_mutex_lock(&w->fp_tab_mutex); FILE *fp; @@ -482,9 +482,9 @@ wim_get_fp(WIMStruct *w) ERROR_WITH_ERRNO("Failed to open `%"TS"'", w->filename); out_unlock: pthread_mutex_unlock(&w->fp_tab_mutex); -#else /* WITH_FUSE */ +#else /* WITH_FUSE || ENABLE_MULTITHREADED_COMPRESSION */ fp = w->fp; -#endif /* !WITH_FUSE */ +#endif /* !WITH_FUSE && !ENABLE_MULTITHREADED_COMPRESSION */ return fp; } @@ -492,7 +492,7 @@ static int wim_release_fp(WIMStruct *w, FILE *fp) { int ret = 0; -#ifdef WITH_FUSE +#if defined(WITH_FUSE) || defined(ENABLE_MULTITHREADED_COMPRESSION) FILE **fp_tab; pthread_mutex_lock(&w->fp_tab_mutex); @@ -516,7 +516,7 @@ wim_release_fp(WIMStruct *w, FILE *fp) w->num_allocated_fps += 4; out_unlock: pthread_mutex_unlock(&w->fp_tab_mutex); -#endif /* WITH_FUSE */ +#endif /* WITH_FUSE || ENABLE_MULTITHREADED_COMPRESSION */ return ret; } @@ -533,22 +533,18 @@ read_partial_wim_resource(const struct wim_lookup_table_entry *lte, int ret; wimlib_assert(lte->resource_location == RESOURCE_IN_WIM); - wimlib_assert(offset + size <= lte->resource_entry.original_size); wim = lte->wim; - if (flags & WIMLIB_RESOURCE_FLAG_THREADSAFE_READ) { wim_fp = wim_get_fp(wim); if (!wim_fp) { - ret = -1; + ret = WIMLIB_ERR_READ; goto out; } } else { wim_fp = lte->wim->fp; } - wimlib_assert(wim_fp != NULL); - if (lte->resource_entry.flags & WIM_RESHDR_FLAG_COMPRESSED && !(flags & WIMLIB_RESOURCE_FLAG_RAW)) { @@ -576,7 +572,7 @@ read_partial_wim_resource(const struct wim_lookup_table_entry *lte, while (size) { size_t bytes_to_read = min(WIM_CHUNK_SIZE, size); size_t bytes_read = fread(buf, 1, bytes_to_read, wim_fp); - + if (bytes_read != bytes_to_read) goto read_error; ret = cb(buf, bytes_read, ctx_or_buf); @@ -593,15 +589,17 @@ read_partial_wim_resource(const struct wim_lookup_table_entry *lte, } goto out_release_fp; read_error: - if (ferror(wim_fp)) { + if (ferror(wim_fp)) ERROR_WITH_ERRNO("Error reading data from WIM"); - } else { + else ERROR("Unexpected EOF in WIM!"); - } ret = WIMLIB_ERR_READ; out_release_fp: - if (flags & WIMLIB_RESOURCE_FLAG_THREADSAFE_READ) - ret |= wim_release_fp(wim, wim_fp); + if (flags & WIMLIB_RESOURCE_FLAG_THREADSAFE_READ) { + int ret2 = wim_release_fp(wim, wim_fp); + if (ret == 0) + ret = ret2; + } out: if (ret) { if (errno == 0) @@ -632,6 +630,7 @@ read_wim_resource_prefix(const struct wim_lookup_table_entry *lte, } +#ifndef __WIN32__ static int read_file_on_disk_prefix(const struct wim_lookup_table_entry *lte, u64 size, @@ -678,6 +677,7 @@ out_close: close(fd); return ret; } +#endif /* !__WIN32__ */ static int read_buffer_prefix(const struct wim_lookup_table_entry *lte, @@ -734,7 +734,9 @@ read_resource_prefix(const struct wim_lookup_table_entry *lte, { static const read_resource_prefix_handler_t handlers[] = { [RESOURCE_IN_WIM] = read_wim_resource_prefix, + #ifndef __WIN32__ [RESOURCE_IN_FILE_ON_DISK] = read_file_on_disk_prefix, + #endif [RESOURCE_IN_ATTACHED_BUFFER] = read_buffer_prefix, #ifdef WITH_FUSE [RESOURCE_IN_STAGING_FILE] = read_file_on_disk_prefix, @@ -810,8 +812,8 @@ extract_wim_resource(const struct wim_lookup_table_entry *lte, print_lookup_table_entry(lte, stderr); if (lte->resource_location == RESOURCE_IN_WIM) ERROR("The WIM file appears to be corrupt!"); - ret = WIMLIB_ERR_INVALID_RESOURCE_HASH; #endif + ret = WIMLIB_ERR_INVALID_RESOURCE_HASH; } } } else { @@ -850,6 +852,7 @@ sha1_chunk(const void *buf, size_t len, void *ctx) return 0; } +/* Calculate the SHA1 message digest of a stream. */ int sha1_resource(struct wim_lookup_table_entry *lte) {