diff options
author | Sam Bingner <sam@bingner.com> | 2019-10-23 23:26:45 -1000 |
---|---|---|
committer | Sam Bingner <sam@bingner.com> | 2019-10-23 23:26:45 -1000 |
commit | 907d20416333ce7a16953cafc2b938a1758f2bee (patch) | |
tree | d2449ab401c4092181faa115446d95721c8baeb3 /data/uikittools | |
parent | 0bcec9f6b28c56aa9333bf78dcd322c25afb858e (diff) |
Update sbreload to avoid strange apple(?) bug
Diffstat (limited to 'data/uikittools')
-rw-r--r-- | data/uikittools/1_uicache.diff (renamed from data/uikittools/uicache.diff) | 97 | ||||
-rw-r--r-- | data/uikittools/2_sbreload.diff | 43 | ||||
-rw-r--r-- | data/uikittools/_metadata/version | 2 | ||||
-rw-r--r-- | data/uikittools/ldrestart-jbd.diff | 3 |
4 files changed, 125 insertions, 20 deletions
diff --git a/data/uikittools/uicache.diff b/data/uikittools/1_uicache.diff index 02828f4ed..8a01dd2e3 100644 --- a/data/uikittools/uicache.diff +++ b/data/uikittools/1_uicache.diff @@ -650,7 +650,7 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm /* Modified BSD License {{{ */ /* * Redistribution and use in source and binary -@@ -38,13 +48,14 @@ +@@ -38,13 +48,16 @@ /* }}} */ #import <Foundation/Foundation.h> @@ -669,10 +669,12 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm +#import <getopt.h> +#import <launch.h> +#import <objc/runtime.h> ++#import <crt_externs.h> ++#import <xpc/xpc.h> #include "csstore.hpp" -@@ -81,6 +92,12 @@ +@@ -81,6 +94,12 @@ @end @@ -685,7 +687,7 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm @interface LSApplicationWorkspace : NSObject + (id) defaultWorkspace; - (BOOL) registerApplication:(id)application; -@@ -89,16 +106,188 @@ +@@ -89,16 +108,188 @@ - (BOOL) registerApplicationDictionary:(id)application; - (BOOL) installApplication:(id)application withOptions:(id)options; - (BOOL) _LSPrivateRebuildApplicationDatabasesForSystemApps:(BOOL)system internal:(BOOL)internal user:(BOOL)user; @@ -695,15 +697,15 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm +@interface MCMAppDataContainer ++(id)containerWithIdentifier:(NSString*)identifier createIfNecessary:(bool)create existed:(bool*)existed error:(NSError*)error; +-(NSURL*)url; ++@end ++ ++@interface FBSSystemService +++(id)sharedService; ++-(void)sendActions:(NSSet*)actions withResult:(id)result; @end -int main(int argc, const char *argv[]) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -+@interface FBSSystemService -++(id)sharedService; -+-(void)sendActions:(NSSet*)actions withResult:(id)result; -+@end -+ +typedef enum { + None = 0, + RestartRenderServer = (1 << 0), // also relaunch backboardd @@ -731,7 +733,9 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + } + return [NSString pathWithComponents:[[path pathComponents] subarrayWithRange:NSMakeRange(0, 3)]]; +} -+ + +- Class $LSApplicationWorkspace(objc_getClass("LSApplicationWorkspace")); +- LSApplicationWorkspace *workspace($LSApplicationWorkspace == nil ? nil : [$LSApplicationWorkspace defaultWorkspace]); +bool appIsRegistered(NSString *path) +{ + @autoreleasepool { @@ -743,7 +747,9 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + return false; + } +} -+ + +- if (kCFCoreFoundationVersionNumber > 1000) // this API is on iOS 7 but invaliding the icon cache is harder there +- if ([workspace respondsToSelector:@selector(_LSPrivateRebuildApplicationDatabasesForSystemApps:internal:user:)]) { +bool unregisterPath(NSString *path) +{ + @autoreleasepool { @@ -823,7 +829,7 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + }; + } + } -+ if (![workspace registerApplicationDictionary:dict]) { ++ if (![[$LSApplicationWorkspace defaultWorkspace] registerApplicationDictionary:dict]) { + fprintf(stderr, "Error: registerApplicationDictionary failed for %s\n", path.lastPathComponent.UTF8String); + return false; + } @@ -838,9 +844,7 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + fprintf(stderr, "Usage: %s [-hrv] [[-p | -u] /Applications/App.app]]\n", getprogname()); + exit(EXIT_FAILURE); +} - -- Class $LSApplicationWorkspace(objc_getClass("LSApplicationWorkspace")); -- LSApplicationWorkspace *workspace($LSApplicationWorkspace == nil ? nil : [$LSApplicationWorkspace defaultWorkspace]); ++ +pid_t launch_get_job_pid(const char * job) +{ + launch_data_t resp; @@ -869,9 +873,7 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + launch_data_free(resp); + return pid; +} - -- if (kCFCoreFoundationVersionNumber > 1000) // this API is on iOS 7 but invaliding the icon cache is harder there -- if ([workspace respondsToSelector:@selector(_LSPrivateRebuildApplicationDatabasesForSystemApps:internal:user:)]) { ++ +int standard_uicache(void) +{ + @autoreleasepool { @@ -880,7 +882,7 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm if (![workspace _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:NO]) fprintf(stderr, "failed to rebuild application databases"); return 0; -@@ -226,12 +415,188 @@ +@@ -226,12 +417,247 @@ system("killall -SIGCONT SpringBoard"); } @@ -896,6 +898,32 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + } +} + ++pid_t pidOfCydia(void) { ++ launch_data_t request = launch_data_new_string(LAUNCH_KEY_GETJOBS); ++ launch_data_t response = launch_msg(request); ++ launch_data_free(request); ++ __block pid_t pid=-1; ++ ++ if (response == NULL || launch_data_get_type(response) != LAUNCH_DATA_DICTIONARY) return -1; ++ ++ xpc_dictionary_apply((xpc_object_t)response, ^bool(const char *key, xpc_object_t value) { ++ if (xpc_get_type(value) == XPC_TYPE_DICTIONARY) { ++ const char *program = xpc_dictionary_get_string(value, "Program"); ++ if (program && strcmp(program, "/Applications/Cydia.app/Cydia") == 0) { ++ pid = (pid_t)xpc_dictionary_get_int64(value, "PID"); ++ if (verbose) fprintf(stderr, "Found Cydia running with PID: %d\n", pid); ++ return false; ++ } ++ } ++ return true; ++ }); ++ ++ if (pid>0) { ++ return pid; ++ } ++ return -1; ++} ++ +int optimized_uicache(void) { + __block int rv=0; + NSMutableDictionary *registered = [NSMutableDictionary new]; @@ -911,6 +939,39 @@ diff -urN uikittools/uicache.mm uikittools+uicache/uicache.mm + if (verbose) fprintf(stderr, "Updating %s\n", appPath.lastPathComponent.UTF8String); + registered[appPath] = @YES; + } ++ pid_t cydia_pid; ++ if ([found[2] isEqualToString:@"Cydia.app"] && ++ (cydia_pid = pidOfCydia()) > 0) { ++ // We are in cydia and trying to refresh it - this will kill it. Let's schedule it for later. ++ if (verbose) fprintf(stderr, "Waiting to refresh Cydia...\n"); ++ pid_t pid = fork(); ++ if (pid == 0) { ++ setpgrp(); ++ signal(SIGHUP, SIG_IGN); ++ signal(SIGPIPE, SIG_IGN); ++ fclose(stdin); ++ freopen("/dev/null", "a", stderr); ++ freopen("/dev/null", "a", stdout); ++ pid = fork(); ++ if (pid == 0) { ++ while (kill(cydia_pid, 0)==0) { ++ sleep(1); ++ } ++ const char *uicache = (*_NSGetArgv())[0]; ++ execl(uicache, uicache, "-vvvvvvv", NULL); ++ fprintf(stderr, "Unable to exec\n"); ++ fflush(stderr); ++ exit(-1); ++ } ++ exit(0); ++ } else if (pid > 0) { ++ int stat; ++ waitpid(pid, &stat, 0); ++ return; ++ } else { ++ fprintf(stderr, "Unable to fork\n"); ++ } ++ } + if (!registerPath(appPath)) rv++; + } + }; diff --git a/data/uikittools/2_sbreload.diff b/data/uikittools/2_sbreload.diff new file mode 100644 index 000000000..88dcd40f4 --- /dev/null +++ b/data/uikittools/2_sbreload.diff @@ -0,0 +1,43 @@ +diff --git a/sbreload.m b/sbreload.m +index e36134f..85b8e17 100644 +--- a/sbreload.m ++++ b/sbreload.m +@@ -49,6 +49,7 @@ + #define FLAG_PLATFORMIZE (1 << 1) + #include <dlfcn.h> + #include <objc/runtime.h> ++#include <xpc/xpc.h> + + @interface FBSSystemService + +(id)sharedService; +@@ -143,16 +144,26 @@ void platformizeme() { + case kCFNumberLongType: + case kCFNumberLongLongType: + CFNumberGetValue(cfr, kCFNumberLongLongType, &n); +- r = launch_data_alloc(LAUNCH_DATA_INTEGER); +- launch_data_set_integer(r, n); ++ if (kCFCoreFoundationVersionNumber >= 1443.00) { ++ r = (launch_data_t)xpc_int64_create(n); ++ } else { ++ // This hangs forever if I call it on new iOS??? ++ r = launch_data_alloc(LAUNCH_DATA_INTEGER); ++ launch_data_set_integer(r, n); ++ } + break; + case kCFNumberFloat32Type: + case kCFNumberFloat64Type: + case kCFNumberFloatType: + case kCFNumberDoubleType: + CFNumberGetValue(cfr, kCFNumberDoubleType, &d); +- r = launch_data_alloc(LAUNCH_DATA_REAL); +- launch_data_set_real(r, d); ++ if (kCFCoreFoundationVersionNumber >= 1443.00) { ++ r = (launch_data_t)xpc_double_create(d); ++ } else { ++ // Not sure if this hangs, but added to be safe ++ r = launch_data_alloc(LAUNCH_DATA_REAL); ++ launch_data_set_real(r, d); ++ } + break; + default: + r = NULL; diff --git a/data/uikittools/_metadata/version b/data/uikittools/_metadata/version index 9ea63dbcc..645377eea 100644 --- a/data/uikittools/_metadata/version +++ b/data/uikittools/_metadata/version @@ -1 +1 @@ -1.1.13 +1.1.15 diff --git a/data/uikittools/ldrestart-jbd.diff b/data/uikittools/ldrestart-jbd.diff index 43f66a693..014f7d5c1 100644 --- a/data/uikittools/ldrestart-jbd.diff +++ b/data/uikittools/ldrestart-jbd.diff @@ -2,7 +2,7 @@ diff --git a/ldrestart.cpp b/ldrestart.cpp index a6d6cb6..c9a3b33 100644 --- a/ldrestart.cpp +++ b/ldrestart.cpp -@@ -34,6 +34,30 @@ +@@ -34,6 +34,31 @@ #define FLAG_PLATFORMIZE (1 << 1) #include <dlfcn.h> @@ -20,6 +20,7 @@ index a6d6cb6..c9a3b33 100644 + +const char *skip[] = { + "jailbreakd", ++ "science.xnu.substituted", + "com.saurik.substrated", + "com.apple.MobileFileIntegrity", + "com.openssh.sshd.", |