ams_mitm: refactor for R_TRY
This commit is contained in:
@@ -63,7 +63,7 @@ bool SetMitmService::IsValidRegionCode(u32 region_code) {
|
||||
return region_code < RegionCode_Max;
|
||||
}
|
||||
|
||||
void SetMitmService::EnsureLocale() {
|
||||
Result SetMitmService::EnsureLocale() {
|
||||
std::scoped_lock<HosMutex> lk(this->lock);
|
||||
|
||||
if (!this->got_locale) {
|
||||
@@ -71,19 +71,16 @@ void SetMitmService::EnsureLocale() {
|
||||
if (this->title_id == TitleId_Ns) {
|
||||
u64 app_pid = 0;
|
||||
u64 app_tid = 0;
|
||||
Result rc;
|
||||
if (R_FAILED((rc = pmdmntGetApplicationPid(&app_pid)))) {
|
||||
return;
|
||||
}
|
||||
if (R_FAILED((rc = pminfoGetTitleId(&app_tid, app_pid)))) {
|
||||
return;
|
||||
}
|
||||
R_TRY(pmdmntGetApplicationPid(&app_pid));
|
||||
R_TRY(pminfoGetTitleId(&app_tid, app_pid));
|
||||
this->locale = Utils::GetTitleOverrideLocale(app_tid);
|
||||
} else {
|
||||
this->locale = Utils::GetTitleOverrideLocale(this->title_id);
|
||||
this->got_locale = true;
|
||||
}
|
||||
}
|
||||
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
Result SetMitmService::GetLanguageCode(Out<u64> out_lang_code) {
|
||||
|
||||
@@ -50,7 +50,7 @@ class SetMitmService : public IMitmServiceObject {
|
||||
static bool IsValidLanguageCode(u64 lang_code);
|
||||
static bool IsValidRegionCode(u32 region_code);
|
||||
|
||||
void EnsureLocale();
|
||||
Result EnsureLocale();
|
||||
protected:
|
||||
/* Overridden commands. */
|
||||
Result GetLanguageCode(Out<u64> out_lang_code);
|
||||
|
||||
@@ -32,7 +32,8 @@ void VersionManager::Initialize() {
|
||||
}
|
||||
|
||||
/* Mount firmware version data archive. */
|
||||
if (R_SUCCEEDED(romfsMountFromDataArchive(TitleId_ArchiveSystemVersion, FsStorageId_NandSystem, "sysver"))) {
|
||||
R_ASSERT(romfsMountFromDataArchive(TitleId_ArchiveSystemVersion, FsStorageId_NandSystem, "sysver"));
|
||||
{
|
||||
ON_SCOPE_EXIT { romfsUnmount("sysver"); };
|
||||
|
||||
SetSysFirmwareVersion fw_ver;
|
||||
@@ -52,16 +53,13 @@ void VersionManager::Initialize() {
|
||||
|
||||
g_fw_version = fw_ver;
|
||||
g_ams_fw_version = fw_ver;
|
||||
} else {
|
||||
/* Failure to open data archive is an abort. */
|
||||
std::abort();
|
||||
}
|
||||
|
||||
/* Modify the output firmware version. */
|
||||
{
|
||||
u32 major, minor, micro;
|
||||
char display_version[sizeof(g_ams_fw_version.display_version)] = {0};
|
||||
|
||||
|
||||
GetAtmosphereApiVersion(&major, &minor, µ, nullptr, nullptr);
|
||||
snprintf(display_version, sizeof(display_version), "%s (AMS %u.%u.%u)", g_ams_fw_version.display_version, major, minor, micro);
|
||||
|
||||
@@ -73,7 +71,7 @@ void VersionManager::Initialize() {
|
||||
|
||||
Result VersionManager::GetFirmwareVersion(u64 title_id, SetSysFirmwareVersion *out) {
|
||||
VersionManager::Initialize();
|
||||
|
||||
|
||||
/* Report atmosphere string to qlaunch, maintenance and nothing else. */
|
||||
if (title_id == TitleId_AppletQlaunch || title_id == TitleId_AppletMaintenanceMenu) {
|
||||
*out = g_ams_fw_version;
|
||||
|
||||
@@ -22,19 +22,17 @@
|
||||
#include "setsys_settings_items.hpp"
|
||||
|
||||
void SetSysMitmService::PostProcess(IMitmServiceObject *obj, IpcResponseContext *ctx) {
|
||||
/* No commands need postprocessing. */
|
||||
/* No commands need postprocessing. */
|
||||
}
|
||||
|
||||
Result SetSysMitmService::GetFirmwareVersion(OutPointerWithServerSize<SetSysFirmwareVersion, 0x1> out) {
|
||||
Result rc = VersionManager::GetFirmwareVersion(this->title_id, out.pointer);
|
||||
|
||||
/* Get firmware version from manager. */
|
||||
R_TRY(VersionManager::GetFirmwareVersion(this->title_id, out.pointer));
|
||||
|
||||
/* GetFirmwareVersion sanitizes these fields. */
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
out.pointer->revision_major = 0;
|
||||
out.pointer->revision_minor = 0;
|
||||
}
|
||||
|
||||
return rc;
|
||||
out.pointer->revision_major = 0;
|
||||
out.pointer->revision_minor = 0;
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
Result SetSysMitmService::GetFirmwareVersion2(OutPointerWithServerSize<SetSysFirmwareVersion, 0x1> out) {
|
||||
@@ -44,76 +42,63 @@ Result SetSysMitmService::GetFirmwareVersion2(OutPointerWithServerSize<SetSysFir
|
||||
Result SetSysMitmService::GetSettingsItemValueSize(Out<u64> out_size, InPointer<char> in_name, InPointer<char> in_key) {
|
||||
char name[SET_MAX_NAME_SIZE] = {0};
|
||||
char key[SET_MAX_NAME_SIZE] = {0};
|
||||
|
||||
Result rc = SettingsItemManager::ValidateName(in_name.pointer);
|
||||
if (R_FAILED(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = SettingsItemManager::ValidateKey(in_key.pointer);
|
||||
if (R_FAILED(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Validate name and key. */
|
||||
R_TRY(SettingsItemManager::ValidateName(in_name.pointer));
|
||||
R_TRY(SettingsItemManager::ValidateKey(in_key.pointer));
|
||||
|
||||
if (in_name.num_elements < SET_MAX_NAME_SIZE) {
|
||||
strncpy(name, in_name.pointer, in_name.num_elements);
|
||||
} else {
|
||||
strncpy(name, in_name.pointer, SET_MAX_NAME_SIZE-1);
|
||||
}
|
||||
|
||||
|
||||
if (in_key.num_elements < SET_MAX_NAME_SIZE) {
|
||||
strncpy(key, in_key.pointer, in_key.num_elements);
|
||||
} else {
|
||||
strncpy(key, in_key.pointer, SET_MAX_NAME_SIZE-1);
|
||||
}
|
||||
|
||||
rc = SettingsItemManager::GetValueSize(name, key, out_size.GetPointer());
|
||||
if (R_FAILED(rc)) {
|
||||
rc = setsysGetSettingsItemValueSize(name, key, out_size.GetPointer());
|
||||
|
||||
/* Try to get override setting, fall back to real setting. */
|
||||
if (R_FAILED(SettingsItemManager::GetValueSize(name, key, out_size.GetPointer()))) {
|
||||
R_TRY(setsysGetSettingsItemValueSize(name, key, out_size.GetPointer()));
|
||||
}
|
||||
|
||||
return rc;
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
Result SetSysMitmService::GetSettingsItemValue(Out<u64> out_size, OutBuffer<u8> out_value, InPointer<char> in_name, InPointer<char> in_key) {
|
||||
char name[SET_MAX_NAME_SIZE] = {0};
|
||||
char key[SET_MAX_NAME_SIZE] = {0};
|
||||
|
||||
Result rc = SettingsItemManager::ValidateName(in_name.pointer);
|
||||
if (R_FAILED(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = SettingsItemManager::ValidateKey(in_key.pointer);
|
||||
if (R_FAILED(rc)) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/* Validate name and key. */
|
||||
R_TRY(SettingsItemManager::ValidateName(in_name.pointer));
|
||||
R_TRY(SettingsItemManager::ValidateKey(in_key.pointer));
|
||||
|
||||
if (out_value.buffer == nullptr) {
|
||||
return ResultSettingsItemValueBufferNull;
|
||||
}
|
||||
|
||||
|
||||
if (in_name.num_elements < SET_MAX_NAME_SIZE) {
|
||||
strncpy(name, in_name.pointer, in_name.num_elements);
|
||||
} else {
|
||||
strncpy(name, in_name.pointer, SET_MAX_NAME_SIZE-1);
|
||||
}
|
||||
|
||||
|
||||
if (in_key.num_elements < SET_MAX_NAME_SIZE) {
|
||||
strncpy(key, in_key.pointer, in_key.num_elements);
|
||||
} else {
|
||||
strncpy(key, in_key.pointer, SET_MAX_NAME_SIZE-1);
|
||||
}
|
||||
|
||||
rc = SettingsItemManager::GetValue(name, key, out_value.buffer, out_value.num_elements, out_size.GetPointer());
|
||||
|
||||
if (R_FAILED(rc)) {
|
||||
rc = setsysGetSettingsItemValueFwd(this->forward_service.get(), name, key, out_value.buffer, out_value.num_elements, out_size.GetPointer());
|
||||
|
||||
/* Try to get override setting, fall back to real setting. */
|
||||
if (R_FAILED(SettingsItemManager::GetValue(name, key, out_value.buffer, out_value.num_elements, out_size.GetPointer()))) {
|
||||
R_TRY(setsysGetSettingsItemValueFwd(this->forward_service.get(), name, key, out_value.buffer, out_value.num_elements, out_size.GetPointer()));
|
||||
}
|
||||
|
||||
return rc;
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
Result SetSysMitmService::GetEdid(OutPointerWithServerSize<SetSysEdid, 0x1> out) {
|
||||
return setsysGetEdidFwd(this->forward_service.get(), out.pointer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,11 +38,8 @@ static bool g_threw_fatal = false;
|
||||
static HosThread g_fatal_thread;
|
||||
|
||||
static void FatalThreadFunc(void *arg) {
|
||||
Result rc = (Result)((uintptr_t)arg);
|
||||
|
||||
svcSleepThread(5000000000ULL);
|
||||
|
||||
fatalSimple(rc);
|
||||
fatalSimple(static_cast<Result>(reinterpret_cast<uintptr_t>(arg)));
|
||||
}
|
||||
|
||||
static bool IsCorrectFormat(const char *str, size_t len) {
|
||||
@@ -75,18 +72,18 @@ Result SettingsItemManager::ValidateName(const char *name, size_t max_size) {
|
||||
if (name == nullptr) {
|
||||
return ResultSettingsItemNameNull;
|
||||
}
|
||||
|
||||
|
||||
const size_t name_len = strnlen(name, std::min(max_size, MaxNameLength + 1));
|
||||
if (name_len == 0) {
|
||||
return ResultSettingsItemNameEmpty;
|
||||
} else if (name_len > MaxNameLength) {
|
||||
return ResultSettingsItemNameTooLong;
|
||||
}
|
||||
|
||||
|
||||
if (!IsCorrectFormat(name, name_len)) {
|
||||
return ResultSettingsItemNameInvalidFormat;
|
||||
}
|
||||
|
||||
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
@@ -98,18 +95,18 @@ Result SettingsItemManager::ValidateKey(const char *key, size_t max_size) {
|
||||
if (key == nullptr) {
|
||||
return ResultSettingsItemKeyNull;
|
||||
}
|
||||
|
||||
|
||||
const size_t key_len = strnlen(key, std::min(max_size, MaxKeyLength + 1));
|
||||
if (key_len == 0) {
|
||||
return ResultSettingsItemKeyEmpty;
|
||||
} else if (key_len > MaxKeyLength) {
|
||||
return ResultSettingsItemKeyTooLong;
|
||||
}
|
||||
|
||||
|
||||
if (!IsCorrectFormat(key, key_len)) {
|
||||
return ResultSettingsItemKeyInvalidFormat;
|
||||
}
|
||||
|
||||
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
@@ -139,15 +136,15 @@ static Result ParseValue(const char *name, const char *key, const char *val_tup)
|
||||
const char *delimiter = strchr(val_tup, '!');
|
||||
const char *value_str = delimiter + 1;
|
||||
const char *type = val_tup;
|
||||
|
||||
|
||||
if (delimiter == NULL) {
|
||||
return ResultSettingsItemValueInvalidFormat;
|
||||
}
|
||||
|
||||
|
||||
while (isspace(*type) && type != delimiter) {
|
||||
type++;
|
||||
}
|
||||
|
||||
|
||||
size_t type_len = delimiter - type;
|
||||
size_t value_len = strlen(value_str);
|
||||
if (delimiter == NULL || value_len == 0 || type_len == 0) {
|
||||
@@ -156,7 +153,7 @@ static Result ParseValue(const char *name, const char *key, const char *val_tup)
|
||||
|
||||
std::string kv = std::string(name).append("!").append(key);
|
||||
SettingsItemValue value;
|
||||
|
||||
|
||||
if (strncasecmp(type, "str", type_len) == 0 || strncasecmp(type, "string", type_len) == 0) {
|
||||
/* String */
|
||||
value.size = value_len + 1;
|
||||
@@ -174,12 +171,12 @@ static Result ParseValue(const char *name, const char *key, const char *val_tup)
|
||||
if (data == nullptr) {
|
||||
return ResultSettingsItemValueAllocationFailed;
|
||||
}
|
||||
|
||||
|
||||
memset(data, 0, value.size);
|
||||
for (size_t i = 0; i < value_len; i++) {
|
||||
data[i >> 1] |= hextoi(value_str[i]) << (4 * (i & 1));
|
||||
data[i >> 1] |= hextoi(value_str[i]) << (4 * (i & 1));
|
||||
}
|
||||
|
||||
|
||||
value.data = data;
|
||||
} else if (strncasecmp(type, "u8", type_len) == 0) {
|
||||
/* u8 */
|
||||
@@ -220,35 +217,35 @@ static Result ParseValue(const char *name, const char *key, const char *val_tup)
|
||||
} else {
|
||||
return ResultSettingsItemValueInvalidFormat;
|
||||
}
|
||||
|
||||
|
||||
g_settings_items[kv] = value;
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
static int SettingsItemIniHandler(void *user, const char *name, const char *key, const char *value) {
|
||||
Result rc = *(reinterpret_cast<Result *>(user));
|
||||
ON_SCOPE_EXIT { *(reinterpret_cast<Result *>(user)) = rc; };
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
rc = SettingsItemManager::ValidateName(name);
|
||||
}
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
rc = SettingsItemManager::ValidateKey(name);
|
||||
}
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
rc = ParseValue(name, key, value);
|
||||
}
|
||||
|
||||
return R_SUCCEEDED(rc) ? 1 : 0;
|
||||
static Result ParseSettingsItemValue(const char *name, const char *key, const char *value) {
|
||||
/* Validate name and key, then parse value. */
|
||||
R_TRY(SettingsItemManager::ValidateName(name));
|
||||
R_TRY(SettingsItemManager::ValidateKey(name));
|
||||
R_TRY(ParseValue(name, key, value));
|
||||
return ResultSuccess;
|
||||
}
|
||||
|
||||
void SettingsItemManager::LoadConfiguration() {
|
||||
static int SettingsItemIniHandler(void *user, const char *name, const char *key, const char *value) {
|
||||
Result *user_res = reinterpret_cast<Result *>(user);
|
||||
|
||||
/* Stop parsing after we fail to parse a value. */
|
||||
if (R_FAILED(*user_res)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
*user_res = ParseSettingsItemValue(name, key, value);
|
||||
return R_SUCCEEDED(*user_res) ? 1 : 0;
|
||||
}
|
||||
|
||||
static Result LoadConfigurationImpl() {
|
||||
/* Open file. */
|
||||
FsFile config_file;
|
||||
Result rc = Utils::OpenSdFile("/atmosphere/system_settings.ini", FS_OPEN_READ, &config_file);
|
||||
if (R_FAILED(rc)) {
|
||||
return;
|
||||
}
|
||||
R_TRY(Utils::OpenSdFile("/atmosphere/system_settings.ini", FS_OPEN_READ, &config_file));
|
||||
ON_SCOPE_EXIT {
|
||||
fsFileClose(&config_file);
|
||||
};
|
||||
@@ -257,19 +254,21 @@ void SettingsItemManager::LoadConfiguration() {
|
||||
std::string config_buf(0xFFFF, '\0');
|
||||
|
||||
/* Read from file. */
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
size_t actual_size;
|
||||
rc = fsFileRead(&config_file, 0, config_buf.data(), config_buf.size(), FS_READOPTION_NONE, &actual_size);
|
||||
}
|
||||
size_t actual_size;
|
||||
R_TRY(fsFileRead(&config_file, 0, config_buf.data(), config_buf.size(), FS_READOPTION_NONE, &actual_size));
|
||||
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
ini_parse_string(config_buf.c_str(), SettingsItemIniHandler, &rc);
|
||||
}
|
||||
/* Parse. */
|
||||
Result parse_res = ResultSuccess;
|
||||
ini_parse_string(config_buf.c_str(), SettingsItemIniHandler, &parse_res);
|
||||
return parse_res;
|
||||
}
|
||||
|
||||
/* Report error if we encountered one. */
|
||||
if (R_FAILED(rc) && !g_threw_fatal) {
|
||||
void SettingsItemManager::LoadConfiguration() {
|
||||
const Result load_res = LoadConfigurationImpl();
|
||||
if (R_FAILED(load_res) && !g_threw_fatal) {
|
||||
/* Report error if we encountered one. */
|
||||
g_threw_fatal = true;
|
||||
g_fatal_thread.Initialize(&FatalThreadFunc, reinterpret_cast<void *>(rc), 0x1000, 49);
|
||||
g_fatal_thread.Initialize(&FatalThreadFunc, reinterpret_cast<void *>(load_res), 0x1000, 49);
|
||||
g_fatal_thread.Start();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user