diff options
-rw-r--r-- | libfdisk/docs/libfdisk-sections.txt | 1 | ||||
-rw-r--r-- | libfdisk/src/context.c | 15 | ||||
-rw-r--r-- | libfdisk/src/fdiskP.h | 1 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h.in | 1 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.sym | 1 | ||||
-rw-r--r-- | libfdisk/src/wipe.c | 15 |
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); |