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;
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;
}
}
-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,
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,
.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,
(fdisk_is_disklabel(_x, DOS) && \
fdisk_dos_is_compatible(fdisk_context_get_label(_x, NULL)))
+/* toggle flags */
+#define DOS_FLAG_ACTIVE 1
+
#endif
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)
{
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,
.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
};
/*
#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)
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,
.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,
};
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);
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;
}
FDISK_ASKTYPE_YESNO
};
+
+
/* init.c */
extern void fdisk_init_debug(int mask);
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);