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