|
97 | 97 |
|
98 | 98 | #include "platform_unix.h" |
99 | 99 |
|
| 100 | +#ifdef WEBOS |
| 101 | +#include <formats/rjson.h> |
| 102 | +#endif |
| 103 | + |
100 | 104 | #ifdef ANDROID |
101 | 105 | static void frontend_unix_set_sustained_performance_mode(bool on); |
102 | 106 |
|
@@ -1308,57 +1312,56 @@ const char *retroarch_get_webos_version(char *s, size_t len, |
1308 | 1312 | FILE *f = fopen("/usr/lib/os-release", "r"); |
1309 | 1313 | if (!f) |
1310 | 1314 | { |
1311 | | - /* fallback to starfish-release */ |
1312 | | - f = fopen("/etc/starfish-release", "r"); |
| 1315 | + /* fallback to nyx os_info.json */ |
| 1316 | + f = fopen("/var/run/nyx/os_info.json", "r"); |
1313 | 1317 | if (!f) |
1314 | 1318 | return strlcpy(s, "webOS (unknown)", len), "webOS (unknown)"; |
1315 | 1319 |
|
1316 | | - /* Example content: |
1317 | | - Rockhopper release 3.9.0-62709 (dreadlocks2-dudhwa) */ |
1318 | | - char line[256]; |
1319 | | - if (fgets(line, sizeof(line), f)) |
1320 | | - { |
1321 | | - char *nl = strchr(line, '\n'); |
1322 | | - if (nl) *nl = '\0'; |
1323 | | - snprintf(pretty, sizeof(pretty), "webOS - %s", line); |
| 1320 | + /* read whole file into buffer */ |
| 1321 | + char buf[4096]; |
| 1322 | + size_t n = fread(buf, 1, sizeof(buf)-1, f); |
| 1323 | + fclose(f); |
| 1324 | + buf[n] = '\0'; |
1324 | 1325 |
|
1325 | | - /* Try parse after the word "release", else first digit run in the line */ |
1326 | | - char *ver = strstr(line, "release"); |
1327 | | - if (ver) |
1328 | | - { |
1329 | | - ver += strlen("release"); |
1330 | | - while (*ver == ' ') ver++; |
1331 | | - } |
1332 | | - else |
1333 | | - { |
1334 | | - /* find first digit in the line */ |
1335 | | - ver = line; |
1336 | | - while (*ver && ((*ver < '0') || (*ver > '9'))) ver++; |
1337 | | - if (!*ver) ver = NULL; |
1338 | | - } |
| 1326 | + rjson_t *json = rjson_open_string(buf, n); |
| 1327 | + enum rjson_type t; |
| 1328 | + const char *key = NULL, *val = NULL; |
| 1329 | + const char *name_str = NULL, *release_str = NULL; |
1339 | 1330 |
|
1340 | | - if (ver) |
| 1331 | + while ((t = rjson_next(json)) != RJSON_DONE && t != RJSON_ERROR) |
| 1332 | + { |
| 1333 | + if (t == RJSON_STRING) |
1341 | 1334 | { |
1342 | | - char *endptr = NULL; |
1343 | | - long maj = strtol(ver, &endptr, 10); |
1344 | | - if (endptr != ver) |
| 1335 | + key = rjson_get_string(json, NULL); |
| 1336 | + t = rjson_next(json); |
| 1337 | + if (t == RJSON_STRING) |
1345 | 1338 | { |
1346 | | - if (major) *major = (int)maj; |
1347 | | - if (endptr && *endptr == '.' && minor) |
1348 | | - { |
1349 | | - long min = strtol(endptr + 1, NULL, 10); |
1350 | | - /* only set minor if a number was present */ |
1351 | | - const char *p = endptr + 1; |
1352 | | - if (p && (*p >= '0' && *p <= '9')) |
1353 | | - *minor = (int)min; |
1354 | | - } |
| 1339 | + val = rjson_get_string(json, NULL); |
| 1340 | + if (strcmp(key, "webos_name") == 0) |
| 1341 | + name_str = val; |
| 1342 | + else if (strcmp(key, "webos_release") == 0) |
| 1343 | + release_str = val; |
1355 | 1344 | } |
1356 | 1345 | } |
1357 | 1346 | } |
1358 | | - fclose(f); |
| 1347 | + rjson_free(json); |
1359 | 1348 |
|
1360 | | - if (pretty[0] == '\0') |
1361 | | - strlcpy(pretty, "webOS (unknown)", sizeof(pretty)); |
| 1349 | + if (name_str && release_str) |
| 1350 | + snprintf(pretty, sizeof(pretty), "%s %s", name_str, release_str); |
| 1351 | + else if (name_str) |
| 1352 | + snprintf(pretty, sizeof(pretty), "%s", name_str); |
| 1353 | + else |
| 1354 | + snprintf(pretty, sizeof(pretty), "webOS (unknown)"); |
| 1355 | + |
| 1356 | + if (release_str) { |
| 1357 | + char *endptr = NULL; |
| 1358 | + long maj = strtol(release_str, &endptr, 10); |
| 1359 | + if (major) *major = (int)maj; |
| 1360 | + if (endptr && *endptr == '.' && minor) |
| 1361 | + *minor = (int)strtol(endptr+1, NULL, 10); |
| 1362 | + else if (minor) |
| 1363 | + *minor = 0; |
| 1364 | + } |
1362 | 1365 |
|
1363 | 1366 | return strlcpy(s, pretty, len), pretty; |
1364 | 1367 | } |
|
0 commit comments