static int bochs_open(BlockDriverState *bs, QDict *options, int flags,

                      Error **errp)

{

    BDRVBochsState *s = bs->opaque;

    int i;

    struct bochs_header bochs;

    struct bochs_header_v1 header_v1;

    int ret;



    bs->read_only = 1; // no write support yet



    ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));

    if (ret < 0) {

        return ret;

    }



    if (strcmp(bochs.magic, HEADER_MAGIC) ||

        strcmp(bochs.type, REDOLOG_TYPE) ||

        strcmp(bochs.subtype, GROWING_TYPE) ||

	((le32_to_cpu(bochs.version) != HEADER_VERSION) &&

	(le32_to_cpu(bochs.version) != HEADER_V1))) {

        error_setg(errp, "Image not in Bochs format");

        return -EINVAL;

    }



    if (le32_to_cpu(bochs.version) == HEADER_V1) {

      memcpy(&header_v1, &bochs, sizeof(bochs));

      bs->total_sectors = le64_to_cpu(header_v1.extra.redolog.disk) / 512;

    } else {

      bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512;

    }



    s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog);

    s->catalog_bitmap = g_malloc(s->catalog_size * 4);



    ret = bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,

                     s->catalog_size * 4);

    if (ret < 0) {

        goto fail;

    }



    for (i = 0; i < s->catalog_size; i++)

	le32_to_cpus(&s->catalog_bitmap[i]);



    s->data_offset = le32_to_cpu(bochs.header) + (s->catalog_size * 4);



    s->bitmap_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.bitmap) - 1) / 512;

    s->extent_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.extent) - 1) / 512;



    s->extent_size = le32_to_cpu(bochs.extra.redolog.extent);



    qemu_co_mutex_init(&s->lock);

    return 0;



fail:

    g_free(s->catalog_bitmap);

    return ret;

}

static int bochs_open(BlockDriverState *bs, QDict *options, int flags,

                      Error **errp)

{

    BDRVBochsState *s = bs->opaque;

    int i;

    struct bochs_header bochs;

    struct bochs_header_v1 header_v1;

    int ret;



    bs->read_only = 1; 



    ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));

    if (ret < 0) {

        return ret;

    }



    if (strcmp(bochs.magic, HEADER_MAGIC) ||

        strcmp(bochs.type, REDOLOG_TYPE) ||

        strcmp(bochs.subtype, GROWING_TYPE) ||

	((le32_to_cpu(bochs.version) != HEADER_VERSION) &&

	(le32_to_cpu(bochs.version) != HEADER_V1))) {

        error_setg(errp, "Image not in Bochs format");

        return -EINVAL;

    }



    if (le32_to_cpu(bochs.version) == HEADER_V1) {

      memcpy(&header_v1, &bochs, sizeof(bochs));

      bs->total_sectors = le64_to_cpu(header_v1.extra.redolog.disk) / 512;

    } else {

      bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512;

    }



    s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog);

    s->catalog_bitmap = g_malloc(s->catalog_size * 4);



    ret = bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,

                     s->catalog_size * 4);

    if (ret < 0) {

        goto fail;

    }



    for (i = 0; i < s->catalog_size; i++)

	le32_to_cpus(&s->catalog_bitmap[i]);



    s->data_offset = le32_to_cpu(bochs.header) + (s->catalog_size * 4);



    s->bitmap_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.bitmap) - 1) / 512;

    s->extent_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.extent) - 1) / 512;



    s->extent_size = le32_to_cpu(bochs.extra.redolog.extent);



    qemu_co_mutex_init(&s->lock);

    return 0;



fail:

    g_free(s->catalog_bitmap);

    return ret;

}

    struct bochs_header_v1 header_v1;       memcpy(&header_v1, &bochs, sizeof(bochs));       bs->total_sectors = le64_to_cpu(header_v1.extra.redolog.disk) / 512;       bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512;     s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog);     s->bitmap_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.bitmap) - 1) / 512;     s->extent_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.extent) - 1) / 512;     s->extent_size = le32_to_cpu(bochs.extra.redolog.extent);
static int FUNC_0(BlockDriverState *VAR_0, QDict *VAR_1, int VAR_2,

                      Error **VAR_3)

