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