1*8cfa4c44Slinyuny /* 2*8cfa4c44Slinyuny * Copyright 2021 Google Inc. 3*8cfa4c44Slinyuny * 4*8cfa4c44Slinyuny * Licensed under the Apache License, Version 2.0 (the "License"); 5*8cfa4c44Slinyuny * you may not use this file except in compliance with the License. 6*8cfa4c44Slinyuny * You may obtain a copy of the License at 7*8cfa4c44Slinyuny * 8*8cfa4c44Slinyuny * http://www.apache.org/licenses/LICENSE-2.0 9*8cfa4c44Slinyuny * 10*8cfa4c44Slinyuny * Unless required by applicable law or agreed to in writing, software 11*8cfa4c44Slinyuny * distributed under the License is distributed on an "AS IS" BASIS, 12*8cfa4c44Slinyuny * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*8cfa4c44Slinyuny * See the License for the specific language governing permissions and 14*8cfa4c44Slinyuny * limitations under the License. 15*8cfa4c44Slinyuny */ 16*8cfa4c44Slinyuny 17*8cfa4c44Slinyuny #include "host_power_off.hpp" 18*8cfa4c44Slinyuny 19*8cfa4c44Slinyuny #include "commands.hpp" 20*8cfa4c44Slinyuny #include "errors.hpp" 21*8cfa4c44Slinyuny #include "handler.hpp" 22*8cfa4c44Slinyuny 23*8cfa4c44Slinyuny #include <cstdint> 24*8cfa4c44Slinyuny #include <cstring> 25*8cfa4c44Slinyuny 26*8cfa4c44Slinyuny namespace google 27*8cfa4c44Slinyuny { 28*8cfa4c44Slinyuny namespace ipmi 29*8cfa4c44Slinyuny { 30*8cfa4c44Slinyuny 31*8cfa4c44Slinyuny ipmi_ret_t hostPowerOff(const uint8_t* reqBuf, uint8_t* replyBuf, 32*8cfa4c44Slinyuny size_t* dataLen, const HandlerInterface* handler) 33*8cfa4c44Slinyuny { 34*8cfa4c44Slinyuny struct HostPowerOffRequest request; 35*8cfa4c44Slinyuny 36*8cfa4c44Slinyuny if ((*dataLen) < sizeof(request)) 37*8cfa4c44Slinyuny { 38*8cfa4c44Slinyuny std::fprintf(stderr, "Invalid command length: %u\n", 39*8cfa4c44Slinyuny static_cast<uint32_t>(*dataLen)); 40*8cfa4c44Slinyuny return IPMI_CC_REQ_DATA_LEN_INVALID; 41*8cfa4c44Slinyuny } 42*8cfa4c44Slinyuny 43*8cfa4c44Slinyuny std::memcpy(&request, &reqBuf[0], sizeof(struct HostPowerOffRequest)); 44*8cfa4c44Slinyuny try 45*8cfa4c44Slinyuny { 46*8cfa4c44Slinyuny handler->hostPowerOffDelay(request.delay); 47*8cfa4c44Slinyuny } 48*8cfa4c44Slinyuny catch (const IpmiException& e) 49*8cfa4c44Slinyuny { 50*8cfa4c44Slinyuny return e.getIpmiError(); 51*8cfa4c44Slinyuny } 52*8cfa4c44Slinyuny 53*8cfa4c44Slinyuny replyBuf[0] = SysHostPowerOff; 54*8cfa4c44Slinyuny (*dataLen) = sizeof(uint8_t); 55*8cfa4c44Slinyuny 56*8cfa4c44Slinyuny return IPMI_CC_OK; 57*8cfa4c44Slinyuny } 58*8cfa4c44Slinyuny } // namespace ipmi 59*8cfa4c44Slinyuny } // namespace google 60