{

    BDRVBochsState *s = VAR_0->opaque;

    int VAR_4;

    struct bochs_header VAR_5;

    struct bochs_header_v1 VAR_6;

    int VAR_7;



    VAR_0->read_only = 1; 



    VAR_7 = bdrv_pread(VAR_0->file, 0, &VAR_5, sizeof(VAR_5));

    if (VAR_7 < 0) {

        return VAR_7;

    }



    if (strcmp(VAR_5.magic, HEADER_MAGIC) ||

        strcmp(VAR_5.type, REDOLOG_TYPE) ||

        strcmp(VAR_5.subtype, GROWING_TYPE) ||

	((le32_to_cpu(VAR_5.version) != HEADER_VERSION) &&

	(le32_to_cpu(VAR_5.version) != HEADER_V1))) {

        error_setg(VAR_3, "Image not in Bochs format");

        return -EINVAL;

    }



    if (le32_to_cpu(VAR_5.version) == HEADER_V1) {

      memcpy(&VAR_6, &VAR_5, sizeof(VAR_5));

      VAR_0->total_sectors = le64_to_cpu(VAR_6.extra.redolog.disk) / 512;

    } else {

      VAR_0->total_sectors = le64_to_cpu(VAR_5.extra.redolog.disk) / 512;

    }



    s->catalog_size = le32_to_cpu(VAR_5.extra.redolog.catalog);

    s->catalog_bitmap = g_malloc(s->catalog_size * 4);



    VAR_7 = bdrv_pread(VAR_0->file, le32_to_cpu(VAR_5.header), s->catalog_bitmap,

                     s->catalog_size * 4);

    if (VAR_7 < 0) {

        goto fail;

    }



    for (VAR_4 = 0; VAR_4 < s->catalog_size; VAR_4++)

	le32_to_cpus(&s->catalog_bitmap[VAR_4]);



    s->data_offset = le32_to_cpu(VAR_5.header) + (s->catalog_size * 4);



    s->bitmap_blocks = 1 + (le32_to_cpu(VAR_5.extra.redolog.bitmap) - 1) / 512;

    s->extent_blocks = 1 + (le32_to_cpu(VAR_5.extra.redolog.extent) - 1) / 512;



    s->extent_size = le32_to_cpu(VAR_5.extra.redolog.extent);



    qemu_co_mutex_init(&s->lock);

    return 0;



fail:

    g_free(s->catalog_bitmap);

    return VAR_7;

}

static int FUNC_0(BlockDriverState *VAR_0, QDict *VAR_1, int VAR_2,
Error **VAR_3)
{ BDRVBochsState *s = VAR_0->opaque; int VAR_4; struct bochs_header VAR_5; struct bochs_header_v1 VAR_6; int VAR_7; VAR_0->read_only = 1; VAR_7 = bdrv_pread(VAR_0->file, 0, &VAR_5, sizeof(VAR_5)); if (VAR_7 < 0) { return VAR_7; } if (strcmp(VAR_5.magic, HEADER_MAGIC) ||
strcmp(VAR_5.type, REDOLOG_TYPE) ||
strcmp(VAR_5.subtype, GROWING_TYPE) ||
((le32_to_cpu(VAR_5.version) != HEADER_VERSION) &&
(le32_to_cpu(VAR_5.version) != HEADER_V1))) { error_setg(VAR_3, "Image not in Bochs format"); return -EINVAL; } if (le32_to_cpu(VAR_5.version) == HEADER_V1) { memcpy(&VAR_6, &VAR_5, sizeof(VAR_5)); VAR_0->total_sectors = le64_to_cpu(VAR_6.extra.redolog.disk) / 512; } else { VAR_0->total_sectors = le64_to_cpu(VAR_5.extra.redolog.disk) / 512; } s->catalog_size = le32_to_cpu(VAR_5.extra.redolog.catalog); s->catalog_bitmap = g_malloc(s->catalog_size * 4); VAR_7 = bdrv_pread(VAR_0->file, le32_to_cpu(VAR_5.header), s->catalog_bitmap,
s->catalog_size * 4); if (VAR_7 < 0) { goto fail; } for (VAR_4 = 0; VAR_4 < s->catalog_size; VAR_4++) le32_to_cpus(&s->catalog_bitmap[VAR_4]); s->data_offset = le32_to_cpu(VAR_5.header) + (s->catalog_size * 4); s->bitmap_blocks = 1 + (le32_to_cpu(VAR_5.extra.redolog.bitmap) - 1) / 512; s->extent_blocks = 1 + (le32_to_cpu(VAR_5.extra.redolog.extent) - 1) / 512; s->extent_size = le32_to_cpu(VAR_5.extra.redolog.extent); qemu_co_mutex_init(&s->lock); return 0; fail:
g_free(s->catalog_bitmap); return VAR_7; }