X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fvolume_id%2Flib%2Fhfs.c;h=303ad6b041bd6c2d4793189ae62b3581bff179d3;hp=a6e378dd283d6792207bad5fa566d65ae12eb75e;hb=2412f0886d0432643e77243da718a80a44e4d30c;hpb=83cc6ab4760817509f1ed1ee429669e563f82caf diff --git a/extras/volume_id/lib/hfs.c b/extras/volume_id/lib/hfs.c index a6e378dd2..303ad6b04 100644 --- a/extras/volume_id/lib/hfs.c +++ b/extras/volume_id/lib/hfs.c @@ -36,7 +36,7 @@ struct hfs_finder_info{ uint8_t id[8]; } PACKED; -struct hfs_mdb { +static struct hfs_mdb { uint8_t signature[2]; uint32_t cr_date; uint32_t ls_Mod; @@ -104,7 +104,7 @@ struct hfsplus_fork { struct hfsplus_extent extents[HFSPLUS_EXTENT_COUNT]; } PACKED; -struct hfsplus_vol_header { +static struct hfsplus_vol_header { uint8_t signature[2]; uint16_t version; uint32_t attributes; @@ -137,7 +137,33 @@ struct hfsplus_vol_header { #define HFS_NODE_LEAF 0xff #define HFSPLUS_POR_CNID 1 -int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off) +static void hfsid_set_uuid(struct volume_id *id, const uint8_t *hfs_id) +{ +#if 0 + MD5_CTX md5c; + static const uint8_t hash_init[16] = { + 0xb3, 0xe2, 0x0f, 0x39, 0xf2, 0x92, 0x11, 0xd6, + 0x97, 0xa4, 0x00, 0x30, 0x65, 0x43, 0xec, 0xac + }; + uint8_t uuid[16]; + + if (*((uint64_t *)hfs_id) == 0) + return; + + MD5_Init(&md5c); + MD5_Update(&md5c, &hash_init, 16); + MD5_Update(&md5c, hfs_id, 8); + MD5_Final(uuid, &md5c); + + uuid[6] = 0x30 | (uuid[6] & 0x0f); + uuid[8] = 0x80 | (uuid[8] & 0x3f); + volume_id_set_uuid(id, uuid, UUID_DCE); +#endif + + volume_id_set_uuid(id, hfs_id, UUID_HFS); +} + +int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off, uint64_t size) { unsigned int blocksize; unsigned int cat_block; @@ -160,7 +186,7 @@ int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off) struct hfsplus_extent extents[HFSPLUS_EXTENT_COUNT]; const uint8_t *buf; - dbg("probing at offset 0x%llx", (unsigned long long) off); + info("probing at offset 0x%llx", (unsigned long long) off); buf = volume_id_get_buffer(id, off + HFS_SUPERBLOCK_OFFSET, 0x200); if (buf == NULL) @@ -196,7 +222,7 @@ int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off) volume_id_set_label_string(id, hfs->label, hfs->label_len) ; } - volume_id_set_uuid(id, hfs->finder_info.id, UUID_HFS); + hfsid_set_uuid(id, hfs->finder_info.id); volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); id->type = "hfs"; @@ -212,7 +238,7 @@ checkplus: return -1; hfsplus: - volume_id_set_uuid(id, hfsplus->finder_info.id, UUID_HFS); + hfsid_set_uuid(id, hfsplus->finder_info.id); blocksize = be32_to_cpu(hfsplus->blocksize); dbg("blocksize %u", blocksize);