18cfa4c44Slinyuny /* 28cfa4c44Slinyuny * Copyright 2021 Google Inc. 38cfa4c44Slinyuny * 48cfa4c44Slinyuny * Licensed under the Apache License, Version 2.0 (the "License"); 58cfa4c44Slinyuny * you may not use this file except in compliance with the License. 68cfa4c44Slinyuny * You may obtain a copy of the License at 78cfa4c44Slinyuny * 88cfa4c44Slinyuny * http://www.apache.org/licenses/LICENSE-2.0 98cfa4c44Slinyuny * 108cfa4c44Slinyuny * Unless required by applicable law or agreed to in writing, software 118cfa4c44Slinyuny * distributed under the License is distributed on an "AS IS" BASIS, 128cfa4c44Slinyuny * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138cfa4c44Slinyuny * See the License for the specific language governing permissions and 148cfa4c44Slinyuny * limitations under the License. 158cfa4c44Slinyuny */ 168cfa4c44Slinyuny 178cfa4c44Slinyuny #include "host_power_off.hpp" 188cfa4c44Slinyuny 198cfa4c44Slinyuny #include "commands.hpp" 208cfa4c44Slinyuny #include "errors.hpp" 218cfa4c44Slinyuny #include "handler.hpp" 228cfa4c44Slinyuny 238cfa4c44Slinyuny #include <cstdint> 248cfa4c44Slinyuny #include <cstring> 25ff3cd8e9SWilly Tu #include <ipmid/api-types.hpp> 26*b4e3704cSWilly Tu #include <span> 27ff3cd8e9SWilly Tu #include <vector> 288cfa4c44Slinyuny 298cfa4c44Slinyuny namespace google 308cfa4c44Slinyuny { 318cfa4c44Slinyuny namespace ipmi 328cfa4c44Slinyuny { 338cfa4c44Slinyuny 34*b4e3704cSWilly Tu Resp hostPowerOff(std::span<const uint8_t> data, 35ff3cd8e9SWilly Tu const HandlerInterface* handler) 368cfa4c44Slinyuny { 378cfa4c44Slinyuny struct HostPowerOffRequest request; 388cfa4c44Slinyuny 39ff3cd8e9SWilly Tu if (data.size() < sizeof(request)) 408cfa4c44Slinyuny { 418cfa4c44Slinyuny std::fprintf(stderr, "Invalid command length: %u\n", 42ff3cd8e9SWilly Tu static_cast<uint32_t>(data.size())); 43ff3cd8e9SWilly Tu return ::ipmi::responseReqDataLenInvalid(); 448cfa4c44Slinyuny } 458cfa4c44Slinyuny 46ff3cd8e9SWilly Tu std::memcpy(&request, data.data(), sizeof(struct HostPowerOffRequest)); 478cfa4c44Slinyuny try 488cfa4c44Slinyuny { 498cfa4c44Slinyuny handler->hostPowerOffDelay(request.delay); 508cfa4c44Slinyuny } 518cfa4c44Slinyuny catch (const IpmiException& e) 528cfa4c44Slinyuny { 53ff3cd8e9SWilly Tu return ::ipmi::response(e.getIpmiError()); 548cfa4c44Slinyuny } 558cfa4c44Slinyuny 56ff3cd8e9SWilly Tu return ::ipmi::responseSuccess(SysOEMCommands::SysHostPowerOff, 57ff3cd8e9SWilly Tu std::vector<uint8_t>{}); 588cfa4c44Slinyuny } 598cfa4c44Slinyuny } // namespace ipmi 608cfa4c44Slinyuny } // namespace google 61