nsd.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 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.size() >= fqdn_out.size()) {
  59. return ResultOverflow;
  60. }
  61. std::memcpy(fqdn_out.data(), res.c_str(), res.size() + 1);
  62. return ResultSuccess;
  63. }
  64. void NSD::Resolve(HLERequestContext& ctx) {
  65. const std::string fqdn_in = Common::StringFromBuffer(ctx.ReadBuffer(0));
  66. std::array<char, 0x100> fqdn_out{};
  67. const Result res = ResolveCommon(fqdn_in, fqdn_out);
  68. ctx.WriteBuffer(fqdn_out);
  69. IPC::ResponseBuilder rb{ctx, 2};
  70. rb.Push(res);
  71. }
  72. void NSD::ResolveEx(HLERequestContext& ctx) {
  73. const std::string fqdn_in = Common::StringFromBuffer(ctx.ReadBuffer(0));
  74. std::array<char, 0x100> fqdn_out;
  75. const Result res = ResolveCommon(fqdn_in, fqdn_out);
  76. if (res.IsError()) {
  77. IPC::ResponseBuilder rb{ctx, 2};
  78. rb.Push(res);
  79. return;
  80. }
  81. ctx.WriteBuffer(fqdn_out);
  82. IPC::ResponseBuilder rb{ctx, 4};
  83. rb.Push(ResultSuccess);
  84. rb.Push(ResultSuccess);
  85. }
  86. void NSD::GetEnvironmentIdentifier(HLERequestContext& ctx) {
  87. const std::string environment_identifier = "lp1";
  88. ctx.WriteBuffer(environment_identifier);
  89. IPC::ResponseBuilder rb{ctx, 2};
  90. rb.Push(ResultSuccess);
  91. }
  92. void NSD::GetApplicationServerEnvironmentType(HLERequestContext& ctx) {
  93. IPC::ResponseBuilder rb{ctx, 3};
  94. rb.Push(ResultSuccess);
  95. rb.Push(static_cast<u32>(ServerEnvironmentType::Lp));
  96. }
  97. NSD::~NSD() = default;
  98. } // namespace Service::Sockets