]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add fdisk_partition_toggle_flag()
authorKarel Zak <kzak@redhat.com>
Fri, 22 Feb 2013 21:46:51 +0000 (22:46 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Mar 2013 12:00:57 +0000 (13:00 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk.c
fdisks/fdiskdoslabel.c
fdisks/fdiskdoslabel.h
fdisks/fdisksgilabel.c
fdisks/fdisksgilabel.h
fdisks/fdisksunlabel.c
libfdisk/src/fdiskP.h
libfdisk/src/label.c
libfdisk/src/libfdisk.h

index 3c569d83135fd3d6f2a04e69f1495003365461f7..179b905b27f346d95b4818cd79c0ee27ee80f6ca 100644 (file)
@@ -1072,15 +1072,17 @@ static void command_prompt(struct fdisk_context *cxt)
                switch (c) {
                case 'a':
                        if (fdisk_is_disklabel(cxt, DOS))
-                               dos_toggle_active(cxt,
-                                       get_partition(cxt, 1, cxt->label->nparts_max));
+                               fdisk_partition_toggle_flag(cxt,
+                                       get_partition(cxt, 1, cxt->label->nparts_max),
+                                       DOS_FLAG_ACTIVE);
                        else if (fdisk_is_disklabel(cxt, SUN))
-                               toggle_sunflags(cxt,
+                               fdisk_partition_toggle_flag(cxt,
                                        get_partition(cxt, 1, cxt->label->nparts_max),
                                        SUN_FLAG_UNMNT);
                        else if (fdisk_is_disklabel(cxt, SGI))
-                               sgi_set_bootpartition(cxt,
-                                       get_partition(cxt, 1, cxt->label->nparts_max));
+                               fdisk_partition_toggle_flag(cxt,
+                                       get_partition(cxt, 1, cxt->label->nparts_max),
+                                       SGI_FLAG_BOOT);
                        else
                                unknown_command(c);
                        break;
@@ -1101,12 +1103,13 @@ static void command_prompt(struct fdisk_context *cxt)
                        if (fdisk_is_disklabel(cxt, DOS))
                                toggle_dos_compatibility_flag(cxt);
                        else if (fdisk_is_disklabel(cxt, SUN))
-                               toggle_sunflags(cxt,
+                               fdisk_partition_toggle_flag(cxt,
                                        get_partition(cxt, 1, cxt->label->nparts_max),
                                        SUN_FLAG_RONLY);
                        else if (fdisk_is_disklabel(cxt, SGI))
-                               sgi_set_swappartition(cxt,
-                                       get_partition(cxt, 1, cxt->label->nparts_max));
+                               fdisk_partition_toggle_flag(cxt,
+                                       get_partition(cxt, 1, cxt->label->nparts_max),
+                                       SGI_FLAG_SWAP);
                        else
                                unknown_command(c);
                        break;
index 1481ca2ff75bb94c53de2d86ea7207e50b39eac4..464a18475900d39215eb979a28e83e3f34be5a1b 100644 (file)
@@ -1402,21 +1402,6 @@ void dos_move_begin(struct fdisk_context *cxt, int i)
        }
 }
 
-void dos_toggle_active(struct fdisk_context *cxt, int i)
-{
-       struct pte *pe = &ptes[i];
-       struct partition *p = pe->part_table;
-
-       if (IS_EXTENDED (p->sys_ind) && !p->boot_ind)
-               fprintf(stderr,
-                       _("WARNING: Partition %d is an extended partition\n"),
-                       i + 1);
-       p->boot_ind = (p->boot_ind ? 0 : ACTIVE_FLAG);
-       pe->changed = 1;
-       fdisk_label_set_changed(cxt->label, 1);
-}
-
-
 static int dos_get_partition_status(
                struct fdisk_context *cxt,
                size_t i,
@@ -1442,6 +1427,40 @@ static int dos_get_partition_status(
        return 0;
 }
 
+static int dos_toggle_partition_flag(
+               struct fdisk_context *cxt,
+               size_t i,
+               unsigned long flag)
+{
+       struct pte *pe;
+       struct partition *p;
+
+       assert(cxt);
+       assert(cxt->label);
+       assert(fdisk_is_disklabel(cxt, DOS));
+
+       if (i >= cxt->label->nparts_max)
+               return -EINVAL;
+
+       pe = &ptes[i];
+       p = pe->part_table;
+
+       switch (flag) {
+       case DOS_FLAG_ACTIVE:
+               if (IS_EXTENDED(p->sys_ind) && !p->boot_ind)
+                       fdisk_warnx(cxt, _("WARNING: Partition %d is an extended partition"), i + 1);
+
+               p->boot_ind = (p->boot_ind ? 0 : ACTIVE_FLAG);
+               pe->changed = 1;
+               fdisk_label_set_changed(cxt->label, 1);
+               break;
+       default:
+               return 1;
+       }
+
+       return 0;
+}
+
 static const struct fdisk_label_operations dos_operations =
 {
        .probe          = dos_probe_label,
@@ -1453,6 +1472,7 @@ static const struct fdisk_label_operations dos_operations =
        .part_get_type  = dos_get_parttype,
        .part_set_type  = dos_set_parttype,
 
+       .part_toggle_flag = dos_toggle_partition_flag,
        .part_get_status = dos_get_partition_status,
 
        .reset_alignment = dos_reset_alignment,
index a997be82070daa7a787ef4a7a78131a95101bbbe..1a1144286327d2011201465f548f8206cc8105c2 100644 (file)
@@ -59,4 +59,7 @@ extern int mbr_is_valid_magic(unsigned char *b);
                   (fdisk_is_disklabel(_x, DOS) && \
                     fdisk_dos_is_compatible(fdisk_context_get_label(_x, NULL)))
 
+/* toggle flags */
+#define DOS_FLAG_ACTIVE        1
+
 #endif
index 58f7133b820532df363ef925c64f8a3d72c3b561..9000b3e2514538c0521b720f37989be482d80de1 100644 (file)
@@ -281,22 +281,11 @@ sgi_get_swappartition(struct fdisk_context *cxt)
        return (short) SSWAP16(sgilabel->swap_part);
 }
 
-void
-sgi_set_bootpartition(struct fdisk_context *cxt, int i)
-{
-       sgilabel->boot_part = SSWAP16(((short)i));
-}
-
 static unsigned int
 sgi_get_lastblock(struct fdisk_context *cxt) {
        return cxt->geom.heads * cxt->geom.sectors * cxt->geom.cylinders;
 }
 
-void
-sgi_set_swappartition(struct fdisk_context *cxt, int i) {
-       sgilabel->swap_part = SSWAP16(((short)i));
-}
-
 static int
 sgi_check_bootfile(struct fdisk_context *cxt, const char* aFile)
 {
@@ -1022,6 +1011,29 @@ static int sgi_get_partition_status(
        return 0;
 }
 
+static int sgi_toggle_partition_flag(struct fdisk_context *cxt, size_t i, unsigned long flag)
+{
+       assert(cxt);
+       assert(cxt->label);
+       assert(fdisk_is_disklabel(cxt, SGI));
+
+       if (i >= cxt->label->nparts_max)
+               return -EINVAL;
+
+       switch (flag) {
+       case SGI_FLAG_BOOT:
+               sgilabel->boot_part = sgilabel->boot_part == SSWAP16(i) ? 0 : SSWAP16(i);
+               break;
+       case SGI_FLAG_SWAP:
+               sgilabel->swap_part = sgilabel->swap_part == SSWAP16(i) ? 0 : SSWAP16(i);
+               break;
+       default:
+               return 1;
+       }
+
+       return 0;
+}
+
 static const struct fdisk_label_operations sgi_operations =
 {
        .probe          = sgi_probe_label,
@@ -1033,7 +1045,8 @@ static const struct fdisk_label_operations sgi_operations =
        .part_get_type  = sgi_get_parttype,
        .part_set_type  = sgi_set_parttype,
 
-       .part_get_status = sgi_get_partition_status
+       .part_get_status = sgi_get_partition_status,
+       .part_toggle_flag = sgi_toggle_partition_flag
 };
 
 /*
index ce53ec151e447027ea64b79d2f81397e6071cb36..b89012d0998502fa0c15fea9e82970cd322fd995 100644 (file)
@@ -105,6 +105,10 @@ typedef struct {
 #define SSWAP16(x) (other_endian ? swab16(x) : (uint16_t)(x))
 #define SSWAP32(x) (other_endian ? swab32(x) : (uint32_t)(x))
 
+/* toggle flags */
+#define SGI_FLAG_BOOT  1
+#define SGI_FLAG_SWAP  2
+
 /* fdisk.c */
 #define sgilabel ((sgi_partition *)cxt->firstsector)
 #define sgiparam (sgilabel->devparam)
index 5826465d4dfaf2e2c039ae87175defe30377b8f6..66f459bf53d0a5db0dd092766b8645efcb95fa74 100644 (file)
@@ -305,14 +305,35 @@ static int sun_create_disklabel(struct fdisk_context *cxt)
        return 0;
 }
 
-void toggle_sunflags(struct fdisk_context *cxt, size_t i, uint16_t mask)
+static int sun_toggle_partition_flag(struct fdisk_context *cxt, size_t i, unsigned long flag)
 {
-       struct sun_disklabel *sunlabel = self_disklabel(cxt);
-       struct sun_info *p = &sunlabel->vtoc.infos[i];
+       struct sun_disklabel *sunlabel;
+       struct sun_info *p;
+
+       assert(cxt);
+       assert(cxt->label);
+       assert(fdisk_is_disklabel(cxt, SUN));
 
-       p->flags ^= cpu_to_be16(mask);
+       if (!i >= cxt->label->nparts_max)
+               return -EINVAL;
 
-       fdisk_label_set_changed(cxt->label, 1);
+       sunlabel = self_disklabel(cxt);
+       p = &sunlabel->vtoc.infos[i];
+
+       switch (flag) {
+       case SUN_FLAG_UNMNT:
+               p->flags ^= cpu_to_be16(SUN_FLAG_UNMNT);
+               fdisk_label_set_changed(cxt->label, 1);
+               break;
+       case SUN_FLAG_RONLY:
+               p->flags ^= cpu_to_be16(SUN_FLAG_RONLY);
+               fdisk_label_set_changed(cxt->label, 1);
+               break;
+       default:
+               return 1;
+       }
+
+       return 0;
 }
 
 static void fetch_sun(struct fdisk_context *cxt,
@@ -939,6 +960,7 @@ const struct fdisk_label_operations sun_operations =
        .part_set_type  = sun_set_parttype,
 
        .part_get_status = sun_get_partition_status,
+       .part_toggle_flag = sun_toggle_partition_flag,
 
        .reset_alignment = sun_reset_alignment,
 };
index 4c66a5a330e33ee8e9949cce59fff4252b44d081..7a528eb57bd03bbf61597db14fe5b170c9fd65bb 100644 (file)
@@ -164,6 +164,8 @@ struct fdisk_label_operations {
                                                size_t partnum,
                                                int *status);
 
+       int (*part_toggle_flag)(struct fdisk_context *cxt, size_t i, unsigned long flag);
+
        /* refresh alignment setting */
        int (*reset_alignment)(struct fdisk_context *cxt);
 
index f80bf66b126710f288b480f8de81ab62f9ee32d2..d8ce279db3d4cd28b35eead9044c01743f2b0556 100644 (file)
@@ -263,7 +263,32 @@ int fdisk_partition_get_status(struct fdisk_context *cxt,
 
        rc = cxt->label->op->part_get_status(cxt, partnum, status);
 
-       /* DBG(LABEL, dbgprint("partition: %zd: status: 0x%04x [rc=%d]", partnum, *status, rc)); */
+       DBG(LABEL, dbgprint("partition: %zd: status: 0x%04x [rc=%d]", partnum, *status, rc));
+       return rc;
+}
+
+/**
+ * fdisk_partition_taggle_flag:
+ * @cxt: fdisk context
+ * @partnum: partition number
+ * @status: flags
+ *
+ * Returns 0 on success, otherwise, a corresponding error.
+ */
+int fdisk_partition_toggle_flag(struct fdisk_context *cxt,
+                              size_t partnum,
+                              unsigned long flag)
+{
+       int rc;
+
+       if (!cxt || !cxt->label)
+               return -EINVAL;
+       if (!cxt->label->op->part_toggle_flag)
+               return -ENOSYS;
+
+       rc = cxt->label->op->part_toggle_flag(cxt, partnum, flag);
+
+       DBG(LABEL, dbgprint("partition: %zd: toggle: 0x%04lx [rc=%d]", partnum, flag, rc));
        return rc;
 }
 
index f60b3eb553ab07d75745402da90d5daa9d380027..87dad95ac25373a9d15846fe15dbaa27622745c4 100644 (file)
@@ -62,6 +62,8 @@ enum {
        FDISK_ASKTYPE_YESNO
 };
 
+
+
 /* init.c */
 extern void fdisk_init_debug(int mask);
 
@@ -119,6 +121,7 @@ extern void fdisk_label_set_changed(struct fdisk_label *lb, int changed);
 extern int fdisk_label_is_changed(struct fdisk_label *lb);
 
 extern int fdisk_partition_get_status(struct fdisk_context *cxt, size_t partnum, int *status);
+extern int fdisk_partition_toggle_flag(struct fdisk_context *cxt, size_t partnum, unsigned long flag);
 
 /* alignment.c */
 extern int fdisk_reset_alignment(struct fdisk_context *cxt);