nsd.cpp 4.0 KB

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