From 35ca51182782193f555fbdcb06bb10766550d017 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 30 Nov 2016 12:43:10 +0100 Subject: sfdisk: support empty label use-case By default sfdisk creates partition table when a first partition is specified, otherwise the device is not modified. This force users to create at least one partition. This commit allows to create empty label without partitions if "label: " header line is specified by script. The commit also modifies "New situation:" output to list label name and label identifier. Addresses: https://github.com/karelzak/util-linux/issues/374 Signed-off-by: Karel Zak --- libfdisk/src/libfdisk.h.in | 1 + libfdisk/src/libfdisk.sym | 5 +++++ libfdisk/src/script.c | 20 +++++++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'libfdisk') diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in index 9154f5beb..59cce190d 100644 --- a/libfdisk/src/libfdisk.h.in +++ b/libfdisk/src/libfdisk.h.in @@ -642,6 +642,7 @@ const char *fdisk_script_get_header(struct fdisk_script *dp, const char *name); int fdisk_script_set_header(struct fdisk_script *dp, const char *name, const char *data); struct fdisk_table *fdisk_script_get_table(struct fdisk_script *dp); int fdisk_script_get_nlines(struct fdisk_script *dp); +int fdisk_script_has_force_label(struct fdisk_script *dp); int fdisk_script_set_userdata(struct fdisk_script *dp, void *data); void *fdisk_script_get_userdata(struct fdisk_script *dp); diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym index 02cd7a80f..d6d4ac557 100644 --- a/libfdisk/src/libfdisk.sym +++ b/libfdisk/src/libfdisk.sym @@ -274,3 +274,8 @@ FDISK_2.29 { fdisk_labelitem_is_number; fdisk_gpt_set_npartitions; } FDISK_2.28; + + +FDISK_2.30 { + fdisk_script_has_force_label; +} FDISK_2.29; diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index ae7e99a14..0d1f260ea 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -36,7 +36,8 @@ struct fdisk_script { size_t nlines; struct fdisk_label *label; - unsigned int json : 1; /* JSON output */ + unsigned int json : 1, /* JSON output */ + force_label : 1; /* label: specified */ }; @@ -353,6 +354,22 @@ int fdisk_script_get_nlines(struct fdisk_script *dp) return dp->nlines; } +/** + * fdisk_script_has_force_label: + * @dp: script + * + * Note that fdisk_script_set_header(dp, "label", name) does not modify + * force_label status. The label has to be specified by script. + * + * Returns: true if "label: " has been parsed. + */ +int fdisk_script_has_force_label(struct fdisk_script *dp) +{ + assert(dp); + return dp->force_label; +} + + /** * fdisk_script_read_context: * @dp: script @@ -706,6 +723,7 @@ static int parse_line_header(struct fdisk_script *dp, char *s) if (strcmp(name, "label") == 0) { if (dp->cxt && !fdisk_get_label(dp->cxt, value)) goto done; /* unknown label name */ + dp->force_label = 1; } else if (strcmp(name, "unit") == 0) { if (strcmp(value, "sectors") != 0) goto done; /* only "sectors" supported */ -- cgit v1.2.3-55-g7522