From: Karel Zak Date: Wed, 15 May 2013 11:33:24 +0000 (+0200) Subject: libfdisk: add asktype "string" and support UUID partition change X-Git-Tag: v2.24-rc1~256 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=34b06299ce71aea4fd2b1437217ced0be013d91d;p=thirdparty%2Futil-linux.git libfdisk: add asktype "string" and support UUID partition change Signed-off-by: Karel Zak --- diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c index 0127d645a0..9beccb4bfc 100644 --- a/libfdisk/src/ask.c +++ b/libfdisk/src/ask.c @@ -368,6 +368,52 @@ int fdisk_ask_number(struct fdisk_context *cxt, return rc; } +char *fdisk_ask_string_get_result(struct fdisk_ask *ask) +{ + assert(ask); + assert(fdisk_is_ask(ask, STRING)); + return ask->data.str.result; +} + +/* + * The @result has to be poiter to the allocated buffer. + */ +int fdisk_ask_string_set_result(struct fdisk_ask *ask, char *result) +{ + assert(ask); + ask->data.str.result = result; + return 0; +} + +/* + * Don't forget to deallocate @result. + */ +int fdisk_ask_string(struct fdisk_context *cxt, + const char *query, + char **result) +{ + struct fdisk_ask *ask; + int rc; + + assert(cxt); + + ask = fdisk_new_ask(); + if (!ask) + return -ENOMEM; + + rc = fdisk_ask_set_type(ask, FDISK_ASKTYPE_STRING); + if (!rc) + fdisk_ask_set_query(ask, query); + if (!rc) + rc = fdisk_do_ask(cxt, ask); + if (!rc) + *result = fdisk_ask_string_get_result(ask); + + fdisk_free_ask(ask); + DBG(ASK, dbgprint("result: %s [rc=%d]\n", *result, rc)); + return rc; +} + int fdisk_ask_yesno(struct fdisk_context *cxt, const char *query, int *result) diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index e05bb86287..1114f8cf10 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -241,6 +241,10 @@ struct fdisk_ask { struct ask_yesno { int result; /* TRUE or FALSE */ } yesno; + /* FDISK_ASKTYPE_STRING */ + struct ask_string { + char *result; /* allocated */ + } str; /* FDISK_ASKTYPE_TABLE, see include/tt.h */ struct tt *table; } data; diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c index b9fec81943..85c9bcadfc 100644 --- a/libfdisk/src/gpt.c +++ b/libfdisk/src/gpt.c @@ -1834,6 +1834,49 @@ static int gpt_get_partition_status( return 0; } +int fdisk_gpt_partition_set_uuid(struct fdisk_context *cxt, size_t i) +{ + struct fdisk_gpt_label *gpt; + struct gpt_entry *e; + struct gpt_guid uuid; + char *str, new_u[37], old_u[37]; + int rc; + + assert(cxt); + assert(cxt->label); + assert(fdisk_is_disklabel(cxt, GPT)); + + DBG(LABEL, dbgprint("UUID change requested parno=%zd", i)); + + gpt = self_label(cxt); + + if ((uint32_t) i >= le32_to_cpu(gpt->pheader->npartition_entries)) + return -EINVAL; + + if (fdisk_ask_string(cxt, + _("New UUID (in 8-4-4-4-12 format)"), &str)) + return -EINVAL; + + rc = string_to_guid(str, &uuid); + free(str); + + if (rc) + return rc; + + e = &gpt->ents[i]; + + guid_to_string(&e->unique_partition_guid, old_u); + guid_to_string(&uuid, new_u); + fdisk_info(cxt, _("Changing partition UUID from %s to %s"), + old_u, new_u); + + e->unique_partition_guid = uuid; + gpt_recompute_crc(gpt->pheader, gpt->ents); + gpt_recompute_crc(gpt->bheader, gpt->ents); + + fdisk_label_set_changed(cxt->label, 1); + return 0; +} /* * Deinitialize fdisk-specific variables diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index b414ff7bcb..284e24e026 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -60,7 +60,8 @@ enum { FDISK_ASKTYPE_WARNX, FDISK_ASKTYPE_INFO, FDISK_ASKTYPE_YESNO, - FDISK_ASKTYPE_TABLE + FDISK_ASKTYPE_TABLE, + FDISK_ASKTYPE_STRING }; @@ -141,6 +142,9 @@ extern int fdisk_reset_alignment(struct fdisk_context *cxt); extern int fdisk_dos_enable_compatible(struct fdisk_label *lb, int enable); extern int fdisk_dos_is_compatible(struct fdisk_label *lb); +/* gpt */ +extern int fdisk_gpt_partition_set_uuid(struct fdisk_context *cxt, size_t i); + /* ask.c */ #define fdisk_is_ask(a, x) (fdisk_ask_get_type(a) == FDISK_ASKTYPE_ ## x) @@ -178,6 +182,13 @@ extern int fdisk_ask_number(struct fdisk_context *cxt, const char *query, uintmax_t *result); +extern int fdisk_ask_string(struct fdisk_context *cxt, + const char *query, + char **result); + +extern char *fdisk_ask_string_get_result(struct fdisk_ask *ask); +extern int fdisk_ask_string_set_result(struct fdisk_ask *ask, char *result); + extern int fdisk_ask_yesno(struct fdisk_context *cxt, const char *query, int *result); extern uint64_t fdisk_ask_yesno_get_result(struct fdisk_ask *ask); extern int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, uint64_t result);