]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblockslauncher/launcher.cpp
Initial Commit
[dragonblocks3d.git] / src / dragonblockslauncher / launcher.cpp
1 #include <iostream>
2 #include <dlfcn.h>
3 #include <stdlib.h>
4 #include "dragonblockslauncher/launcher.hpp"
5  
6 using namespace dragonblockslauncher;
7
8 void dragonblockslauncher::log(std::string message)
9 {
10         std::cout << "[Launcher] " << message << std::endl;
11 }
12
13 void dragonblockslauncher::fail(std::string error, std::string details)
14 {
15         std::cerr
16                 << "Unable to launch dragonblocks: " << error << std::endl
17                 << "Details: " << details << std::endl;
18         abort();
19 }
20
21 void dragonblockslauncher::launchDragonblocks(std::string gametype)
22 {
23         void* handle;
24         std::string filename;
25         std::string start_function_name;
26         void (*start_function)();
27         
28         filename = "./libdragonblocks.so";
29         
30         log("Opening dynamic library at " + filename);
31         
32         handle = dlmopen(LM_ID_BASE, filename.c_str(), RTLD_NOW | RTLD_GLOBAL);
33         
34         if (!handle)
35                 fail("Failed to load " + filename, dlerror());
36                 
37         if (gametype != "server" && gametype != "client" && gametype != "mainmenu")
38                 fail("Trying to start dragonblocks with unknown gametype", "gameype = " + gametype);
39
40         start_function_name = "_dragonblocks_start_" + gametype;
41         
42         log("Obtaining start function pointer");
43         
44         start_function = (void (*)())dlsym(handle, start_function_name.c_str());
45         
46         if (!start_function)
47                 fail("Failed to obtain dragonblocks start function pointer", dlerror());
48
49         log("Launching dragonblocks");
50
51         (*start_function)();
52 }