From 4975f170949298759cf6faa7b81bb364e7df3c61 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 6 Feb 2013 14:12:31 +0000 Subject: Use MobileInstallation framework to fix caches. --- extrainst_.mm | 35 +++++++++++++++++++++-------------- extrainst_.xml | 10 ++++++++++ 2 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 extrainst_.xml diff --git a/extrainst_.mm b/extrainst_.mm index 2554c0e..9a6a679 100644 --- a/extrainst_.mm +++ b/extrainst_.mm @@ -43,6 +43,7 @@ #include #include #include +#include #include "csstore.hpp" @@ -99,24 +100,30 @@ bool FinishCydia(const char *finish) { } void FixCache(NSString *home, NSString *plist) { - printf("attempting to fix weather app issue:\n"); + printf("attempting to fix weather app issue, please wait...\n"); DeleteCSStores([home UTF8String]); unlink([plist UTF8String]); - system("launchctl stop com.apple.mobile.installd"); - system("launchctl start com.apple.mobile.installd"); - - printf("waiting for application/icon cache rebuild...\n"); - printf("this will timeout (harmlessly) after 90 seconds\n"); - - for (unsigned i(0); i != 90; ++i) { - if (i != 0 && (i % 10) == 0) - printf("after %i seconds, still waiting for rebuild...\n", i); - if ([[NSMutableDictionary dictionaryWithContentsOfFile: plist] objectForKey: @"User"] != nil) - break; - sleep(1); - } + bool succeeded(false); + + if (void *MobileInstallation$ = dlopen("/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation", RTLD_GLOBAL | RTLD_LAZY)) { + int (*MobileInstallation$_MobileInstallationRebuildMap)(CFBooleanRef, CFBooleanRef, CFBooleanRef); + MobileInstallation$_MobileInstallationRebuildMap = reinterpret_cast(dlsym(MobileInstallation$, "_MobileInstallationRebuildMap")); + if (MobileInstallation$_MobileInstallationRebuildMap != NULL) { + if (int error = MobileInstallation$_MobileInstallationRebuildMap(kCFBooleanTrue, kCFBooleanTrue, kCFBooleanTrue)) + printf("failed to rebuild cache (but we gave it a good try); error #%d\n", error); + else { + printf("successfully rebuilt application information cache.\n"); + succeeded = true; + } + } else + printf("unable to find _MobileInstallationRebuildMap symbol.\n"); + } else + printf("unable to load MobileInstallation library.\n"); + + if (!succeeded) + printf("this is not a problem: it will be regenerated as the device boots\n"); if (!FinishCydia("reboot")) printf("you must reboot to finalize your cache.\n"); diff --git a/extrainst_.xml b/extrainst_.xml new file mode 100644 index 0000000..0829339 --- /dev/null +++ b/extrainst_.xml @@ -0,0 +1,10 @@ + + + + + com.apple.private.mobileinstall.allowedSPI + + RebuildMaps + + + -- cgit v1.2.3