summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parted/parted.c29
-rw-r--r--tests/t0207-IEC-binary-notation.sh31
-rw-r--r--tests/t0208-mkpart-end-in-IEC.sh2
3 files changed, 51 insertions, 11 deletions
diff --git a/parted/parted.c b/parted/parted.c
index 84187b7..84465d5 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -583,16 +583,27 @@ void _strip_trailing_spaces(char *str)
str[i]='\0';
}
-/* Return true, if str ends with [kMGTPEZY]iB, i.e. IEC units. */
+/* Return true if the unit is one of the supported IEC unit values */
+static bool
+_is_unit_IEC(const PedUnit unit) {
+ return (unit == PED_UNIT_KIBIBYTE) || (unit == PED_UNIT_MEBIBYTE) ||
+ (unit == PED_UNIT_GIBIBYTE) || (unit == PED_UNIT_TEBIBYTE);
+}
+
+/* Return true, if str ends with IEC units. */
static bool
_string_ends_with_iec_unit(const char *str)
{
- /* 3 characters for the IEC unit and at least 1 digit */
- if (!str || strlen(str) < 4)
- return false;
+ /* 3 characters for the IEC unit and at least 1 digit */
+ if (!str || strlen(str) < 4)
+ return false;
- char const *p = str + strlen(str) - 3;
- return strchr ("kMGTPEZY", *p) && c_strcasecmp (p+1, "iB") == 0;
+ char const *p = str + strlen(str) - 3;
+ PedUnit unit = ped_unit_get_by_name(p);
+ if (unit == -1) {
+ return false;
+ }
+ return _is_unit_IEC(unit);
}
/* Return true if str ends with explicit unit identifier.
@@ -612,7 +623,7 @@ _string_has_unit_suffix(const char *str)
return false;
}
-/* If the selected unit is one of kiB, MiB, GiB or TiB and the partition is not
+/* If the selected unit is one of KiB, MiB, GiB or TiB and the partition is not
* only 1 sector long, then adjust the end so that it is one sector before the
* given position. Also adjust range_end accordingly. Thus next partition can
* start immediately after this one.
@@ -636,9 +647,7 @@ _adjust_end_if_iec (PedSector* start, PedSector* end,
_strip_trailing_spaces(end_input);
PedUnit unit = ped_unit_get_default();
if (_string_ends_with_iec_unit(end_input) ||
- (!_string_has_unit_suffix(end_input) &&
- ((unit == PED_UNIT_KIBIBYTE) || (unit == PED_UNIT_MEBIBYTE) ||
- (unit == PED_UNIT_GIBIBYTE) || (unit == PED_UNIT_TEBIBYTE)))) {
+ (!_string_has_unit_suffix(end_input) && _is_unit_IEC(unit))) {
*end -= 1;
range_end->start -= 1;
range_end->end -= 1;
diff --git a/tests/t0207-IEC-binary-notation.sh b/tests/t0207-IEC-binary-notation.sh
index d9bbad6..b8a789e 100644
--- a/tests/t0207-IEC-binary-notation.sh
+++ b/tests/t0207-IEC-binary-notation.sh
@@ -28,6 +28,7 @@ parted --align=none -s $dev mklabel gpt mkpart p1 $((64*1024))B $((1024*1024-$ss
compare /dev/null err || fail=1
parted -m -s $dev u s p > exp || fail=1
+# Test using MiB
rm $dev
dd if=/dev/null of=$dev bs=$ss seek=$n_sectors || fail=1
parted --align=none -s $dev mklabel gpt mkpart p1 64KiB 1MiB \
@@ -37,4 +38,34 @@ parted -m -s $dev u s p > out || fail=1
compare exp out || fail=1
+# Test using lower case kib and mib
+rm $dev
+dd if=/dev/null of=$dev bs=$ss seek=$n_sectors || fail=1
+parted --align=none -s $dev mklabel gpt mkpart p1 64kib 1mib \
+ > err 2>&1 || fail=1
+compare /dev/null err || fail=1
+parted -m -s $dev u s p > out || fail=1
+
+compare exp out || fail=1
+
+# Test using KiB
+rm $dev
+dd if=/dev/null of=$dev bs=$ss seek=$n_sectors || fail=1
+parted --align=none -s $dev mklabel gpt mkpart p1 64KiB 1024KiB \
+ > err 2>&1 || fail=1
+compare /dev/null err || fail=1
+parted -m -s $dev u s p > out || fail=1
+
+compare exp out || fail=1
+
+# Test using kiB
+rm $dev
+dd if=/dev/null of=$dev bs=$ss seek=$n_sectors || fail=1
+parted --align=none -s $dev mklabel gpt mkpart p1 64kiB 1024kiB \
+ > err 2>&1 || fail=1
+compare /dev/null err || fail=1
+parted -m -s $dev u s p > out || fail=1
+
+compare exp out || fail=1
+
Exit $fail
diff --git a/tests/t0208-mkpart-end-in-IEC.sh b/tests/t0208-mkpart-end-in-IEC.sh
index 118ec72..a3db2c3 100644
--- a/tests/t0208-mkpart-end-in-IEC.sh
+++ b/tests/t0208-mkpart-end-in-IEC.sh
@@ -25,7 +25,7 @@ dev=dev-file
dd if=/dev/null of=$dev bs=1M seek=$n_mbs || fail=1
# create 1st partition
-parted --align=none -s $dev mklabel gpt mkpart p1 1MiB 2MiB > err 2>&1 || fail=1
+parted --align=none -s $dev mklabel gpt mkpart p1 1MiB 2048KiB > err 2>&1 || fail=1
compare /dev/null err || fail=1 # expect no output
#parted -m -s $dev u s p > exp || fail=1