summaryrefslogtreecommitdiffstats
path: root/libfdisk
diff options
context:
space:
mode:
authorKarel Zak2017-02-14 14:23:45 +0100
committerKarel Zak2017-02-14 14:23:45 +0100
commit0cec78a3c467dfbda06bb846f3a8d861f313ccc3 (patch)
tree7f206d2e82cea6bc7ae62782f43b9b1703596308 /libfdisk
parentlibfdisk: check for collisions when create new label (diff)
downloadkernel-qcow2-util-linux-0cec78a3c467dfbda06bb846f3a8d861f313ccc3.tar.gz
kernel-qcow2-util-linux-0cec78a3c467dfbda06bb846f3a8d861f313ccc3.tar.xz
kernel-qcow2-util-linux-0cec78a3c467dfbda06bb846f3a8d861f313ccc3.zip
libfdisk: classify collision type
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk')
-rw-r--r--libfdisk/docs/libfdisk-sections.txt1
-rw-r--r--libfdisk/src/context.c15
-rw-r--r--libfdisk/src/fdiskP.h1
-rw-r--r--libfdisk/src/libfdisk.h.in1
-rw-r--r--libfdisk/src/libfdisk.sym1
-rw-r--r--libfdisk/src/wipe.c15
6 files changed, 30 insertions, 4 deletions
diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt
index 11b25b108..c3c397754 100644
--- a/libfdisk/docs/libfdisk-sections.txt
+++ b/libfdisk/docs/libfdisk-sections.txt
@@ -314,6 +314,7 @@ fdisk_has_wipe
fdisk_is_details
fdisk_is_labeltype
fdisk_is_listonly
+fdisk_is_ptcollision
fdisk_is_readonly
fdisk_is_regfile
fdisk_new_context
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index 77bc19c94..5ea8dccd4 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -389,6 +389,21 @@ const char *fdisk_get_collision(struct fdisk_context *cxt)
}
/**
+ * fdisk_is_ptcollision:
+ * @cxt: fdisk context
+ *
+ * The collision detected by library is another partition table. Note that libfdisk
+ * does not support all partitions tables, so fdisk_has_label() may return false and
+ * fdisk_is_ptcollision() may return true.
+ *
+ * Returns: 0 or 1
+ */
+int fdisk_is_ptcollision(struct fdisk_context *cxt)
+{
+ return cxt->pt_collision;
+}
+
+/**
* fdisk_get_npartitions:
* @cxt: context
*
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index ca20ffb8f..949475d15 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -366,6 +366,7 @@ struct fdisk_context {
display_in_cyl_units : 1, /* for obscure labels */
display_details : 1, /* expert display mode */
protect_bootbits : 1, /* don't zeroize first sector */
+ pt_collision : 1, /* another PT detected by libblkid */
listonly : 1; /* list partition, nothing else */
char *collision; /* name of already existing FS/PT */
diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in
index 141109ec9..b55d067cc 100644
--- a/libfdisk/src/libfdisk.h.in
+++ b/libfdisk/src/libfdisk.h.in
@@ -193,6 +193,7 @@ int fdisk_is_listonly(struct fdisk_context *cxt);
int fdisk_enable_wipe(struct fdisk_context *cxt, int enable);
int fdisk_has_wipe(struct fdisk_context *cxt);
const char *fdisk_get_collision(struct fdisk_context *cxt);
+int fdisk_is_ptcollision(struct fdisk_context *cxt);
int fdisk_set_unit(struct fdisk_context *cxt, const char *str);
const char *fdisk_get_unit(struct fdisk_context *cxt, int n);
diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym
index 9b769d8e5..e7de4cd03 100644
--- a/libfdisk/src/libfdisk.sym
+++ b/libfdisk/src/libfdisk.sym
@@ -279,4 +279,5 @@ FDISK_2.29 {
FDISK_2.30 {
fdisk_script_has_force_label;
fdisk_is_regfile;
+ fdisk_is_ptcollision;
} FDISK_2.29;
diff --git a/libfdisk/src/wipe.c b/libfdisk/src/wipe.c
index c58015d0e..617383024 100644
--- a/libfdisk/src/wipe.c
+++ b/libfdisk/src/wipe.c
@@ -168,6 +168,10 @@ int fdisk_check_collisions(struct fdisk_context *cxt)
if (rc)
return rc;
+ cxt->pt_collision = 0;
+ free(cxt->collision);
+ cxt->collision = NULL;
+
blkid_probe_enable_superblocks(pr, 1);
blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_TYPE);
blkid_probe_enable_partitions(pr, 1);
@@ -178,12 +182,15 @@ int fdisk_check_collisions(struct fdisk_context *cxt)
if (rc == 0) {
const char *name = NULL;
- if (blkid_probe_lookup_value(pr, "TYPE", &name, 0) == 0 ||
- blkid_probe_lookup_value(pr, "PTTYPE", &name, 0) == 0) {
+ if (blkid_probe_lookup_value(pr, "TYPE", &name, 0) == 0)
+ cxt->collision = strdup(name);
+ else if (blkid_probe_lookup_value(pr, "PTTYPE", &name, 0) == 0) {
cxt->collision = strdup(name);
- if (!cxt->collision)
- rc = -ENOMEM;
+ cxt->pt_collision = 1;
}
+
+ if (name && !cxt->collision)
+ rc = -ENOMEM;
}
blkid_free_probe(pr);