geode/loader/launcher/mac/Bootstrapper.cpp

71 lines
2.1 KiB
C++
Raw Normal View History

2022-11-28 13:30:41 -05:00
#include <fs/filesystem.hpp>
#include <mach-o/dyld.h>
#include <unistd.h>
#include <dlfcn.h>
#include <array>
2022-10-08 06:21:57 -04:00
#include <iostream>
#include <CoreFoundation/CoreFoundation.h>
void displayError(std::string alertMessage) {
CFStringRef cfTitle = CFStringCreateWithCString(NULL, "Geode Bootstrapper", kCFStringEncodingUTF8);
CFStringRef cfMessage = CFStringCreateWithCString(NULL, alertMessage.c_str(), kCFStringEncodingUTF8);
CFUserNotificationDisplayNotice(0, kCFUserNotificationCautionAlertLevel, NULL, NULL, NULL, cfTitle, cfMessage, NULL);
}
2022-10-08 06:21:57 -04:00
void loadGeode() {
auto dylib = dlopen("Geode.dylib", RTLD_LAZY);
if (dylib) return;
displayError(std::string("Couldn't open Geode: ") + dlerror());
2022-10-08 06:21:57 -04:00
return;
}
__attribute__((constructor)) void _entry() {
std::array<char, PATH_MAX> gddir;
uint32_t out = PATH_MAX;
_NSGetExecutablePath(gddir.data(), &out);
ghc::filesystem::path gdpath = gddir.data();
auto workingDir = gdpath.parent_path().parent_path();
auto updatesDir = workingDir / "geode" / "update";
2022-10-08 06:21:57 -04:00
auto libDir = workingDir / "Frameworks";
auto resourcesDir = workingDir / "geode" / "resources";
auto error = std::error_code();
if (ghc::filesystem::exists(updatesDir / "Geode.dylib", error) && !error) {
ghc::filesystem::rename(
updatesDir / "Geode.dylib",
2022-10-08 06:59:51 -04:00
libDir / "Geode.dylib", error
);
2022-10-08 06:21:57 -04:00
if (error) {
displayError(std::string("Couldn't update Geode: ") + error.message());
2022-10-08 06:21:57 -04:00
return loadGeode();
}
}
if (ghc::filesystem::exists(updatesDir / "resources", error) && !error) {
ghc::filesystem::remove_all(resourcesDir / "geode.loader", error);
2022-10-08 06:21:57 -04:00
if (error) {
displayError(std::string("Couldn't update Geode resources: ") + error.message());
2022-10-08 06:21:57 -04:00
return loadGeode();
}
ghc::filesystem::rename(
updatesDir / "resources",
resourcesDir / "geode.loader", error
);
2022-10-08 06:21:57 -04:00
if (error) {
displayError(std::string("Couldn't update Geode resources: ") + error.message());
2022-10-08 06:21:57 -04:00
return loadGeode();
}
}
2022-10-08 06:21:57 -04:00
return loadGeode();
}