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