diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2008-12-09 18:14:23 +0100 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2008-12-09 18:14:23 +0100 |
commit | 14e182788853c56b14aa28dccf326c7d1671cfb5 (patch) | |
tree | 2a1c1b7dc41c70ff51033628dd0acd17558dd875 /extras/volume_id/lib | |
parent | 07d9b845c665f9f0288585aed7c913b7f323df99 (diff) |
volume_id: support sub-uuid's and plug in btrfs device uuid
Diffstat (limited to 'extras/volume_id/lib')
-rw-r--r-- | extras/volume_id/lib/btrfs.c | 1 | ||||
-rw-r--r-- | extras/volume_id/lib/exported_symbols | 1 | ||||
-rw-r--r-- | extras/volume_id/lib/libvolume_id-private.h | 4 | ||||
-rw-r--r-- | extras/volume_id/lib/libvolume_id.h | 1 | ||||
-rw-r--r-- | extras/volume_id/lib/util.c | 48 | ||||
-rw-r--r-- | extras/volume_id/lib/volume_id.c | 13 |
6 files changed, 51 insertions, 17 deletions
diff --git a/extras/volume_id/lib/btrfs.c b/extras/volume_id/lib/btrfs.c index 09b03a68dc..5ef979f2f0 100644 --- a/extras/volume_id/lib/btrfs.c +++ b/extras/volume_id/lib/btrfs.c @@ -93,6 +93,7 @@ int volume_id_probe_btrfs(struct volume_id *id, uint64_t off, uint64_t size) if (memcmp(bfs->magic, "_BHRfS_M", 8) != 0) return -1; volume_id_set_uuid(id, bfs->fsid, 0, UUID_DCE); + volume_id_set_uuid_sub(id, bfs->dev_item.uuid, 0, UUID_DCE); volume_id_set_label_raw(id, bfs->label, 256); volume_id_set_label_string(id, bfs->label, 256); volume_id_set_usage(id, VOLUME_ID_FILESYSTEM); diff --git a/extras/volume_id/lib/exported_symbols b/extras/volume_id/lib/exported_symbols index d3b925c683..215a267dad 100644 --- a/extras/volume_id/lib/exported_symbols +++ b/extras/volume_id/lib/exported_symbols @@ -3,6 +3,7 @@ volume_id_get_label volume_id_get_label_raw volume_id_get_uuid volume_id_get_uuid_raw +volume_id_get_uuid_sub volume_id_get_usage volume_id_get_type volume_id_get_type_version diff --git a/extras/volume_id/lib/libvolume_id-private.h b/extras/volume_id/lib/libvolume_id-private.h index 8a5c327aea..046a1e39ed 100644 --- a/extras/volume_id/lib/libvolume_id-private.h +++ b/extras/volume_id/lib/libvolume_id-private.h @@ -107,6 +107,9 @@ struct volume_id { uint8_t uuid_raw[VOLUME_ID_UUID_SIZE]; size_t uuid_raw_len; char uuid[VOLUME_ID_UUID_SIZE+1]; + uint8_t uuid_sub_raw[VOLUME_ID_UUID_SIZE]; + size_t uuid_sub_raw_len; + char uuid_sub[VOLUME_ID_UUID_SIZE+1]; enum volume_id_usage usage_id; char *usage; char *type; @@ -129,6 +132,7 @@ extern void volume_id_set_label_raw(struct volume_id *id, const uint8_t *buf, si extern void volume_id_set_label_string(struct volume_id *id, const uint8_t *buf, size_t count); extern void volume_id_set_label_unicode16(struct volume_id *id, const uint8_t *buf, enum endian endianess, size_t count); extern void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format); +extern void volume_id_set_uuid_sub(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format); extern uint8_t *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len); extern void volume_id_free_buffer(struct volume_id *id); diff --git a/extras/volume_id/lib/libvolume_id.h b/extras/volume_id/lib/libvolume_id.h index e830504697..24c9c4e7eb 100644 --- a/extras/volume_id/lib/libvolume_id.h +++ b/extras/volume_id/lib/libvolume_id.h @@ -45,6 +45,7 @@ extern void volume_id_all_probers(all_probers_fn_t all_probers_fn, extern int volume_id_get_label(struct volume_id *id, const char **label); extern int volume_id_get_label_raw(struct volume_id *id, const uint8_t **label, size_t *len); extern int volume_id_get_uuid(struct volume_id *id, const char **uuid); +extern int volume_id_get_uuid_sub(struct volume_id *id, const char **uuid); extern int volume_id_get_uuid_raw(struct volume_id *id, const uint8_t **uuid, size_t *len); extern int volume_id_get_usage(struct volume_id *id, const char **usage); extern int volume_id_get_type(struct volume_id *id, const char **type); diff --git a/extras/volume_id/lib/util.c b/extras/volume_id/lib/util.c index 9844e5e97c..ea5ff16e91 100644 --- a/extras/volume_id/lib/util.c +++ b/extras/volume_id/lib/util.c @@ -250,14 +250,12 @@ void volume_id_set_label_unicode16(struct volume_id *id, const uint8_t *buf, enu volume_id_set_unicode16((uint8_t *)id->label, sizeof(id->label), buf, endianess, count); } -void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format) +static void set_uuid(const uint8_t *buf, size_t len, enum uuid_format format, + char *uuid, uint8_t *uuid_raw, size_t *uuid_raw_len) { unsigned int i; unsigned int count = 0; - if (len > sizeof(id->uuid_raw)) - len = sizeof(id->uuid_raw); - switch(format) { case UUID_STRING: count = len; @@ -281,8 +279,8 @@ void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, en count = 32; break; } - memcpy(id->uuid_raw, buf, count); - id->uuid_raw_len = count; + memcpy(uuid_raw, buf, count); + *uuid_raw_len = count; /* if set, create string in the same format, the native platform uses */ for (i = 0; i < count; i++) @@ -293,16 +291,16 @@ void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, en set: switch(format) { case UUID_DOS: - sprintf(id->uuid, "%02X%02X-%02X%02X", + sprintf(uuid, "%02X%02X-%02X%02X", buf[3], buf[2], buf[1], buf[0]); break; case UUID_64BIT_LE: - sprintf(id->uuid,"%02X%02X%02X%02X%02X%02X%02X%02X", + sprintf(uuid,"%02X%02X%02X%02X%02X%02X%02X%02X", buf[7], buf[6], buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]); break; case UUID_DCE: - sprintf(id->uuid, + sprintf(uuid, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], @@ -312,18 +310,18 @@ set: break; case UUID_HEX_STRING: /* translate A..F to a..f */ - memcpy(id->uuid, buf, count); + memcpy(uuid, buf, count); for (i = 0; i < count; i++) - if (id->uuid[i] >= 'A' && id->uuid[i] <= 'F') - id->uuid[i] = (id->uuid[i] - 'A') + 'a'; - id->uuid[count] = '\0'; + if (uuid[i] >= 'A' && uuid[i] <= 'F') + uuid[i] = (uuid[i] - 'A') + 'a'; + uuid[count] = '\0'; break; case UUID_STRING: - memcpy(id->uuid, buf, count); - id->uuid[count] = '\0'; + memcpy(uuid, buf, count); + uuid[count] = '\0'; break; case UUID_MD: - sprintf(id->uuid, + sprintf(uuid, "%02x%02x%02x%02x:%02x%02x%02x%02x:%02x%02x%02x%02x:%02x%02x%02x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], @@ -331,7 +329,7 @@ set: buf[12], buf[13], buf[14],buf[15]); break; case UUID_LVM: - sprintf(id->uuid, + sprintf(uuid, "%c%c%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c%c%c", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], @@ -344,6 +342,22 @@ set: } } +void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format) +{ + if (len > sizeof(id->uuid_raw)) + len = sizeof(id->uuid_raw); + + set_uuid(buf, len, format, id->uuid, id->uuid_raw, &id->uuid_raw_len); +} + +void volume_id_set_uuid_sub(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format) +{ + if (len > sizeof(id->uuid_sub_raw)) + len = sizeof(id->uuid_sub_raw); + + set_uuid(buf, len, format, id->uuid_sub, id->uuid_sub_raw, &id->uuid_sub_raw_len); +} + uint8_t *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len) { ssize_t buf_len; diff --git a/extras/volume_id/lib/volume_id.c b/extras/volume_id/lib/volume_id.c index 8bbbc38c32..48bfd88624 100644 --- a/extras/volume_id/lib/volume_id.c +++ b/extras/volume_id/lib/volume_id.c @@ -219,6 +219,19 @@ int volume_id_get_uuid_raw(struct volume_id *id, const uint8_t **uuid, size_t *l return 1; } +int volume_id_get_uuid_sub(struct volume_id *id, const char **uuid) +{ + if (id == NULL) + return 0; + if (uuid == NULL) + return 0; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *uuid = id->uuid_sub; + return 1; +} + /** * volume_id_get_usage: * @id: Probing context. |