volume_id: display hfs[+] 128-bit UUID properly
authorSven-Göran Bergh <sgb@systemasis.org>
Sun, 13 Jan 2013 23:37:00 +0000 (00:37 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 13 Jan 2013 23:37:00 +0000 (00:37 +0100)
Signed-off-by: Sven-Göran Bergh <sgb@systemasis.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
util-linux/volume_id/hfs.c
util-linux/volume_id/util.c
util-linux/volume_id/volume_id_internal.h

index dd5ec2415423607f10f0a65312b9bd14ee312a29..3d9704d128cbbd2c61fe447e1b0f682a0e4cdb77 100644 (file)
@@ -131,6 +131,27 @@ struct hfsplus_vol_header {
 #define HFS_NODE_LEAF                  0xff
 #define HFSPLUS_POR_CNID               1
 
+static void FAST_FUNC hfs_set_uuid(struct volume_id *id, const uint8_t *hfs_id)
+{
+#define hfs_id_len 8
+       md5_ctx_t md5c;
+       uint8_t uuid[16];
+       unsigned i;
+
+       for (i = 0; i < hfs_id_len; i++)
+               if (hfs_id[i] != 0)
+                       goto do_md5;
+       return;
+ do_md5:
+       md5_begin(&md5c);
+       md5_hash(&md5c, "\263\342\17\71\362\222\21\326\227\244\0\60\145\103\354\254", 16);
+       md5_hash(&md5c, hfs_id, hfs_id_len);
+       md5_end(&md5c, uuid);
+       uuid[6] = 0x30 | (uuid[6] & 0x0f);
+       uuid[8] = 0x80 | (uuid[8] & 0x3f);
+       volume_id_set_uuid(id, uuid, UUID_DCE);
+}
+
 int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/)
 {
        uint64_t off = 0;
@@ -193,7 +214,7 @@ int FAST_FUNC 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);
+       hfs_set_uuid(id, hfs->finder_info.id);
 //     volume_id_set_usage(id, VOLUME_ID_FILESYSTEM);
        IF_FEATURE_BLKID_TYPE(id->type = "hfs";)
 
@@ -207,7 +228,7 @@ int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/
        return -1;
 
  hfsplus:
-       volume_id_set_uuid(id, hfsplus->finder_info.id, UUID_HFS);
+       hfs_set_uuid(id, hfsplus->finder_info.id);
 
        blocksize = be32_to_cpu(hfsplus->blocksize);
        dbg("blocksize %u", blocksize);
index 69e43dda886bc3e833c5b04984b3abbb28c77c88..11ee0d52ef7516a397f8c2ae98338aee3c88403c 100644 (file)
@@ -142,7 +142,6 @@ void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, enum uuid_form
                count = 4;
                break;
        case UUID_NTFS:
-       case UUID_HFS:
                count = 8;
                break;
        case UUID_DCE:
@@ -173,11 +172,6 @@ set:
                        buf[7], buf[6], buf[5], buf[4],
                        buf[3], buf[2], buf[1], buf[0]);
                break;
-       case UUID_HFS:
-               sprintf(id->uuid, "%02X%02X%02X%02X%02X%02X%02X%02X",
-                       buf[0], buf[1], buf[2], buf[3],
-                       buf[4], buf[5], buf[6], buf[7]);
-               break;
        case UUID_DCE:
                sprintf(id->uuid,
                        "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
index 03dc46f274b4526195cf77fa7e9c02a3f9237930..dd62df399d09f2d8f1c831673737fe3062930655 100644 (file)
@@ -141,7 +141,6 @@ enum uuid_format {
        UUID_DCE,
        UUID_DOS,
        UUID_NTFS,
-       UUID_HFS,
 };
 
 enum endian {