/** * fdisk_partition_next_partno: * @pa: partition * @cxt: context * @n: returns partition number * * If partno-follow-default (see fdisk_partition_partno_follow_default()) * enabled then returns next expected partno, otherwise use Ask API to ask user * for the next partno. * * Returns: 0 on success, <0 on error */ int fdisk_partition_next_partno( struct fdisk_partition *pa, struct fdisk_context *cxt, size_t *n) { assert(cxt); assert(n); if (pa && pa->partno_follow_default) { size_t i; DBG(PART, ul_debugobj(pa, "next partno (follow default)")); for (i = 0; i < cxt->label->nparts_max; i++) { if (!fdisk_is_partition_used(cxt, i)) { *n = i; return 0; } } return -ERANGE; } else if (pa && fdisk_partition_has_partno(pa)) { DBG(PART, ul_debugobj(pa, "next partno (specified=%zu)", pa->partno)); if (pa->partno >= cxt->label->nparts_max) return -ERANGE; *n = pa->partno; } else return fdisk_ask_partnum(cxt, n, 1); return 0; }
void change_partition_type(struct fdisk_context *cxt) { size_t i; struct fdisk_parttype *t = NULL, *org_t = NULL; assert(cxt); assert(cxt->label); if (fdisk_ask_partnum(cxt, &i, FALSE)) return; org_t = t = fdisk_get_partition_type(cxt, i); if (!t) fdisk_warnx(cxt, _("Partition %zu does not exist yet!"), i + 1); else { do { t = ask_partition_type(cxt); } while (!t); if (fdisk_set_partition_type(cxt, i, t) == 0) fdisk_sinfo(cxt, FDISK_INFO_SUCCESS, _("Changed type of partition '%s' to '%s'."), org_t ? org_t->name : _("Unknown"), t ? t->name : _("Unknown")); else fdisk_info(cxt, _("Type of partition %zu is unchanged: %s."), i + 1, org_t ? org_t->name : _("Unknown")); } fdisk_free_parttype(t); fdisk_free_parttype(org_t); }
/* * link partition from parent (DOS) to nested BSD partition table */ int fdisk_bsd_link_partition(struct fdisk_context *cxt) { size_t k, i; int rc; struct dos_partition *p; struct bsd_disklabel *d = self_disklabel(cxt); if (!cxt->parent || !fdisk_is_disklabel(cxt->parent, DOS)) { fdisk_warnx(cxt, _("BSD label is not nested within a DOS partition.")); return -EINVAL; } /* ask for DOS partition */ rc = fdisk_ask_partnum(cxt->parent, &k, FALSE); if (rc) return rc; /* ask for BSD partition */ rc = fdisk_ask_partnum(cxt, &i, TRUE); if (rc) return rc; if (i >= BSD_MAXPARTITIONS) return -EINVAL; p = fdisk_dos_get_partition(cxt->parent, k); d->d_partitions[i].p_size = dos_partition_get_size(p); d->d_partitions[i].p_offset = dos_partition_get_start(p); d->d_partitions[i].p_fstype = bsd_translate_fstype(p->sys_ind); if (i >= d->d_npartitions) d->d_npartitions = i + 1; cxt->label->nparts_cur = d->d_npartitions; fdisk_label_set_changed(cxt->label, 1); fdisk_sinfo(cxt, FDISK_INFO_SUCCESS, _("BSD partition '%c' linked to DOS partition %zu."), 'a' + (int) i, k + 1); return 0; }