blob: c74b1c8260261d3bc46556c9b6a7e8cf66ce9adf [file] [log] [blame]
Tom Josephc35524e2016-08-29 08:17:59 -05001#include "main.hpp"
2#include <assert.h>
3#include <dlfcn.h>
4#include <dirent.h>
5#include <unistd.h>
6
7#include <iostream>
8#include <tuple>
9
10#include <systemd/sd-bus.h>
11#include <systemd/sd-daemon.h>
12#include <systemd/sd-event.h>
13
14#include <host-ipmid/ipmid-api.h>
Tom Joseph83029cb2017-09-01 16:37:31 +053015#include "command/guid.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050016#include "comm_module.hpp"
17#include "command_table.hpp"
18#include "message.hpp"
19#include "message_handler.hpp"
Tom485038e2016-12-02 13:44:45 +053020#include "provider_registration.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050021#include "socket_channel.hpp"
Tom Joseph89481cf2017-04-03 02:11:34 +053022#include "sol_module.hpp"
Ratan Gupta40801362018-03-12 16:21:37 +053023#include "timer.hpp"
Tom Josephc35524e2016-08-29 08:17:59 -050024
25// Tuple of Global Singletons
26session::Manager manager;
27command::Table table;
Tom Joseph52f53d72017-03-14 15:20:19 +053028eventloop::EventLoop loop;
29sol::Manager solManager;
30
31std::tuple<session::Manager&, command::Table&, eventloop::EventLoop&,
32 sol::Manager&> singletonPool(manager, table, loop, solManager);
Tom Josephc35524e2016-08-29 08:17:59 -050033
34sd_bus* bus = nullptr;
Marri Devender Rao3ecf0a12017-07-13 08:07:22 -050035
Ratan Gupta40801362018-03-12 16:21:37 +053036// Global timer for network changes
37std::unique_ptr<phosphor::ipmi::Timer> networkTimer = nullptr;
38
Tom069f01e2016-12-02 14:11:37 +053039FILE* ipmidbus = nullptr;
40unsigned short g_sel_reserve = 0xFFFF;
41sd_bus_slot* ipmid_slot = nullptr;
Tom Josephc35524e2016-08-29 08:17:59 -050042
43/*
44 * @brief Required by apphandler IPMI Provider Library
45 */
46sd_bus* ipmid_get_sd_bus_connection()
47{
48 return bus;
49}
50
51/*
Tom069f01e2016-12-02 14:11:37 +053052 * @brief Required by apphandler IPMI Provider Library
53 */
54unsigned short get_sel_reserve_id()
55{
56 return g_sel_reserve;
57}
58
Tom Josephc35524e2016-08-29 08:17:59 -050059int main(int i_argc, char* i_argv[])
60{
Tom069f01e2016-12-02 14:11:37 +053061 /*
62 * Required by apphandler IPMI Provider Library for logging.
63 */
64 ipmidbus = fopen("/dev/null", "w");
65
Tom Josephc35524e2016-08-29 08:17:59 -050066 // Connect to system bus
67 auto rc = sd_bus_open_system(&bus);
68 if (rc < 0)
69 {
70 std::cerr << "Failed to connect to system bus:" << strerror(-rc) <<"\n";
71 goto finish;
72 }
73
Tom Joseph83029cb2017-09-01 16:37:31 +053074 // Register callback to update cache for a GUID change and cache the GUID
75 command::registerGUIDChangeCallback();
76 cache::guid = command::getSystemGUID();
77
78
Tom485038e2016-12-02 13:44:45 +053079 // Register all the IPMI provider libraries applicable for net-ipmid
80 provider::registerCallbackHandlers(NET_IPMID_LIB_PATH);
81
Tom Josephc35524e2016-08-29 08:17:59 -050082 // Register the phosphor-net-ipmid session setup commands
83 command::sessionSetupCommands();
84
Tom Joseph89481cf2017-04-03 02:11:34 +053085 // Register the phosphor-net-ipmid SOL commands
86 sol::command::registerCommands();
87
Tom Josephc35524e2016-08-29 08:17:59 -050088 // Start Event Loop
Tom Josephf9e45862017-04-03 02:12:59 +053089 return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop();
Tom Josephc35524e2016-08-29 08:17:59 -050090
91finish:
92 sd_bus_unref(bus);
93
94 return 0;
95}