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
+28 -7
+28 -7
View File
@@ -81,32 +81,53 @@ JNIEXPORT jboolean JNICALL Java_com_geode_launcher_LauncherFix_loadLibraryFromOf
return true;
}
FILE* (*fopen_original)(const char *pathname, const char *mode);
FILE* fopen_hook(const char* pathname, const char* mode) {
std::string redirect_path(const char* pathname) {
auto data_path = DataPaths::get_instance().data_path;
auto original_data_path = DataPaths::get_instance().original_data_path;
if (!data_path.empty() && !original_data_path.empty()) {
auto path_str = std::string(pathname);
auto pos = path_str.find(original_data_path);
if (pos != std::string::npos) {
path_str.replace(pos, original_data_path.length(), data_path);
// call this a c string optimization
if (std::strncmp(pathname, original_data_path.c_str(), original_data_path.size()) == 0) {
auto path = data_path + (pathname + original_data_path.size());
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(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() {
#ifndef DISABLE_LAUNCHER_FIX
auto fopen_addr = dlsym(RTLD_NEXT, "fopen");
auto rename_addr = dlsym(RTLD_NEXT, "rename");
DobbyHook(
fopen_addr,
reinterpret_cast<dobby_dummy_func_t>(&fopen_hook),
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
}