From: Karel Zak Date: Tue, 21 Apr 2015 12:32:31 +0000 (+0200) Subject: libfdisk: fix script parser to support resize operations X-Git-Tag: v2.26.2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3809127c3ba701e9f9105b4cc52393682a20f716;p=thirdparty%2Futil-linux.git libfdisk: fix script parser to support resize operations Signed-off-by: Karel Zak --- diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index 0ca498d54f..5e8ed9c355 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -121,6 +121,9 @@ struct fdisk_partition { fdisk_sector_t start; /* first sectors */ fdisk_sector_t size; /* size in sectors */ + int movestart; /* FDISK_MOVE_* (scripts only) */ + int resize; /* FDISK_RESIZE_* (scripts only) */ + char *name; /* partition name */ char *uuid; /* partition UUID */ char *attrs; /* partition flags/attributes converted to string */ @@ -152,6 +155,18 @@ struct fdisk_partition { wholedisk : 1; /* special system partition */ }; +enum { + FDISK_MOVE_NONE = 0, + FDISK_MOVE_DOWN = -1, + FDISK_MOVE_UP = 1 +}; + +enum { + FDISK_RESIZE_NONE = 0, + FDISK_RESIZE_REDUCE = -1, + FDISK_RESIZE_ENLARGE = 1 +}; + #define FDISK_INIT_UNDEF(_x) ((_x) = (__typeof__(_x)) -1) #define FDISK_IS_UNDEF(_x) ((_x) == (__typeof__(_x)) -1) diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c index eb4e31d20e..55fd5f96be 100644 --- a/libfdisk/src/script.c +++ b/libfdisk/src/script.c @@ -785,6 +785,9 @@ static struct fdisk_parttype *translate_type_shortcuts(struct fdisk_script *dp, return type ? fdisk_label_parse_parttype(lb, type) : NULL; } +#define TK_PLUS 1 +#define TK_MINUS -1 + /* simple format: * , , , , ... */ @@ -810,6 +813,7 @@ static int parse_commas_line(struct fdisk_script *dp, char *s) while (rc == 0 && p && *p) { uint64_t num; char *begin; + int sign = 0; p = (char *) skip_blank(p); item++; @@ -817,25 +821,38 @@ static int parse_commas_line(struct fdisk_script *dp, char *s) DBG(SCRIPT, ul_debugobj(dp, " parsing item %d ('%s')", item, p)); begin = p; + if (item != ITEM_BOOTABLE) { + sign = *p == '-' ? TK_MINUS : *p == '+' ? TK_PLUS : 0; + if (sign) + p++; + } + switch (item) { case ITEM_START: - if (*p == ',' || *p == ';') + if (*p == ',' || *p == ';' || (sign && *p == '\0')) fdisk_partition_start_follow_default(pa, 1); else { int pow = 0; + rc = next_number(&p, &num, &pow); if (!rc) { if (pow) /* specified as */ num /= dp->cxt->sector_size; fdisk_partition_set_start(pa, num); + pa->movestart = sign == TK_MINUS ? FDISK_MOVE_DOWN : + sign == TK_PLUS ? FDISK_MOVE_UP : + FDISK_MOVE_NONE; } fdisk_partition_start_follow_default(pa, 0); } break; case ITEM_SIZE: - if (*p == ',' || *p == ';' || *p == '+') + if (*p == ',' || *p == ';' || (sign && *p == '\0')) { fdisk_partition_end_follow_default(pa, 1); - else { + if (sign == TK_PLUS) + /* alone '+' means use all possible space, elone '-' means nothing */ + pa->resize = FDISK_RESIZE_ENLARGE; + } else { int pow = 0; rc = next_number(&p, &num, &pow); if (!rc) { @@ -844,12 +861,15 @@ static int parse_commas_line(struct fdisk_script *dp, char *s) else /* specified as number of sectors */ fdisk_partition_size_explicit(pa, 1); fdisk_partition_set_size(pa, num); + pa->resize = sign == TK_MINUS ? FDISK_RESIZE_REDUCE : + sign == TK_PLUS ? FDISK_RESIZE_ENLARGE : + FDISK_RESIZE_NONE; } fdisk_partition_end_follow_default(pa, 0); } break; case ITEM_TYPE: - if (*p == ',' || *p == ';') + if (*p == ',' || *p == ';' || (sign && *p == '\0')) break; /* use default type */ rc = next_string(&p, &str); @@ -878,6 +898,8 @@ static int parse_commas_line(struct fdisk_script *dp, char *s) pa->boot = 1; else if (tk && *tk == '-' && *(tk + 1) == '\0') pa->boot = 0; + else if (tk && *tk == '+' && *(tk + 1) == '\0') + pa->boot = 1; else rc = -EINVAL; }