From: Karel Zak Date: Mon, 8 Sep 2014 14:16:31 +0000 (+0200) Subject: libfdisk: fix script partitions size parsing X-Git-Tag: v2.26-rc1~395 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0051ec9bffdfe81f86b51178907143966e386479;p=thirdparty%2Futil-linux.git libfdisk: fix script partitions size parsing Signed-off-by: Karel Zak --- diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index 802e243bb7..6abae04b58 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -270,6 +270,8 @@ extern int fdisk_partition_next_partno(struct fdisk_partition *pa, extern int fdisk_partition_partno_follow_default(struct fdisk_partition *pa, int enable); extern int fdisk_partition_start_follow_default(struct fdisk_partition *pa, int enable); extern int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int enable); +extern int fdisk_partition_end_is_default(struct fdisk_partition *pa); +extern int fdisk_partition_start_is_default(struct fdisk_partition *pa); extern int fdisk_reorder_partitions(struct fdisk_context *cxt); @@ -416,12 +418,13 @@ struct fdisk_table *fdisk_script_get_table(struct fdisk_script *dp); int fdisk_script_read_context(struct fdisk_script *dp, struct fdisk_context *cxt); int fdisk_script_write_file(struct fdisk_script *dp, FILE *f); -int fdisk_script_read_buffer(struct fdisk_script *dp, char *s); int fdisk_script_read_file(struct fdisk_script *dp, FILE *f); +int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t sz); int fdisk_set_script(struct fdisk_context *cxt, struct fdisk_script *dp); struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt); +int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *dp); int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp); @@ -506,6 +509,9 @@ extern int fdisk_ask_menu_add_item(struct fdisk_ask *ask, int key, extern int fdisk_ask_partnum(struct fdisk_context *cxt, size_t *partnum, int wantnew); +/* utils.h */ +extern char *fdisk_partname(const char *dev, size_t partno); + #ifdef __cplusplus } #endif diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c index 35ee8ed4e6..c60e064fbb 100644 --- a/libfdisk/src/partition.c +++ b/libfdisk/src/partition.c @@ -294,6 +294,18 @@ int fdisk_partition_start_follow_default(struct fdisk_partition *pa, int enable) return 0; } +/** + * fdisk_partition_start_is_default: + * @pa: partition + * + * Returns: 1 if the partition follows default + */ +int fdisk_partition_start_is_default(struct fdisk_partition *pa) +{ + assert(pa); + return pa->start_follow_default; +} + /** * fdisk_partition_start_follow_default * @pa: partition @@ -312,6 +324,18 @@ int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int enable) return 0; } +/** + * fdisk_partition_end_is_default: + * @pa: partition + * + * Returns: 1 if the partition follows default + */ +int fdisk_partition_end_is_default(struct fdisk_partition *pa) +{ + assert(pa); + return pa->end_follow_default; +} + const char *fdisk_partition_get_uuid(struct fdisk_partition *pa) { return pa ? pa->uuid : NULL; diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index d91cef92d4..7d6f5eec32 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -57,6 +57,12 @@ struct fdisk_script *fdisk_new_script(struct fdisk_context *cxt) dp->cxt = cxt; fdisk_ref_context(cxt); + dp->table = fdisk_new_table(); + if (!dp->table) { + fdisk_unref_script(dp); + return NULL; + } + INIT_LIST_HEAD(&dp->headers); return dp; } @@ -592,7 +598,7 @@ static int parse_script_line(struct fdisk_script *dp, char *s) p += 5; rc = next_number(&p, &num); if (!rc) - fdisk_partition_set_size(pa, num); + fdisk_partition_set_size(pa, num / dp->cxt->sector_size); } else if (!strncasecmp(p, "end=", 4)) { p += 4; @@ -728,6 +734,7 @@ static int parse_commas_line(struct fdisk_script *dp, char *s) fdisk_partition_start_follow_default(pa, 1); fdisk_partition_end_follow_default(pa, 1); + fdisk_partition_partno_follow_default(pa, 1); while (rc == 0 && p && *p) { uint64_t num; @@ -756,7 +763,7 @@ static int parse_commas_line(struct fdisk_script *dp, char *s) else { rc = next_number(&p, &num); if (!rc) - fdisk_partition_set_size(pa, num); + fdisk_partition_set_size(pa, num / dp->cxt->sector_size); fdisk_partition_end_follow_default(pa, 0); } break; @@ -851,9 +858,17 @@ int fdisk_script_read_buffer(struct fdisk_script *dp, char *s) return rc; } -static int fdisk_script_read_line(struct fdisk_script *dp, FILE *f) +/** + * fdisk_script_read_line: + * @dp: script + * @f: file + * + * Reads next line into dump. + * + * Returns: 0 on success, <0 on error. + */ +int fdisk_script_read_line(struct fdisk_script *dp, FILE *f, char *buf, size_t bufsz) { - char buf[BUFSIZ]; char *s; assert(dp); @@ -863,7 +878,7 @@ static int fdisk_script_read_line(struct fdisk_script *dp, FILE *f) /* read the next non-blank non-comment line */ do { - if (fgets(buf, sizeof(buf), f) == NULL) + if (fgets(buf, bufsz, f) == NULL) return -errno; dp->nlines++; s = strchr(buf, '\n'); @@ -901,6 +916,7 @@ static int fdisk_script_read_line(struct fdisk_script *dp, FILE *f) */ int fdisk_script_read_file(struct fdisk_script *dp, FILE *f) { + char buf[BUFSIZ]; int rc = NULL; assert(dp); @@ -909,7 +925,7 @@ int fdisk_script_read_file(struct fdisk_script *dp, FILE *f) DBG(SCRIPT, ul_debugobj(dp, "parsing file")); while (!feof(f)) { - rc = fdisk_script_read_line(dp, f); + rc = fdisk_script_read_line(dp, f, buf, sizeof(buf)); if (rc) break; } @@ -961,6 +977,32 @@ struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt) return cxt->script; } +/** + * fdisk_apply_script_headers: + * @cxt: context + * dp: script + * + * Associte context @cxt with script @dp and creates a new empty disklabel. + * + * Return: 0 on success, <0 on error. + */ +int fdisk_apply_script_headers(struct fdisk_context *cxt, struct fdisk_script *dp) +{ + const char *name; + + assert(cxt); + assert(dp); + + fdisk_set_script(cxt, dp); + + /* create empty label */ + name = fdisk_script_get_header(dp, "label"); + if (!name) + return -EINVAL; + + return fdisk_create_disklabel(cxt, name); +} + /** * fdisk_apply_script: * @cxt: context @@ -974,7 +1016,6 @@ struct fdisk_script *fdisk_get_script(struct fdisk_context *cxt) int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp) { int rc; - const char *p; struct fdisk_script *old; assert(dp); @@ -983,23 +1024,14 @@ int fdisk_apply_script(struct fdisk_context *cxt, struct fdisk_script *dp) DBG(CXT, ul_debugobj(cxt, "appling script %p", dp)); old = fdisk_get_script(cxt); - fdisk_set_script(cxt, dp); - /* create empty label */ - p = fdisk_script_get_header(dp, "label"); - if (!p) { - rc = -EINVAL; - goto done; - } - rc = fdisk_create_disklabel(cxt, p); - if (rc) - goto done; + /* create empty disk label */ + rc = fdisk_apply_script_headers(cxt, dp); /* create partitions */ - if (dp->table) + if (!rc && dp->table) rc = fdisk_apply_table(cxt, dp->table); -done: fdisk_set_script(cxt, old); DBG(CXT, ul_debugobj(cxt, "script done [rc=%d]", rc)); return rc; diff --git a/libfdisk/src/utils.c b/libfdisk/src/utils.c index e809c6e4ff..ac8eb202d2 100644 --- a/libfdisk/src/utils.c +++ b/libfdisk/src/utils.c @@ -61,8 +61,12 @@ int fdisk_read_firstsector(struct fdisk_context *cxt) return 0; } -/* - * Return allocated buffer with partition name +/** + * fdisk_partname: + * dev: device name + * @partno: partition name + * + * Return: allocated buffer with partition name */ char *fdisk_partname(const char *dev, size_t partno) {