]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: classify collision type
authorKarel Zak <kzak@redhat.com>
Tue, 14 Feb 2017 13:23:45 +0000 (14:23 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 14 Feb 2017 13:23:45 +0000 (14:23 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/docs/libfdisk-sections.txt
libfdisk/src/context.c
libfdisk/src/fdiskP.h
libfdisk/src/libfdisk.h.in
libfdisk/src/libfdisk.sym
libfdisk/src/wipe.c

index 11b25b108a6fb34a588fd152aae052d0a2687791..c3c39775454277808e2dd9a70bfdddc6f5f42070 100644 (file)
@@ -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
index 77bc19c943c82e60954ccf9ab809e88bb007bade..5ea8dccd424ed0c557d78d8aadccae917b1345c8 100644 (file)
@@ -388,6 +388,21 @@ const char *fdisk_get_collision(struct fdisk_context *cxt)
        return cxt->collision;
 }
 
+/**
+ * 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
index ca20ffb8f3804806275fee7828a0869acd607322..949475d15d525ebc36238de3bde164a7dcd27802 100644 (file)
@@ -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 */
index 141109ec94be6c56a7101824d45426fe9649fbdd..b55d067ccf5e4b1a93560b7251d47103f3e9d0b2 100644 (file)
@@ -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);
index 9b769d8e5ffb23c0644c6a8f7e0f442f23b2b3b9..e7de4cd0302a33c1075f6108831e8113b8e5b0a4 100644 (file)
@@ -279,4 +279,5 @@ FDISK_2.29 {
 FDISK_2.30 {
        fdisk_script_has_force_label;
        fdisk_is_regfile;
+       fdisk_is_ptcollision;
 } FDISK_2.29;
index c58015d0e840cb03c8831b2519ae2e4f6465f97b..6173830242a000f2a34904f94d9495b0e31f27ab 100644 (file)
@@ -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);