1*4aa93176SNikhil Namjoshi // Copyright 2022 Google LLC
2*4aa93176SNikhil Namjoshi //
3*4aa93176SNikhil Namjoshi // Licensed under the Apache License, Version 2.0 (the "License");
4*4aa93176SNikhil Namjoshi // you may not use this file except in compliance with the License.
5*4aa93176SNikhil Namjoshi // You may obtain a copy of the License at
6*4aa93176SNikhil Namjoshi //
7*4aa93176SNikhil Namjoshi //      http://www.apache.org/licenses/LICENSE-2.0
8*4aa93176SNikhil Namjoshi //
9*4aa93176SNikhil Namjoshi // Unless required by applicable law or agreed to in writing, software
10*4aa93176SNikhil Namjoshi // distributed under the License is distributed on an "AS IS" BASIS,
11*4aa93176SNikhil Namjoshi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*4aa93176SNikhil Namjoshi // See the License for the specific language governing permissions and
13*4aa93176SNikhil Namjoshi // limitations under the License.
148cfa4c44Slinyuny 
158cfa4c44Slinyuny #include "host_power_off.hpp"
168cfa4c44Slinyuny 
178cfa4c44Slinyuny #include "commands.hpp"
188cfa4c44Slinyuny #include "errors.hpp"
198cfa4c44Slinyuny #include "handler.hpp"
208cfa4c44Slinyuny 
218cfa4c44Slinyuny #include <cstdint>
228cfa4c44Slinyuny #include <cstring>
23ff3cd8e9SWilly Tu #include <ipmid/api-types.hpp>
24b4e3704cSWilly Tu #include <span>
25ff3cd8e9SWilly Tu #include <vector>
268cfa4c44Slinyuny 
278cfa4c44Slinyuny namespace google
288cfa4c44Slinyuny {
298cfa4c44Slinyuny namespace ipmi
308cfa4c44Slinyuny {
318cfa4c44Slinyuny 
32b4e3704cSWilly Tu Resp hostPowerOff(std::span<const uint8_t> data,
33ff3cd8e9SWilly Tu                   const HandlerInterface* handler)
348cfa4c44Slinyuny {
358cfa4c44Slinyuny     struct HostPowerOffRequest request;
368cfa4c44Slinyuny 
37ff3cd8e9SWilly Tu     if (data.size() < sizeof(request))
388cfa4c44Slinyuny     {
398cfa4c44Slinyuny         std::fprintf(stderr, "Invalid command length: %u\n",
40ff3cd8e9SWilly Tu                      static_cast<uint32_t>(data.size()));
41ff3cd8e9SWilly Tu         return ::ipmi::responseReqDataLenInvalid();
428cfa4c44Slinyuny     }
438cfa4c44Slinyuny 
44ff3cd8e9SWilly Tu     std::memcpy(&request, data.data(), sizeof(struct HostPowerOffRequest));
458cfa4c44Slinyuny     try
468cfa4c44Slinyuny     {
478cfa4c44Slinyuny         handler->hostPowerOffDelay(request.delay);
488cfa4c44Slinyuny     }
498cfa4c44Slinyuny     catch (const IpmiException& e)
508cfa4c44Slinyuny     {
51ff3cd8e9SWilly Tu         return ::ipmi::response(e.getIpmiError());
528cfa4c44Slinyuny     }
538cfa4c44Slinyuny 
54ff3cd8e9SWilly Tu     return ::ipmi::responseSuccess(SysOEMCommands::SysHostPowerOff,
55ff3cd8e9SWilly Tu                                    std::vector<uint8_t>{});
568cfa4c44Slinyuny }
578cfa4c44Slinyuny } // namespace ipmi
588cfa4c44Slinyuny } // namespace google
59