summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2023-05-31 13:44:00 +0200
committerDaan De Meyer <daan.j.demeyer@gmail.com>2023-05-31 13:48:13 +0200
commit7767b83f4a98a59b6d023f1296a5e2742c50453e (patch)
treed118c629ea74b4476055a1e1fb6a12844e61c955 /src
parentgpt: Use FOREACH_ARRAY (diff)
downloadsystemd-7767b83f4a98a59b6d023f1296a5e2742c50453e.tar.xz
systemd-7767b83f4a98a59b6d023f1296a5e2742c50453e.zip
gpt: Add gpt_partition_type_override_architecture()
Let's add a function that allows changing the architecture of a given partition type.
Diffstat (limited to 'src')
-rw-r--r--src/shared/gpt.c12
-rw-r--r--src/shared/gpt.h2
-rw-r--r--src/test/test-gpt.c27
3 files changed, 41 insertions, 0 deletions
diff --git a/src/shared/gpt.c b/src/shared/gpt.c
index 4df8724f41..dd96261888 100644
--- a/src/shared/gpt.c
+++ b/src/shared/gpt.c
@@ -248,6 +248,18 @@ int gpt_partition_type_from_string(const char *s, GptPartitionType *ret) {
return 0;
}
+GptPartitionType gpt_partition_type_override_architecture(GptPartitionType type, Architecture arch) {
+ assert(arch >= 0);
+
+ FOREACH_ARRAY(t, gpt_partition_type_table, ELEMENTSOF(gpt_partition_type_table) - 1)
+ if (t->designator == type.designator && t->arch == arch)
+ return *t;
+
+ /* If we can't find an entry with the same designator and the requested architecture, just return the
+ * original partition type. */
+ return type;
+}
+
Architecture gpt_partition_type_uuid_to_arch(sd_id128_t id) {
const GptPartitionType *pt;
diff --git a/src/shared/gpt.h b/src/shared/gpt.h
index bebfbc6116..8623a8664e 100644
--- a/src/shared/gpt.h
+++ b/src/shared/gpt.h
@@ -62,6 +62,8 @@ int gpt_partition_label_valid(const char *s);
GptPartitionType gpt_partition_type_from_uuid(sd_id128_t id);
int gpt_partition_type_from_string(const char *s, GptPartitionType *ret);
+GptPartitionType gpt_partition_type_override_architecture(GptPartitionType type, Architecture arch);
+
const char *gpt_partition_type_mountpoint_nulstr(GptPartitionType type);
bool gpt_partition_type_knows_read_only(GptPartitionType type);
diff --git a/src/test/test-gpt.c b/src/test/test-gpt.c
index 5ad30fab44..fa5923eb27 100644
--- a/src/test/test-gpt.c
+++ b/src/test/test-gpt.c
@@ -81,4 +81,31 @@ TEST(type_alias_same) {
}
}
+TEST(override_architecture) {
+ GptPartitionType x, y;
+
+ assert_se(gpt_partition_type_from_string("root-x86-64", &x) >= 0);
+ assert_se(x.arch == ARCHITECTURE_X86_64);
+
+ assert_se(gpt_partition_type_from_string("root-arm64", &y) >= 0);
+ assert(y.arch == ARCHITECTURE_ARM64);
+
+ x = gpt_partition_type_override_architecture(x, ARCHITECTURE_ARM64);
+ assert_se(x.arch == y.arch);
+ assert_se(x.designator == y.designator);
+ assert_se(sd_id128_equal(x.uuid, y.uuid));
+ assert_se(streq(x.name, y.name));
+
+ /* If the partition type does not have an architecture, nothing should change. */
+
+ assert_se(gpt_partition_type_from_string("esp", &x) >= 0);
+ y = x;
+
+ x = gpt_partition_type_override_architecture(x, ARCHITECTURE_ARM64);
+ assert_se(x.arch == y.arch);
+ assert_se(x.designator == y.designator);
+ assert_se(sd_id128_equal(x.uuid, y.uuid));
+ assert_se(streq(x.name, y.name));
+}
+
DEFINE_TEST_MAIN(LOG_INFO);