]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Add proper parser for sector size
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 9 Nov 2023 18:30:14 +0000 (19:30 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Thu, 9 Nov 2023 18:36:24 +0000 (19:36 +0100)
mkosi/__init__.py
mkosi/config.py
mkosi/util.py

index 5f3b17b05c1f185c21b4bae903842f15d70d3891..5f2abc64cacd15e9383d9aba99a8acf3c31029f5 100644 (file)
@@ -1993,7 +1993,7 @@ def make_image(
     if split:
         cmdline += ["--split=yes"]
     if state.config.sector_size:
-        cmdline += ["--sector-size", state.config.sector_size]
+        cmdline += ["--sector-size", str(state.config.sector_size)]
 
     if definitions:
         for d in definitions:
index ae78396fbc34e55af9c4dd55fd4c9dd4f9b633b9..9dde626e20bc038b50dcbccaed8b73603f3f6306 100644 (file)
@@ -33,7 +33,7 @@ from mkosi.log import ARG_DEBUG, ARG_DEBUG_SHELL, Style, die
 from mkosi.pager import page
 from mkosi.run import run
 from mkosi.types import PathString, SupportsRead
-from mkosi.util import INVOKING_USER, StrEnum, chdir, flatten
+from mkosi.util import INVOKING_USER, StrEnum, chdir, flatten, is_power_of_2
 from mkosi.versioncomp import GenericVersion
 
 __version__ = "18"
@@ -572,6 +572,24 @@ def parse_drive(value: str) -> QemuDrive:
     return QemuDrive(id=id, size=size, directory=directory, options=options)
 
 
+def config_parse_sector_size(value: Optional[str], old: Optional[int]) -> Optional[int]:
+    if not value:
+        return None
+
+    try:
+        size = int(value)
+    except ValueError:
+        die(f"'{value}' is not a valid number")
+
+    if size < 512 or size > 4096:
+        die(f"Sector size not between 512 and 4096: {size}")
+
+    if not is_power_of_2(size):
+        die(f"Sector size not power of 2: {size}")
+
+    return size
+
+
 @dataclasses.dataclass(frozen=True)
 class MkosiConfigSetting:
     dest: str
@@ -797,7 +815,7 @@ class MkosiConfig:
     image_version: Optional[str]
     split_artifacts: bool
     repart_dirs: list[Path]
-    sector_size: Optional[str]
+    sector_size: Optional[int]
     overlay: bool
     use_subvolumes: ConfigFeature
     seed: Optional[uuid.UUID]
@@ -1333,7 +1351,7 @@ SETTINGS = (
     MkosiConfigSetting(
         dest="sector_size",
         section="Output",
-        parse=config_parse_string,
+        parse=config_parse_sector_size,
         help="Set the disk image sector size",
     ),
     MkosiConfigSetting(
index 050f67dcc1da2206c1a6e8723643c047571433cf..6521e6b1369ba9a1458c867292e90aedd4335eca 100644 (file)
@@ -166,3 +166,7 @@ def umask(mask: int) -> Iterator[None]:
         yield
     finally:
         os.umask(old)
+
+
+def is_power_of_2(x: int) -> bool:
+    return x > 0 and (x & x - 1 == 0)