mirror of
https://github.com/qemu/qemu.git
synced 2024-11-25 03:43:37 +08:00
27685a8dd0
dmg.o was moved to block-obj-m in5505e8b76
to become a separate module, so that its reference to libbz2, since6b383c08c
, doesn't add an extra library to the main executable. Until recently, commit 06e60f70a (blockdev: Add dynamic module loading for block drivers) moved it back to block-obj-y to simplify the design of dynamic loading of block modules. But we don't want to lose the feature of less library dependency on the main executable. The solution here is to move only the bz2 related code to a separate DSO file, and load it when dmg_open is called. dmg_probe doesn't depend on bz2 support to work, and is the only code in this file which can run before dmg_open. While we are at it, fix the unhelpful cast of last argument passed to dmg_uncompress_bz2. Signed-off-by: Fam Zheng <famz@redhat.com> Message-id: 1473043845-13197-4-git-send-email-famz@redhat.com Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
62 lines
2.1 KiB
C
62 lines
2.1 KiB
C
/*
|
|
* DMG bzip2 uncompression
|
|
*
|
|
* Copyright (c) 2004 Johannes E. Schindelin
|
|
* Copyright (c) 2016 Red Hat, Inc.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
#include "qemu/osdep.h"
|
|
#include "qemu-common.h"
|
|
#include "dmg.h"
|
|
#include <bzlib.h>
|
|
|
|
static int dmg_uncompress_bz2_do(char *next_in, unsigned int avail_in,
|
|
char *next_out, unsigned int avail_out)
|
|
{
|
|
int ret;
|
|
uint64_t total_out;
|
|
bz_stream bzstream = {};
|
|
|
|
ret = BZ2_bzDecompressInit(&bzstream, 0, 0);
|
|
if (ret != BZ_OK) {
|
|
return -1;
|
|
}
|
|
bzstream.next_in = next_in;
|
|
bzstream.avail_in = avail_in;
|
|
bzstream.next_out = next_out;
|
|
bzstream.avail_out = avail_out;
|
|
ret = BZ2_bzDecompress(&bzstream);
|
|
total_out = ((uint64_t)bzstream.total_out_hi32 << 32) +
|
|
bzstream.total_out_lo32;
|
|
BZ2_bzDecompressEnd(&bzstream);
|
|
if (ret != BZ_STREAM_END ||
|
|
total_out != avail_out) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
__attribute__((constructor))
|
|
static void dmg_bz2_init(void)
|
|
{
|
|
assert(!dmg_uncompress_bz2);
|
|
dmg_uncompress_bz2 = dmg_uncompress_bz2_do;
|
|
}
|