From: Davidlohr Bueso <dave@xxxxxxx> A new fdisk_label_change() function is added for situations when the disk label is changed (ie: creating a new sun label). This function only updates the label pointer in the context to use the newly specified label type. Signed-off-by: Davidlohr Bueso <dave@xxxxxxx> --- fdisks/fdisk.h | 2 ++ fdisks/fdiskdoslabel.c | 1 + fdisks/fdisksgilabel.c | 2 ++ fdisks/fdisksunlabel.c | 1 + fdisks/utils.c | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 43 insertions(+), 0 deletions(-) diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h index d716824..d7e85f5 100644 --- a/fdisks/fdisk.h +++ b/fdisks/fdisk.h @@ -104,6 +104,7 @@ enum fdisk_error { FDISK_ERROR_WRITE, FDISK_ERROR_IOCTL, FDISK_ERROR_PROBE, + FDISK_ERROR_NOLABEL, FDISK_ERROR_UNKNOWN }; @@ -164,6 +165,7 @@ extern void fdisk_mbr_zeroize(struct fdisk_context *cxt); extern void fdisk_geom_set_cyls(struct fdisk_context *cxt); extern const char *fdisk_error_name(enum fdisk_error errcode); extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode); +extern int fdisk_label_change(struct fdisk_context *cxt, const char *name); /* prototypes for fdisk.c */ extern char *disk_device, *line_ptr; diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c index 535afdc..9b9b23a 100644 --- a/fdisks/fdiskdoslabel.c +++ b/fdisks/fdiskdoslabel.c @@ -230,6 +230,7 @@ void create_doslabel(struct fdisk_context *cxt) dos_init(cxt); fdisk_mbr_zeroize(cxt); + fdisk_label_change(cxt, "dos"); set_all_unchanged(); set_changed(0); diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c index e38d98f..6001038 100644 --- a/fdisks/fdisksgilabel.c +++ b/fdisks/fdisksgilabel.c @@ -780,6 +780,8 @@ create_sgilabel(struct fdisk_context *cxt) } fdisk_mbr_zeroize(cxt); + fdisk_label_change(cxt, "sgi"); + sgilabel->magic = SSWAP32(SGI_LABEL_MAGIC); sgilabel->boot_part = SSWAP16(0); sgilabel->swap_part = SSWAP16(1); diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c index 4123806..b63335c 100644 --- a/fdisks/fdisksunlabel.c +++ b/fdisks/fdisksunlabel.c @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) init(); fdisk_mbr_zeroize(cxt); + fdisk_label_change(cxt, "sun"); sunlabel->magic = SSWAP16(SUN_LABEL_MAGIC); sunlabel->sanity = SSWAP32(SUN_LABEL_SANE); diff --git a/fdisks/utils.c b/fdisks/utils.c index cf9484c..48dedfb 100644 --- a/fdisks/utils.c +++ b/fdisks/utils.c @@ -44,6 +44,43 @@ static const struct fdisk_label *labels[] = &mac_label, }; +/** + * fdisk_label_change: + * @cxt: fdisk context + * @name: new label name + * + * Updates the disk label type to the one specified by @name. + * + * Returns 0 on success, otherwise, a corresponding error. + */ +int fdisk_label_change(struct fdisk_context *cxt, const char *name) +{ + int i; + + if (!cxt || !cxt->label || !name) + return FDISK_ERROR_UNKNOWN; + + /* not really changing the label */ + if (!strncmp(name, cxt->label->name, strlen(name))) + goto done; + + for (i = 0; i < ARRAY_SIZE(labels); i++) { + if (strncmp(name, labels[i]->name, strlen(name))) + continue; + + /* found the new label */ + memset(cxt->label, 0, sizeof(struct fdisk_label)); + memcpy(cxt->label, labels[i], sizeof(struct fdisk_label)); + DBG(LABEL, dbgprint("changing to a %s label\n", labels[i]->name)); + goto done; + } + + /* couldn't find the requested label type */ + return FDISK_ERROR_NOLABEL; +done: + return 0; +} + static int __probe_labels(struct fdisk_context *cxt) { int i, rc = 0; -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html