diff options
author | Karel Zak | 2013-02-19 13:09:48 +0100 |
---|---|---|
committer | Karel Zak | 2013-02-19 13:09:48 +0100 |
commit | 583120378d577f0882ad6db27743f87faf3745ff (patch) | |
tree | d085ef04af9d9c0cb62f1ea425e6c63ea1296ca1 | |
parent | findmnt: allow to read (PART)UUID/LABEL from udev DB (diff) | |
download | kernel-qcow2-util-linux-583120378d577f0882ad6db27743f87faf3745ff.tar.gz kernel-qcow2-util-linux-583120378d577f0882ad6db27743f87faf3745ff.tar.xz kernel-qcow2-util-linux-583120378d577f0882ad6db27743f87faf3745ff.zip |
libblkid: return disk ID/UUID by PT binary interface
Add blkid_parttable_get_id() function.
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r-- | libblkid/docs/libblkid-sections.txt | 1 | ||||
-rw-r--r-- | libblkid/samples/partitions.c | 5 | ||||
-rw-r--r-- | libblkid/src/blkid.h.in | 3 | ||||
-rw-r--r-- | libblkid/src/blkid.sym | 1 | ||||
-rw-r--r-- | libblkid/src/partitions/dos.c | 11 | ||||
-rw-r--r-- | libblkid/src/partitions/dos.h | 7 | ||||
-rw-r--r-- | libblkid/src/partitions/gpt.c | 4 | ||||
-rw-r--r-- | libblkid/src/partitions/partitions.c | 28 | ||||
-rw-r--r-- | libblkid/src/partitions/partitions.h | 2 |
9 files changed, 58 insertions, 4 deletions
diff --git a/libblkid/docs/libblkid-sections.txt b/libblkid/docs/libblkid-sections.txt index 511fc30c4..265bfcaa1 100644 --- a/libblkid/docs/libblkid-sections.txt +++ b/libblkid/docs/libblkid-sections.txt @@ -98,6 +98,7 @@ blkid_partlist_numof_partitions blkid_partlist_devno_to_partition blkid_partlist_get_table <SUBSECTION> +blkid_parttable_get_id blkid_parttable_get_offset blkid_parttable_get_parent blkid_parttable_get_type diff --git a/libblkid/samples/partitions.c b/libblkid/samples/partitions.c index 3b5273649..fe0ad4827 100644 --- a/libblkid/samples/partitions.c +++ b/libblkid/samples/partitions.c @@ -48,11 +48,12 @@ int main(int argc, char *argv[]) errx(EXIT_FAILURE, "%s: does not contains any " "known partition table\n", devname); - printf("size: %jd, sector size: %u, PT: %s, offset: %jd\n---\n", + printf("size: %jd, sector size: %u, PT: %s, offset: %jd, id=%s\n---\n", blkid_probe_get_size(pr), blkid_probe_get_sectorsize(pr), blkid_parttable_get_type(root_tab), - blkid_parttable_get_offset(root_tab)); + blkid_parttable_get_offset(root_tab), + blkid_parttable_get_id(root_tab)); /* * List partitions diff --git a/libblkid/src/blkid.h.in b/libblkid/src/blkid.h.in index 44f2aa7b6..68a82c356 100644 --- a/libblkid/src/blkid.h.in +++ b/libblkid/src/blkid.h.in @@ -391,6 +391,9 @@ extern int blkid_partition_is_primary(blkid_partition par) extern const char *blkid_parttable_get_type(blkid_parttable tab) __ul_attribute__((warn_unused_result)); +extern const char *blkid_parttable_get_id(blkid_parttable tab) + __ul_attribute__((warn_unused_result)); + extern blkid_loff_t blkid_parttable_get_offset(blkid_parttable tab) __ul_attribute__((warn_unused_result)); extern blkid_partition blkid_parttable_get_parent(blkid_parttable tab) diff --git a/libblkid/src/blkid.sym b/libblkid/src/blkid.sym index cf2a16f94..012fe26c1 100644 --- a/libblkid/src/blkid.sym +++ b/libblkid/src/blkid.sym @@ -152,4 +152,5 @@ global: BLKID_2.23 { global: blkid_probe_step_back; + blkid_parttable_get_id; } BLKID_2.21; diff --git a/libblkid/src/partitions/dos.c b/libblkid/src/partitions/dos.c index 22d2625df..58877691d 100644 --- a/libblkid/src/partitions/dos.c +++ b/libblkid/src/partitions/dos.c @@ -137,7 +137,7 @@ static int probe_dos_pt(blkid_probe pr, blkid_partlist ls; struct dos_partition *p0, *p; unsigned char *data; - uint32_t start, size; + uint32_t start, size, id; data = blkid_probe_get_sector(pr, 0); if (!data) @@ -200,6 +200,15 @@ static int probe_dos_pt(blkid_probe pr, if (!tab) goto err; + id = dos_parttable_id(data); + if (id) { + char buf[37]; + + snprintf(buf, sizeof(buf), "0x%08x", id); + blkid_parttable_set_id(tab, (unsigned char *) buf); + } + + /* Parse primary partitions */ for (p = p0, i = 0; i < 4; i++, p++) { blkid_partition par; diff --git a/libblkid/src/partitions/dos.h b/libblkid/src/partitions/dos.h index 130aa0115..d7588a856 100644 --- a/libblkid/src/partitions/dos.h +++ b/libblkid/src/partitions/dos.h @@ -13,7 +13,7 @@ struct dos_partition { #define BLKID_MSDOS_PT_OFFSET 0x1be /* assemble badly aligned little endian integer */ -static inline unsigned int assemble4le(unsigned char *p) +static inline unsigned int assemble4le(const unsigned char *p) { return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); } @@ -33,4 +33,9 @@ static inline int is_valid_mbr_signature(const unsigned char *mbr) return mbr[510] == 0x55 && mbr[511] == 0xaa ? 1 : 0; } +static inline unsigned int dos_parttable_id(const unsigned char *mbr) +{ + return assemble4le(&mbr[440]); +} + #endif /* BLKID_PARTITIONS_DOS_H */ diff --git a/libblkid/src/partitions/gpt.c b/libblkid/src/partitions/gpt.c index 98e82bfd2..7288d683e 100644 --- a/libblkid/src/partitions/gpt.c +++ b/libblkid/src/partitions/gpt.c @@ -334,6 +334,10 @@ static int probe_gpt_pt(blkid_probe pr, if (!tab) goto err; + guid = h->disk_guid; + swap_efi_guid(&guid); + blkid_parttable_set_id(tab, (const unsigned char *) &guid); + ssf = blkid_probe_get_sectorsize(pr) / 512; fu = le64_to_cpu(h->first_usable_lba); diff --git a/libblkid/src/partitions/partitions.c b/libblkid/src/partitions/partitions.c index d51d40744..93ec4d224 100644 --- a/libblkid/src/partitions/partitions.c +++ b/libblkid/src/partitions/partitions.c @@ -163,6 +163,7 @@ struct blkid_struct_parttable { blkid_loff_t offset; /* begin of the partition table */ int nparts; /* number of partitions */ blkid_partition parent; /* parent of nested partition table */ + char id[37]; /* PT identifier (e.g. UUID for GPT) */ struct list_head t_tabs; /* all tables */ }; @@ -1002,6 +1003,33 @@ blkid_partition blkid_partlist_devno_to_partition(blkid_partlist ls, dev_t devno return NULL; } +int blkid_parttable_set_id(blkid_parttable tab, const unsigned char *id) +{ + if (!tab) + return -1; + + if (strcmp(tab->type, "gpt") == 0) + blkid_unparse_uuid(id, tab->id, sizeof(tab->id)); + else if (strcmp(tab->type, "dos") == 0) + strncpy(tab->id, (const char *) id, sizeof(tab->id)); + + return 0; +} + +/** + * blkid_parttable_get_id: + * @tab: partition table + * + * The ID is GPT disk UUID or DOS disk ID (in hex format). + * + * Returns: partition table ID (for example GPT disk UUID) or NULL + */ +const char *blkid_parttable_get_id(blkid_parttable tab) +{ + return tab && tab->id && *tab->id ? tab->id : NULL; +} + + int blkid_partition_set_type(blkid_partition par, int type) { if (!par) diff --git a/libblkid/src/partitions/partitions.h b/libblkid/src/partitions/partitions.h index c4ccd3b65..496bd4a1e 100644 --- a/libblkid/src/partitions/partitions.h +++ b/libblkid/src/partitions/partitions.h @@ -9,6 +9,8 @@ extern int blkid_partitions_get_flags(blkid_probe pr); extern blkid_parttable blkid_partlist_new_parttable(blkid_partlist ls, const char *type, blkid_loff_t offset); +extern int blkid_parttable_set_id(blkid_parttable tab, const unsigned char *id); + extern blkid_partition blkid_partlist_add_partition(blkid_partlist ls, blkid_parttable tab, blkid_loff_t start, blkid_loff_t size); |