chiark / gitweb /
volume_id: add comment about hfs uuid conversion
[elogind.git] / extras / volume_id / lib / hfs.c
index a6e378dd283d6792207bad5fa566d65ae12eb75e..303ad6b041bd6c2d4793189ae62b3581bff179d3 100644 (file)
@@ -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);