1 #include "server.hpp" 2 3 #include <linux/ipmi_bmc.h> 4 5 #include <sdbusplus/exception.hpp> 6 #include <sdbusplus/server/interface.hpp> 7 #include <sdbusplus/vtable.hpp> 8 #include <stdplus/fd/ops.hpp> 9 #include <stdplus/print.hpp> 10 11 #include <cstdio> 12 #include <stdexcept> 13 14 namespace kcsbridge 15 { 16 17 void setAttention(sdbusplus::message_t& m, stdplus::Fd& kcs) 18 { 19 stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_SET_SMS_ATN, nullptr); 20 m.new_method_return().method_return(); 21 } 22 23 void clearAttention(sdbusplus::message_t& m, stdplus::Fd& kcs) 24 { 25 stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_CLEAR_SMS_ATN, nullptr); 26 m.new_method_return().method_return(); 27 } 28 29 void forceAbort(sdbusplus::message_t& m, stdplus::Fd& kcs) 30 { 31 stdplus::fd::ioctl(kcs, IPMI_BMC_IOCTL_FORCE_ABORT, nullptr); 32 m.new_method_return().method_return(); 33 } 34 35 template <auto func, typename Data> 36 int methodRsp(sd_bus_message* mptr, void* dataptr, sd_bus_error* error) noexcept 37 { 38 sdbusplus::message_t m(mptr); 39 try 40 { 41 func(m, *reinterpret_cast<Data*>(dataptr)); 42 } 43 catch (const std::exception& e) 44 { 45 stdplus::print(stderr, "Method response failed: {}\n", e.what()); 46 sd_bus_error_set(error, 47 "xyz.openbmc_project.Common.Error.InternalFailure", 48 "The operation failed internally."); 49 } 50 return 1; 51 } 52 53 template <typename Data> 54 constexpr sdbusplus::vtable::vtable_t dbusMethods[] = { 55 sdbusplus::vtable::start(), 56 sdbusplus::vtable::method("setAttention", "", "", 57 methodRsp<setAttention, Data>), 58 sdbusplus::vtable::method("clearAttention", "", "", 59 methodRsp<clearAttention, Data>), 60 sdbusplus::vtable::method("forceAbort", "", "", 61 methodRsp<forceAbort, Data>), 62 sdbusplus::vtable::end(), 63 }; 64 65 sdbusplus::server::interface::interface createSMSHandler( 66 sdbusplus::bus_t& bus, const char* obj, stdplus::Fd& kcs) 67 { 68 return sdbusplus::server::interface::interface( 69 bus, obj, "xyz.openbmc_project.Ipmi.Channel.SMS", 70 dbusMethods<stdplus::Fd>, reinterpret_cast<stdplus::Fd*>(&kcs)); 71 } 72 73 } // namespace kcsbridge 74