dmg: exchanging hardcoded dmg UDIF block types to enum.

This change is better to understand what kind of block type is being
handled by the code. Using a syntax similar to the DMG documentation is
easier than tracking all hex values assigned to a block type.

Signed-off-by: Julio Faracco <jcfaracco@gmail.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Julio Faracco 2018-11-05 13:08:06 -02:00 committed by Kevin Wolf
parent 7a40b418ec
commit 95a156f689
1 changed files with 28 additions and 15 deletions

View File

@ -44,6 +44,19 @@ enum {
DMG_SECTORCOUNTS_MAX = DMG_LENGTHS_MAX / 512, DMG_SECTORCOUNTS_MAX = DMG_LENGTHS_MAX / 512,
}; };
enum {
/* DMG Block Type */
UDZE = 0, /* Zeroes */
UDRW, /* RAW type */
UDIG, /* Ignore */
UDCO = 0x80000004,
UDZO,
UDBZ,
ULFO,
UDCM = 0x7ffffffe, /* Comments */
UDLE /* Last Entry */
};
static int dmg_probe(const uint8_t *buf, int buf_size, const char *filename) static int dmg_probe(const uint8_t *buf, int buf_size, const char *filename)
{ {
int len; int len;
@ -108,16 +121,16 @@ static void update_max_chunk_size(BDRVDMGState *s, uint32_t chunk,
uint32_t uncompressed_sectors = 0; uint32_t uncompressed_sectors = 0;
switch (s->types[chunk]) { switch (s->types[chunk]) {
case 0x80000005: /* zlib compressed */ case UDZO: /* zlib compressed */
case 0x80000006: /* bzip2 compressed */ case UDBZ: /* bzip2 compressed */
case 0x80000007: /* lzfse compressed */ case ULFO: /* lzfse compressed */
compressed_size = s->lengths[chunk]; compressed_size = s->lengths[chunk];
uncompressed_sectors = s->sectorcounts[chunk]; uncompressed_sectors = s->sectorcounts[chunk];
break; break;
case 1: /* copy */ case UDRW: /* copy */
uncompressed_sectors = DIV_ROUND_UP(s->lengths[chunk], 512); uncompressed_sectors = DIV_ROUND_UP(s->lengths[chunk], 512);
break; break;
case 2: /* zero */ case UDIG: /* zero */
/* as the all-zeroes block may be large, it is treated specially: the /* as the all-zeroes block may be large, it is treated specially: the
* sector is not copied from a large buffer, a simple memset is used * sector is not copied from a large buffer, a simple memset is used
* instead. Therefore uncompressed_sectors does not need to be set. */ * instead. Therefore uncompressed_sectors does not need to be set. */
@ -186,13 +199,13 @@ typedef struct DmgHeaderState {
static bool dmg_is_known_block_type(uint32_t entry_type) static bool dmg_is_known_block_type(uint32_t entry_type)
{ {
switch (entry_type) { switch (entry_type) {
case 0x00000001: /* uncompressed */ case UDRW: /* uncompressed */
case 0x00000002: /* zeroes */ case UDIG: /* zeroes */
case 0x80000005: /* zlib */ case UDZO: /* zlib */
return true; return true;
case 0x80000006: /* bzip2 */ case UDBZ: /* bzip2 */
return !!dmg_uncompress_bz2; return !!dmg_uncompress_bz2;
case 0x80000007: /* lzfse */ case ULFO: /* lzfse */
return !!dmg_uncompress_lzfse; return !!dmg_uncompress_lzfse;
default: default:
return false; return false;
@ -586,7 +599,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
s->current_chunk = s->n_chunks; s->current_chunk = s->n_chunks;
switch (s->types[chunk]) { /* block entry type */ switch (s->types[chunk]) { /* block entry type */
case 0x80000005: { /* zlib compressed */ case UDZO: { /* zlib compressed */
/* we need to buffer, because only the chunk as whole can be /* we need to buffer, because only the chunk as whole can be
* inflated. */ * inflated. */
ret = bdrv_pread(bs->file, s->offsets[chunk], ret = bdrv_pread(bs->file, s->offsets[chunk],
@ -609,7 +622,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
return -1; return -1;
} }
break; } break; }
case 0x80000006: /* bzip2 compressed */ case UDBZ: /* bzip2 compressed */
if (!dmg_uncompress_bz2) { if (!dmg_uncompress_bz2) {
break; break;
} }
@ -630,7 +643,7 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
return ret; return ret;
} }
break; break;
case 0x80000007: case ULFO:
if (!dmg_uncompress_lzfse) { if (!dmg_uncompress_lzfse) {
break; break;
} }
@ -651,14 +664,14 @@ static inline int dmg_read_chunk(BlockDriverState *bs, uint64_t sector_num)
return ret; return ret;
} }
break; break;
case 1: /* copy */ case UDRW: /* copy */
ret = bdrv_pread(bs->file, s->offsets[chunk], ret = bdrv_pread(bs->file, s->offsets[chunk],
s->uncompressed_chunk, s->lengths[chunk]); s->uncompressed_chunk, s->lengths[chunk]);
if (ret != s->lengths[chunk]) { if (ret != s->lengths[chunk]) {
return -1; return -1;
} }
break; break;
case 2: /* zero */ case UDIG: /* zero */
/* see dmg_read, it is treated specially. No buffer needs to be /* see dmg_read, it is treated specially. No buffer needs to be
* pre-filled, the zeroes can be set directly. */ * pre-filled, the zeroes can be set directly. */
break; break;