diff --git a/rpcsx/ipmi.hpp b/rpcsx/ipmi.hpp index ce976dcbd..09e76b0db 100644 --- a/rpcsx/ipmi.hpp +++ b/rpcsx/ipmi.hpp @@ -129,11 +129,11 @@ struct IpmiServer { } template + requires(!std::is_same_v) IpmiServer &addSyncMethod( std::uint32_t methodId, std::function handler) { - syncMethods[methodId] = [=](orbis::IpmiSession &session, - std::int32_t &errorCode, + syncMethods[methodId] = [=](orbis::IpmiSession &, std::int32_t &errorCode, std::vector> &outData, const std::vector> &inData) -> orbis::ErrorCode { @@ -157,6 +157,31 @@ struct IpmiServer { return *this; } + template + requires std::is_same_v + IpmiServer &addSyncMethod(std::uint32_t methodId, + std::function handler) { + syncMethods[methodId] = [=](orbis::IpmiSession &, std::int32_t &errorCode, + std::vector> &outData, + const std::vector> &inData) + -> orbis::ErrorCode { + if (outData.size() != 1 || inData.size() != 0) { + return orbis::ErrorCode::INVAL; + } + + if (outData[0].size() < sizeof(OutT)) { + return orbis::ErrorCode::INVAL; + } + + OutT out; + errorCode = handler(out); + std::memcpy(outData[0].data(), &out, sizeof(out)); + outData[0].resize(sizeof(OutT)); + return {}; + }; + return *this; + } + template IpmiServer & addSyncMethod(std::uint32_t methodId,