diff --git a/src/detection/os/os_android.c b/src/detection/os/os_android.c index 0e8a7c1b2..1e1279d3f 100644 --- a/src/detection/os/os_android.c +++ b/src/detection/os/os_android.c @@ -1,43 +1,6 @@ #include "os.h" #include "common/settings.h" -// https://en.wikipedia.org/wiki/Android_version_history -static const struct { - const char* version; - const char* codename; -} androidCodenames[] = { - { "17", "Cinnamon Bun" }, - { "16", "Baklava" }, - { "15", "Vanilla Ice Cream" }, - { "14", "Upside Down Cake" }, - { "13", "Tiramisu" }, - { "12", "Snow Cone" }, - { "11", "Red Velvet Cake" }, - { "10", "Quince Tart" }, - { "9", "Pie" }, - { "8.1", "Oreo" }, - { "8.0", "Oreo" }, - { "7.1", "Nougat" }, - { "7.0", "Nougat" }, - { "6.0", "Marshmallow" }, - { "5.1", "Lollipop" }, - { "5.0", "Lollipop" }, - { "4.4", "KitKat" }, - { "4.3", "Jelly Bean" }, - { "4.2", "Jelly Bean" }, - { "4.1", "Jelly Bean" }, - { "4.0", "Ice Cream Sandwich" }, - { "3.2", "Honeycomb" }, - { "3.1", "Honeycomb" }, - { "3.0", "Honeycomb" }, - { "2.3", "Gingerbread" }, - { "2.2", "Froyo" }, - { "2.1", "Eclair" }, - { "2.0", "Eclair" }, - { "1.6", "Donut" }, - { "1.5", "Cupcake" }, -}; - void ffDetectOSImpl(FFOSResult* os) { ffStrbufSetStatic(&os->name, "Android"); @@ -47,17 +10,36 @@ void ffDetectOSImpl(FFOSResult* os) { ffStrbufSet(&os->versionID, &os->version); - ffSettingsGetAndroidProperty("ro.build.version.codename", &os->codename); + unsigned major = 0; + for (const char* p = os->version.chars; *p >= '0' && *p <= '9'; ++p) { + major = major * 10 + (unsigned) (*p - '0'); + } - // On release builds, ro.build.version.codename reports "REL" instead of the real codename. - // In that case, look up the codename from the version table. - if (ffStrbufEqualS(&os->codename, "REL")) { - for (size_t i = 0; i < ARRAY_SIZE(androidCodenames); i++) { - if (ffStrbufEqualS(&os->version, androidCodenames[i].version)) { - ffStrbufSetStatic(&os->codename, androidCodenames[i].codename); - break; - } - } + const char* codename = NULL; + // https://en.wikipedia.org/wiki/Android_version_history + // Android 5 is the oldest version supported by Termux + // clang-format off + switch (major) { + case 17: codename = "Cinnamon Bun"; break; + case 16: codename = "Baklava"; break; + case 15: codename = "Vanilla Ice Cream"; break; + case 14: codename = "Upside Down Cake"; break; + case 13: codename = "Tiramisu"; break; + case 12: codename = "Snow Cone"; break; + case 11: codename = "Red Velvet Cake"; break; + case 10: codename = "Quince Tart"; break; + case 9: codename = "Pie"; break; + case 8: codename = "Oreo"; break; + case 7: codename = "Nougat"; break; + case 6: codename = "Marshmallow"; break; + case 5: codename = "Lollipop"; break; + } + // clang-format on + + if (codename) { + ffStrbufSetStatic(&os->codename, codename); + } else { + ffSettingsGetAndroidProperty("ro.build.version.codename", &os->codename); } ffSettingsGetAndroidProperty("ro.build.id", &os->buildID);