xref: /openbmc/phosphor-net-ipmid/main.cpp (revision 584fa887)
1 #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>
15 #include "command/guid.hpp"
16 #include "comm_module.hpp"
17 #include "command_table.hpp"
18 #include "message.hpp"
19 #include "message_handler.hpp"
20 #include "provider_registration.hpp"
21 #include "socket_channel.hpp"
22 #include "sol_module.hpp"
23 #include "timer.hpp"
24 
25 // Tuple of Global Singletons
26 session::Manager manager;
27 command::Table table;
28 eventloop::EventLoop loop;
29 sol::Manager solManager;
30 
31 std::tuple<session::Manager&, command::Table&, eventloop::EventLoop&,
32         sol::Manager&> singletonPool(manager, table, loop, solManager);
33 
34 sd_bus* bus = nullptr;
35 sd_event* events = nullptr;
36 
37 // Global timer for network changes
38 std::unique_ptr<phosphor::ipmi::Timer> networkTimer = nullptr;
39 
40 FILE* ipmidbus = nullptr;
41 unsigned short g_sel_reserve = 0xFFFF;
42 sd_bus_slot* ipmid_slot = nullptr;
43 
44 /*
45  * @brief Required by apphandler IPMI Provider Library
46  */
47 sd_bus* ipmid_get_sd_bus_connection()
48 {
49     return bus;
50 }
51 
52 /*
53  * @brief Required by apphandler IPMI Provider Library
54  */
55 sd_event* ipmid_get_sd_event_connection()
56 {
57     return events;
58 }
59 
60 /*
61  * @brief Required by apphandler IPMI Provider Library
62  */
63 unsigned short get_sel_reserve_id()
64 {
65     return g_sel_reserve;
66 }
67 
68 int main(int i_argc, char* i_argv[])
69 {
70     /*
71      * Required by apphandler IPMI Provider Library for logging.
72      */
73     ipmidbus =  fopen("/dev/null", "w");
74 
75     // Connect to system bus
76     auto rc = sd_bus_open_system(&bus);
77     if (rc < 0)
78     {
79         std::cerr << "Failed to connect to system bus:" << strerror(-rc) <<"\n";
80         goto finish;
81     }
82 
83     /* Get an sd event handler */
84     rc = sd_event_default(&events);
85     if (rc < 0)
86     {
87         std::cerr << "Failure to create sd_event" << strerror(-rc) <<"\n";
88         goto finish;
89     }
90 
91     // Register callback to update cache for a GUID change and cache the GUID
92     command::registerGUIDChangeCallback();
93     cache::guid = command::getSystemGUID();
94 
95 
96     // Register all the IPMI provider libraries applicable for net-ipmid
97     provider::registerCallbackHandlers(NET_IPMID_LIB_PATH);
98 
99     // Register the phosphor-net-ipmid session setup commands
100     command::sessionSetupCommands();
101 
102     // Register the phosphor-net-ipmid SOL commands
103     sol::command::registerCommands();
104 
105     // Start Event Loop
106     return std::get<eventloop::EventLoop&>(singletonPool).startEventLoop(events);
107 
108 finish:
109     sd_bus_unref(bus);
110     sd_event_unref(events);
111 
112     return 0;
113 }
114