improve save redirection

This commit is contained in:
qimiko committed 2024-01-06 20:27:59 -07:00
1 parent 0335be9908
commit dd20360b72
1 file changed
+29 -8
+29 -8
View File
@@ -81,32 +81,53 @@ JNIEXPORT jboolean JNICALL Java_com_geode_launcher_LauncherFix_loadLibraryFromOf
return true; return true;
} }
FILE* (*fopen_original)(const char *pathname, const char *mode); std::string redirect_path(const char* pathname) {
FILE* fopen_hook(const char* pathname, const char* mode) {
auto data_path = DataPaths::get_instance().data_path; auto data_path = DataPaths::get_instance().data_path;
auto original_data_path = DataPaths::get_instance().original_data_path; auto original_data_path = DataPaths::get_instance().original_data_path;
if (!data_path.empty() && !original_data_path.empty()) { if (!data_path.empty() && !original_data_path.empty()) {
auto path_str = std::string(pathname); // call this a c string optimization
auto pos = path_str.find(original_data_path); if (std::strncmp(pathname, original_data_path.c_str(), original_data_path.size()) == 0) {
if (pos != std::string::npos) { auto path = data_path + (pathname + original_data_path.size());
path_str.replace(pos, original_data_path.length(), data_path);
return path;
} }
}
return pathname;
}
FILE* (*fopen_original)(const char *pathname, const char *mode);
FILE* fopen_hook(const char* pathname, const char* mode) {
auto path_str = redirect_path(pathname);
return fopen_original(path_str.c_str(), mode); return fopen_original(path_str.c_str(), mode);
} }
return fopen_original(pathname, mode); int (*rename_original)(const char* old_path, const char* new_path);
int rename_hook(const char* old_path, const char* new_path) {
auto old_path_str = redirect_path(old_path);
auto new_path_str = redirect_path(new_path);
return rename_original(old_path_str.c_str(), new_path_str.c_str());
} }
[[gnu::constructor]] [[gnu::used]] void setup_hooks() { [[gnu::constructor]] [[gnu::used]] void setup_hooks() {
#ifndef DISABLE_LAUNCHER_FIX #ifndef DISABLE_LAUNCHER_FIX
auto fopen_addr = dlsym(RTLD_NEXT, "fopen"); auto fopen_addr = dlsym(RTLD_NEXT, "fopen");
auto rename_addr = dlsym(RTLD_NEXT, "rename");
DobbyHook( DobbyHook(
fopen_addr, fopen_addr,
reinterpret_cast<dobby_dummy_func_t>(&fopen_hook), reinterpret_cast<dobby_dummy_func_t>(&fopen_hook),
reinterpret_cast<dobby_dummy_func_t*>(&fopen_original) reinterpret_cast<dobby_dummy_func_t*>(&fopen_original)
); );
DobbyHook(
rename_addr,
reinterpret_cast<dobby_dummy_func_t>(&rename_hook),
reinterpret_cast<dobby_dummy_func_t*>(&rename_original)
);
#endif #endif
} }