blob: 9ed34dd6294e74d341756509aaf7a2f37780369a [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 Subbannabcb76882017-01-25 16:29:43 +053016#include <systemd/sd-event.h>
Vishwanatha Subbanna7cc9d712017-01-24 18:48:40 +053017#include <phosphor-logging/log.hpp>
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053018#include "softoff.hpp"
19#include "config.h"
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053020#include "timer.hpp"
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053021
22int main(int argc, char** argv)
23{
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053024 using namespace phosphor::logging;
25
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053026 // systemd event handler
27 sd_event* events = nullptr;
28
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053029 // Get a handle to system dbus.
30 auto bus = sdbusplus::bus::new_default();
31
32 // Add systemd object manager.
33 sdbusplus::server::manager::manager(bus, SOFTOFF_OBJPATH);
34
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053035 // sd_event object. StateManager wants that this applicatin return '0'
36 // always.
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053037 auto r = sd_event_default(&events);
38 if (r < 0)
39 {
40 log<level::ERR>("Failure to create sd_event handler",
41 entry("ERROR=%s", strerror(-r)));
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053042 return 0;
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053043 }
44
45 // Attach the bus to sd_event to service user requests
46 bus.attach_event(events, SD_EVENT_PRIORITY_NORMAL);
47
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053048 // Create the SoftPowerOff object.
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053049 phosphor::ipmi::SoftPowerOff powerObj(bus, events, SOFTOFF_OBJPATH);
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053050
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053051 // Claim the bus. Delaying it until sending SMS_ATN may result
52 // in a race condition between this available and IPMI trying to send
53 // message as a reponse to ack from host.
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053054 bus.request_name(SOFTOFF_BUSNAME);
55
Vishwanatha Subbanna31272b82017-02-01 18:53:14 +053056 // Wait for client requests until this application has processed
57 // at least one successful SoftPowerOff or we timed out
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053058 while(!powerObj.isCompleted() && !powerObj.isTimerExpired())
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053059 {
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053060 // -1 denotes wait for ever
61 r = sd_event_run(events, (uint64_t)-1);
62 if (r < 0)
63 {
64 log<level::ERR>("Failure in processing request",
65 entry("ERROR=%s", strerror(-r)));
66 break;
67 }
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053068 }
Vishwanatha Subbannabcb76882017-01-25 16:29:43 +053069
70 // Cleanup the event handler
71 events = sd_event_unref(events);
72
Vishwanatha Subbanna506aa0f2017-01-24 14:58:25 +053073 return 0;
74}