nsd.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "core/hle/service/ipc_helpers.h"
  4. #include "core/hle/service/sockets/nsd.h"
  5. #include "common/string_util.h"
  6. namespace Service::Sockets {
  7. constexpr Result ResultOverflow{ErrorModule::NSD, 6};
  8. // This is nn::oe::ServerEnvironmentType
  9. enum class ServerEnvironmentType : u8 {
  10. Dd,
  11. Lp,
  12. Sd,
  13. Sp,
  14. Dp,
  15. };
  16. NSD::NSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
  17. // clang-format off
  18. static const FunctionInfo functions[] = {
  19. {5, nullptr, "GetSettingUrl"},
  20. {10, nullptr, "GetSettingName"},
  21. {11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"},
  22. {12, nullptr, "GetDeviceId"},
  23. {13, nullptr, "DeleteSettings"},
  24. {14, nullptr, "ImportSettings"},
  25. {15, nullptr, "SetChangeEnvironmentIdentifierDisabled"},
  26. {20, &NSD::Resolve, "Resolve"},
  27. {21, &NSD::ResolveEx, "ResolveEx"},
  28. {30, nullptr, "GetNasServiceSetting"},
  29. {31, nullptr, "GetNasServiceSettingEx"},
  30. {40, nullptr, "GetNasRequestFqdn"},
  31. {41, nullptr, "GetNasRequestFqdnEx"},
  32. {42, nullptr, "GetNasApiFqdn"},
  33. {43, nullptr, "GetNasApiFqdnEx"},
  34. {50, nullptr, "GetCurrentSetting"},
  35. {51, nullptr, "WriteTestParameter"},
  36. {52, nullptr, "ReadTestParameter"},
  37. {60, nullptr, "ReadSaveDataFromFsForTest"},
  38. {61, nullptr, "WriteSaveDataToFsForTest"},
  39. {62, nullptr, "DeleteSaveDataOfFsForTest"},
  40. {63, nullptr, "IsChangeEnvironmentIdentifierDisabled"},
  41. {64, nullptr, "SetWithoutDomainExchangeFqdns"},
  42. {100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"},
  43. {101, nullptr, "SetApplicationServerEnvironmentType"},
  44. {102, nullptr, "DeleteApplicationServerEnvironmentType"},
  45. };
  46. // clang-format on
  47. RegisterHandlers(functions);
  48. }
  49. static ResultVal<std::string> ResolveImpl(const std::string& fqdn_in) {
  50. // The real implementation makes various substitutions.
  51. // For now we just return the string as-is, which is good enough when not
  52. // connecting to real Nintendo servers.
  53. LOG_WARNING(Service, "(STUBBED) called, fqdn_in={}", fqdn_in);
  54. return fqdn_in;
  55. }
  56. static Result ResolveCommon(const std::string& fqdn_in, std::array<char, 0x100>& fqdn_out) {
  57. const auto res = ResolveImpl(fqdn_in);
  58. if (res.Failed()) {
  59. return res.Code();
  60. }
  61. if (res->size() >= fqdn_out.size()) {
  62. return ResultOverflow;
  63. }
  64. std::memcpy(fqdn_out.data(), res->c_str(), res->size() + 1);
  65. return ResultSuccess;
  66. }
  67. void NSD::Resolve(HLERequestContext& ctx) {
  68. const std::string fqdn_in = Common::StringFromBuffer(ctx.ReadBuffer(0));
  69. std::array<char, 0x100> fqdn_out{};
  70. const Result res = ResolveCommon(fqdn_in, fqdn_out);
  71. ctx.WriteBuffer(fqdn_out);
  72. IPC::ResponseBuilder rb{ctx, 2};
  73. rb.Push(res);
  74. }
  75. void NSD::ResolveEx(HLERequestContext& ctx) {
  76. const std::string fqdn_in = Common::StringFromBuffer(ctx.ReadBuffer(0));
  77. std::array<char, 0x100> fqdn_out;
  78. const Result res = ResolveCommon(fqdn_in, fqdn_out);
  79. if (res.IsError()) {
  80. IPC::ResponseBuilder rb{ctx, 2};
  81. rb.Push(res);
  82. return;
  83. }
  84. ctx.WriteBuffer(fqdn_out);
  85. IPC::ResponseBuilder rb{ctx, 4};
  86. rb.Push(ResultSuccess);
  87. rb.Push(ResultSuccess);
  88. }
  89. void NSD::GetEnvironmentIdentifier(HLERequestContext& ctx) {
  90. const std::string environment_identifier = "lp1";
  91. ctx.WriteBuffer(environment_identifier);
  92. IPC::ResponseBuilder rb{ctx, 2};
  93. rb.Push(ResultSuccess);
  94. }
  95. void NSD::GetApplicationServerEnvironmentType(HLERequestContext& ctx) {
  96. IPC::ResponseBuilder rb{ctx, 3};
  97. rb.Push(ResultSuccess);
  98. rb.Push(static_cast<u32>(ServerEnvironmentType::Lp));
  99. }
  100. NSD::~NSD() = default;
  101. } // namespace Service::Sockets