mirror of
https://github.com/geode-sdk/android-launcher.git
synced 2026-10-21 00:18:18 +00:00
improve save redirection
This commit is contained in:
1 file changed
+30
-9
@@ -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 fopen_original(path_str.c_str(), mode);
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
return fopen_original(pathname, mode);
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
Reference in new issue
Block a user