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>
25*ff3cd8e9SWilly Tu #include <ipmid/api-types.hpp>
26*ff3cd8e9SWilly Tu #include <vector>
278cfa4c44Slinyuny 
288cfa4c44Slinyuny namespace google
298cfa4c44Slinyuny {
308cfa4c44Slinyuny namespace ipmi
318cfa4c44Slinyuny {
328cfa4c44Slinyuny 
33*ff3cd8e9SWilly Tu Resp hostPowerOff(const std::vector<uint8_t>& data,
34*ff3cd8e9SWilly Tu                   const HandlerInterface* handler)
358cfa4c44Slinyuny {
368cfa4c44Slinyuny     struct HostPowerOffRequest request;
378cfa4c44Slinyuny 
38*ff3cd8e9SWilly Tu     if (data.size() < sizeof(request))
398cfa4c44Slinyuny     {
408cfa4c44Slinyuny         std::fprintf(stderr, "Invalid command length: %u\n",
41*ff3cd8e9SWilly Tu                      static_cast<uint32_t>(data.size()));
42*ff3cd8e9SWilly Tu         return ::ipmi::responseReqDataLenInvalid();
438cfa4c44Slinyuny     }
448cfa4c44Slinyuny 
45*ff3cd8e9SWilly Tu     std::memcpy(&request, data.data(), sizeof(struct HostPowerOffRequest));
468cfa4c44Slinyuny     try
478cfa4c44Slinyuny     {
488cfa4c44Slinyuny         handler->hostPowerOffDelay(request.delay);
498cfa4c44Slinyuny     }
508cfa4c44Slinyuny     catch (const IpmiException& e)
518cfa4c44Slinyuny     {
52*ff3cd8e9SWilly Tu         return ::ipmi::response(e.getIpmiError());
538cfa4c44Slinyuny     }
548cfa4c44Slinyuny 
55*ff3cd8e9SWilly Tu     return ::ipmi::responseSuccess(SysOEMCommands::SysHostPowerOff,
56*ff3cd8e9SWilly Tu                                    std::vector<uint8_t>{});
578cfa4c44Slinyuny }
588cfa4c44Slinyuny } // namespace ipmi
598cfa4c44Slinyuny } // namespace google
60