summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven-Göran Bergh <sgb@systemasis.org>2013-01-13 23:37:00 (GMT)
committer Denys Vlasenko <vda.linux@googlemail.com>2013-01-13 23:37:00 (GMT)
commit07b419dbcb34958d0f6050231783bd78f7d0344f (patch)
treef3488ec84172a9e69b3ffb2e9e4cecf0b8854e6f
parenta58f7b7d2f73b84638a8e8c14a142d4a03678eeb (diff)
downloadbusybox-07b419dbcb34958d0f6050231783bd78f7d0344f.tar.gz
busybox-07b419dbcb34958d0f6050231783bd78f7d0344f.tar.bz2
volume_id: display hfs[+] 128-bit UUID properly
Signed-off-by: Sven-Göran Bergh <sgb@systemasis.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--util-linux/volume_id/hfs.c25
-rw-r--r--util-linux/volume_id/util.c6
-rw-r--r--util-linux/volume_id/volume_id_internal.h1
3 files changed, 23 insertions, 9 deletions
diff --git a/util-linux/volume_id/hfs.c b/util-linux/volume_id/hfs.c
index dd5ec24..3d9704d 100644
--- a/util-linux/volume_id/hfs.c
+++ b/util-linux/volume_id/hfs.c
@@ -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);
diff --git a/util-linux/volume_id/util.c b/util-linux/volume_id/util.c
index 69e43dd..11ee0d5 100644
--- a/util-linux/volume_id/util.c
+++ b/util-linux/volume_id/util.c
@@ -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",
diff --git a/util-linux/volume_id/volume_id_internal.h b/util-linux/volume_id/volume_id_internal.h
index 03dc46f..dd62df3 100644
--- a/util-linux/volume_id/volume_id_internal.h
+++ b/util-linux/volume_id/volume_id_internal.h
@@ -141,7 +141,6 @@ enum uuid_format {
UUID_DCE,
UUID_DOS,
UUID_NTFS,
- UUID_HFS,
};
enum endian {