/** * fdisk_set_partition: * @cxt: context * @partno: partition number (0 is the first partition) * @pa: new partition setting * * Modifies disklabel according to setting with in @pa. * * Returns: 0 on success, <0 on error. */ int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition *pa) { struct fdisk_partition *xpa = pa; int rc; if (!cxt || !cxt->label || !pa) return -EINVAL; if (!cxt->label->op->set_part) return -ENOSYS; if (pa->resize || fdisk_partition_has_start(pa) || fdisk_partition_has_size(pa)) { xpa = __copy_partition(pa); xpa->movestart = 0; xpa->resize = 0; FDISK_INIT_UNDEF(xpa->size); FDISK_INIT_UNDEF(xpa->start); rc = recount_resize(cxt, partno, xpa, pa); if (rc) goto done; } DBG(CXT, ul_debugobj(cxt, "setting partition %zu %p (start=%ju, end=%ju, size=%ju)", partno, xpa, (uintmax_t) fdisk_partition_get_start(xpa), (uintmax_t) fdisk_partition_get_end(xpa), (uintmax_t) fdisk_partition_get_size(xpa))); rc = cxt->label->op->set_part(cxt, partno, xpa); done: if (xpa != pa) fdisk_unref_partition(xpa); return rc; }
/** * fdisk_add_partition: * @cxt: fdisk context * @pa: template for the partition (or NULL) * @partno: NULL or returns new partition number * * If @pa is not specified or any @pa item is missiong the libfdisk will ask by * fdisk_ask_ API. * * Adds a new partition to disklabel. * * Returns: 0 on success, <0 on error. */ int fdisk_add_partition(struct fdisk_context *cxt, struct fdisk_partition *pa, size_t *partno) { int rc; assert(cxt); assert(cxt->label); if (!cxt || !cxt->label) return -EINVAL; if (!cxt->label->op->add_part) return -ENOSYS; if (fdisk_missing_geometry(cxt)) return -EINVAL; if (pa) DBG(CXT, ul_debugobj(cxt, "adding new partition %p (start=%ju, end=%ju, size=%ju, " "defaults(start=%s, end=%s, partno=%s)", pa, (uintmax_t) fdisk_partition_get_start(pa), (uintmax_t) fdisk_partition_get_end(pa), (uintmax_t) fdisk_partition_get_size(pa), pa->start_follow_default ? "yes" : "no", pa->end_follow_default ? "yes" : "no", pa->partno_follow_default ? "yes" : "no")); else DBG(CXT, ul_debugobj(cxt, "adding partition")); rc = cxt->label->op->add_part(cxt, pa, partno); DBG(CXT, ul_debugobj(cxt, "add partition done (rc=%d)", rc)); return rc; }
/** * fdisk_set_partition: * @cxt: context * @partno: partition number (0 is the first partition) * @pa: new partition setting * * Modifies disklabel according to setting with in @pa. * * Returns: 0 on success, <0 on error. */ int fdisk_set_partition(struct fdisk_context *cxt, size_t partno, struct fdisk_partition *pa) { if (!cxt || !cxt->label || !pa) return -EINVAL; if (!cxt->label->op->set_part) return -ENOSYS; DBG(CXT, ul_debugobj(cxt, "setting partition %zu %p (start=%ju, end=%ju, size=%ju, " "defaults(start=%s, end=%s, partno=%s)", partno, pa, (uintmax_t) fdisk_partition_get_start(pa), (uintmax_t) fdisk_partition_get_end(pa), (uintmax_t) fdisk_partition_get_size(pa), pa->start_follow_default ? "yes" : "no", pa->end_follow_default ? "yes" : "no", pa->partno_follow_default ? "yes" : "no")); return cxt->label->op->set_part(cxt, partno, pa); }
/** * fdisk_partition_to_string: * @pa: partition * @cxt: context * @id: field (FDISK_FIELD_*) * @data: returns string with allocated data * * Returns info about partition converted to printable string. * * For example * <informalexample> * <programlisting> * struct fdisk_parition *pa; * * fdisk_get_partition(cxt, 0, &pa); * fdisk_partition_to_string(pa, FDISK_FIELD_UUID, &data); * printf("first partition uuid: %s\n", data); * free(data); * fdisk_unref_partition(pa); * </programlisting> * </informalexample> * * returns UUID for the first partition. * * Returns: 0 on success, otherwise, a corresponding error. */ int fdisk_partition_to_string(struct fdisk_partition *pa, struct fdisk_context *cxt, int id, char **data) { char *p = NULL; int rc = 0; uint64_t x; if (!pa || !cxt || !data) return -EINVAL; switch (id) { case FDISK_FIELD_DEVICE: if (pa->freespace) p = strdup(_("Free space")); else if (fdisk_partition_has_partno(pa) && cxt->dev_path) { if (cxt->label->flags & FDISK_LABEL_FL_INCHARS_PARTNO) rc = asprintf(&p, "%c", (int) pa->partno + 'a'); else p = fdisk_partname(cxt->dev_path, pa->partno + 1); } break; case FDISK_FIELD_BOOT: p = fdisk_partition_is_bootable(pa) ? strdup("*") : NULL; break; case FDISK_FIELD_START: if (fdisk_partition_has_start(pa)) { x = fdisk_cround(cxt, pa->start); rc = pa->start_post ? asprintf(&p, "%ju%c", x, pa->start_post) : asprintf(&p, "%ju", x); } break; case FDISK_FIELD_END: if (fdisk_partition_has_end(pa)) { x = fdisk_cround(cxt, fdisk_partition_get_end(pa)); rc = pa->end_post ? asprintf(&p, "%ju%c", x, pa->end_post) : asprintf(&p, "%ju", x); } break; case FDISK_FIELD_SIZE: if (fdisk_partition_has_size(pa)) { uint64_t sz = pa->size * cxt->sector_size; switch (cxt->sizeunit) { case FDISK_SIZEUNIT_BYTES: rc = asprintf(&p, "%ju", sz); break; case FDISK_SIZEUNIT_HUMAN: if (fdisk_is_details(cxt)) rc = pa->size_post ? asprintf(&p, "%ju%c", sz, pa->size_post) : asprintf(&p, "%ju", sz); else { p = size_to_human_string(SIZE_SUFFIX_1LETTER, sz); if (!p) rc = -ENOMEM; } break; } } break; case FDISK_FIELD_CYLINDERS: rc = asprintf(&p, "%ju", (uintmax_t) fdisk_cround(cxt, fdisk_partition_has_size(pa) ? pa->size : 0)); break; case FDISK_FIELD_SECTORS: rc = asprintf(&p, "%ju", fdisk_partition_has_size(pa) ? (uintmax_t) pa->size : 0); break; case FDISK_FIELD_BSIZE: rc = asprintf(&p, "%ju", pa->bsize); break; case FDISK_FIELD_FSIZE: rc = asprintf(&p, "%ju", pa->fsize); break; case FDISK_FIELD_CPG: rc = asprintf(&p, "%ju", pa->cpg); break; case FDISK_FIELD_TYPE: p = pa->type && pa->type->name ? strdup(_(pa->type->name)) : NULL; break; case FDISK_FIELD_TYPEID: if (pa->type && fdisk_parttype_get_string(pa->type)) rc = asprintf(&p, "%s", fdisk_parttype_get_string(pa->type)); else if (pa->type) rc = asprintf(&p, "%x", fdisk_parttype_get_code(pa->type)); break; case FDISK_FIELD_UUID: p = pa->uuid && *pa->uuid? strdup(pa->uuid) : NULL; break; case FDISK_FIELD_NAME: p = pa->name && *pa->name ? strdup(pa->name) : NULL; break; case FDISK_FIELD_ATTR: p = pa->attrs && *pa->attrs ? strdup(pa->attrs) : NULL; break; case FDISK_FIELD_SADDR: p = pa->start_chs && *pa->start_chs ? strdup(pa->start_chs) : NULL; break; case FDISK_FIELD_EADDR: p = pa->end_chs && *pa->end_chs? strdup(pa->end_chs) : NULL; break; default: return -EINVAL; } if (rc < 0) { rc = -ENOMEM; free(p); p = NULL; } else if (rc > 0) rc = 0; *data = p; return rc; }