blob: f6a52ac6087861768e3f39132302f31747602f52 [file] [log] [blame]
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +05301/**
2 * Copyright © 2016 IBM Corporation
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 */
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053016#include "config.h"
Patrick Venture0b02be92018-08-31 11:55:55 -070017
18#include "softoff.hpp"
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053019
Patrick Venture0b02be92018-08-31 11:55:55 -070020#include <systemd/sd-event.h>
21
22#include <phosphor-logging/elog-errors.hpp>
23#include <phosphor-logging/elog.hpp>
Vernon Mauery1181af72018-10-08 12:05:00 -070024#include <sdbusplus/timer.hpp>
Patrick Venture0b02be92018-08-31 11:55:55 -070025#include <xyz/openbmc_project/State/Host/error.hpp>
26
Andrew Geissler83527ef2017-05-18 16:54:29 -050027// Return -1 on any errors to ensure we follow the calling targets OnFailure=
28// path
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053029int main(int argc, char** argv)
30{
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053031 using namespace phosphor::logging;
32
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053033 // systemd event handler
34 sd_event* events = nullptr;
35
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053036 // Get a handle to system dbus.
37 auto bus = sdbusplus::bus::new_default();
38
39 // Add systemd object manager.
40 sdbusplus::server::manager::manager(bus, SOFTOFF_OBJPATH);
41
Andrew Geissler83527ef2017-05-18 16:54:29 -050042 // sd_event object
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053043 auto r = sd_event_default(&events);
44 if (r < 0)
45 {
46 log<level::ERR>("Failure to create sd_event handler",
Patrick Venture0b02be92018-08-31 11:55:55 -070047 entry("ERRNO=0x%X", -r));
Andrew Geissler83527ef2017-05-18 16:54:29 -050048 return -1;
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053049 }
50
51 // Attach the bus to sd_event to service user requests
52 bus.attach_event(events, SD_EVENT_PRIORITY_NORMAL);
53
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053054 // Claim the bus. Delaying it until sending SMS_ATN may result
55 // in a race condition between this available and IPMI trying to send
Gunnar Mills8991dd62017-10-25 17:11:29 -050056 // message as a response to ack from host.
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053057 bus.request_name(SOFTOFF_BUSNAME);
58
Vishwanatha Subbanna917454b2017-02-24 00:16:05 +053059 // Create the SoftPowerOff object.
60 phosphor::ipmi::SoftPowerOff powerObj(bus, events, SOFTOFF_OBJPATH);
61
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053062 // Wait for client requests until this application has processed
63 // at least one successful SoftPowerOff or we timed out
Patrick Venture0b02be92018-08-31 11:55:55 -070064 while (!powerObj.isCompleted() && !powerObj.isTimerExpired())
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053065 {
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053066 // -1 denotes wait for ever
67 r = sd_event_run(events, (uint64_t)-1);
68 if (r < 0)
69 {
70 log<level::ERR>("Failure in processing request",
Patrick Venture0b02be92018-08-31 11:55:55 -070071 entry("ERRNO=0x%X", -r));
Andrew Geissler83527ef2017-05-18 16:54:29 -050072 return -1;
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053073 }
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053074 }
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053075
Vishwanatha Subbanna917454b2017-02-24 00:16:05 +053076 // Log an error if we timed out after getting Ack for SMS_ATN and before
77 // getting the Host Shutdown response
Patrick Venture0b02be92018-08-31 11:55:55 -070078 if (powerObj.isTimerExpired() &&
79 (powerObj.responseReceived() ==
80 phosphor::ipmi::Base::SoftPowerOff::HostResponse::SoftOffReceived))
Vishwanatha Subbanna917454b2017-02-24 00:16:05 +053081 {
Marri Devender Rao5cc05932017-04-15 06:15:19 -050082 using error =
83 sdbusplus::xyz::openbmc_project::State::Host::Error::SoftOffTimeout;
84 using errorMetadata = xyz::openbmc_project::State::Host::SoftOffTimeout;
85 report<error>(prev_entry<errorMetadata::TIMEOUT_IN_MSEC>());
Andrew Geissler83527ef2017-05-18 16:54:29 -050086 return -1;
Vishwanatha Subbanna917454b2017-02-24 00:16:05 +053087 }
88
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053089 // Cleanup the event handler
90 events = sd_event_unref(events);
91
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053092 return 0;
93}