summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libblkid/docs/libblkid-sections.txt1
-rw-r--r--libblkid/samples/partitions.c5
-rw-r--r--libblkid/src/blkid.h.in3
-rw-r--r--libblkid/src/blkid.sym1
-rw-r--r--libblkid/src/partitions/dos.c11
-rw-r--r--libblkid/src/partitions/dos.h7
-rw-r--r--libblkid/src/partitions/gpt.c4
-rw-r--r--libblkid/src/partitions/partitions.c28
-rw-r--r--libblkid/src/partitions/partitions.h2
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);