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