From 94e39e32cc1940c8161a6dd2b0e5c6b7e3877c41 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 26 Nov 2022 19:45:31 +0000 Subject: [PATCH] Fix slow send --- AirTroller.xcodeproj/project.pbxproj | 34 +++- .../UserInterfaceState.xcuserstate | Bin 38984 -> 49137 bytes AirTroller/AirTroller-Bridging-Header.h | 1 + AirTroller/Assets.xcassets/.DS_Store | Bin 0 -> 6148 bytes .../github.imageset/Contents.json | 2 +- AirTroller/ContentView.swift | 32 ++-- AirTroller/Misc/TS/CoreServices.h | 64 +++++++ AirTroller/Misc/TS/TSUtil.h | 8 + AirTroller/Misc/TS/TSUtil.m | 180 ++++++++++++++++++ AirTroller/trolldrop/TrollController.swift | 19 +- 10 files changed, 312 insertions(+), 28 deletions(-) create mode 100644 AirTroller/Assets.xcassets/.DS_Store create mode 100644 AirTroller/Misc/TS/CoreServices.h create mode 100644 AirTroller/Misc/TS/TSUtil.h create mode 100644 AirTroller/Misc/TS/TSUtil.m diff --git a/AirTroller.xcodeproj/project.pbxproj b/AirTroller.xcodeproj/project.pbxproj index d7c9711..fba9c84 100644 --- a/AirTroller.xcodeproj/project.pbxproj +++ b/AirTroller.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ CE327927293049DE007B2098 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE32791D293049DE007B2098 /* ContentView.swift */; }; CE327928293049DE007B2098 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE32791E293049DE007B2098 /* Assets.xcassets */; }; CE327929293049DE007B2098 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE32791F293049DE007B2098 /* Extensions.swift */; }; + CE9B7554293297AC00D7EC02 /* TSUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = CE9B754D293297AC00D7EC02 /* TSUtil.m */; }; + CE9B755A2932987500D7EC02 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE9B75592932987500D7EC02 /* CoreServices.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -40,6 +42,11 @@ CE32791E293049DE007B2098 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; CE32791F293049DE007B2098 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; CE32792A29304A0C007B2098 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; + CE9B754D293297AC00D7EC02 /* TSUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSUtil.m; sourceTree = ""; }; + CE9B7551293297AC00D7EC02 /* TSUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSUtil.h; sourceTree = ""; }; + CE9B7552293297AC00D7EC02 /* CoreServices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreServices.h; sourceTree = ""; }; + CE9B75572932986D00D7EC02 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + CE9B75592932987500D7EC02 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -47,6 +54,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + CE9B755A2932987500D7EC02 /* CoreServices.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -64,6 +72,7 @@ CE32790A293049D6007B2098 /* Trollface.png */, CE3278F9293049BF007B2098 /* AirTroller */, CE3278F8293049BF007B2098 /* Products */, + CE9B75562932986D00D7EC02 /* Frameworks */, ); sourceTree = ""; }; @@ -110,6 +119,7 @@ CE32792C293155F0007B2098 /* Misc */ = { isa = PBXGroup; children = ( + CE9B754B293297AC00D7EC02 /* TS */, CE327914293049DE007B2098 /* ImagePickerView.swift */, CE327916293049DE007B2098 /* Alert.swift */, CE32791F293049DE007B2098 /* Extensions.swift */, @@ -118,6 +128,25 @@ path = Misc; sourceTree = ""; }; + CE9B754B293297AC00D7EC02 /* TS */ = { + isa = PBXGroup; + children = ( + CE9B754D293297AC00D7EC02 /* TSUtil.m */, + CE9B7551293297AC00D7EC02 /* TSUtil.h */, + CE9B7552293297AC00D7EC02 /* CoreServices.h */, + ); + path = TS; + sourceTree = ""; + }; + CE9B75562932986D00D7EC02 /* Frameworks */ = { + isa = PBXGroup; + children = ( + CE9B75592932987500D7EC02 /* CoreServices.framework */, + CE9B75572932986D00D7EC02 /* MobileCoreServices.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -190,6 +219,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + CE9B7554293297AC00D7EC02 /* TSUtil.m in Sources */, CE327922293049DE007B2098 /* Alert.swift in Sources */, CE327920293049DE007B2098 /* ImagePickerView.swift in Sources */, CE327927293049DE007B2098 /* ContentView.swift in Sources */, @@ -342,7 +372,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1; + MARKETING_VERSION = 1.1.1; PRODUCT_BUNDLE_IDENTIFIER = net.sourceloc.AirTroller; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -377,7 +407,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.1; + MARKETING_VERSION = 1.1.1; PRODUCT_BUNDLE_IDENTIFIER = net.sourceloc.AirTroller; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/AirTroller.xcodeproj/project.xcworkspace/xcuserdata/exerhythm.xcuserdatad/UserInterfaceState.xcuserstate b/AirTroller.xcodeproj/project.xcworkspace/xcuserdata/exerhythm.xcuserdatad/UserInterfaceState.xcuserstate index 6f31d5d538f5e6569ebe85e6b4a01b633693b11a..e10e5114bfef7de51ef505498450336e0ca666db 100644 GIT binary patch delta 25372 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 z +#import +#import + +#define POSIX_SPAWN_PERSONA_FLAGS_OVERRIDE 1 +extern int posix_spawnattr_set_persona_np(const posix_spawnattr_t* __restrict, uid_t, uint32_t); +extern int posix_spawnattr_set_persona_uid_np(const posix_spawnattr_t* __restrict, uid_t); +extern int posix_spawnattr_set_persona_gid_np(const posix_spawnattr_t* __restrict, uid_t); + + +NSString* getNSStringFromFile(int fd) +{ + NSMutableString* ms = [NSMutableString new]; + ssize_t num_read; + char c; + while((num_read = read(fd, &c, sizeof(c)))) + { + [ms appendString:[NSString stringWithFormat:@"%c", c]]; + } + return ms.copy; +} + +int spawnRoot(NSString* path, NSArray* args, NSString** stdOut, NSString** stdErr) +{ + NSMutableArray* argsM = args.mutableCopy ?: [NSMutableArray new]; + [argsM insertObject:path.lastPathComponent atIndex:0]; + + NSUInteger argCount = [argsM count]; + char **argsC = (char **)malloc((argCount + 1) * sizeof(char*)); + + for (NSUInteger i = 0; i < argCount; i++) + { + argsC[i] = strdup([[argsM objectAtIndex:i] UTF8String]); + } + argsC[argCount] = NULL; + + posix_spawnattr_t attr; + posix_spawnattr_init(&attr); + + posix_spawnattr_set_persona_np(&attr, 99, POSIX_SPAWN_PERSONA_FLAGS_OVERRIDE); + posix_spawnattr_set_persona_uid_np(&attr, 0); + posix_spawnattr_set_persona_gid_np(&attr, 0); + + posix_spawn_file_actions_t action; + posix_spawn_file_actions_init(&action); + + int outErr[2]; + if(stdErr) + { + pipe(outErr); + posix_spawn_file_actions_adddup2(&action, outErr[1], STDERR_FILENO); + posix_spawn_file_actions_addclose(&action, outErr[0]); + } + + int out[2]; + if(stdOut) + { + pipe(out); + posix_spawn_file_actions_adddup2(&action, out[1], STDOUT_FILENO); + posix_spawn_file_actions_addclose(&action, out[0]); + } + + pid_t task_pid; + int status = -200; + int spawnError = posix_spawn(&task_pid, [path UTF8String], &action, &attr, (char* const*)argsC, NULL); + posix_spawnattr_destroy(&attr); + for (NSUInteger i = 0; i < argCount; i++) + { + free(argsC[i]); + } + free(argsC); + + if(spawnError != 0) + { + NSLog(@"posix_spawn error %d\n", spawnError); + return spawnError; + } + + do + { + if (waitpid(task_pid, &status, 0) != -1) { + NSLog(@"Child status %d", WEXITSTATUS(status)); + } else + { + perror("waitpid"); + return -222; + } + } while (!WIFEXITED(status) && !WIFSIGNALED(status)); + + if(stdOut) + { + close(out[1]); + NSString* output = getNSStringFromFile(out[0]); + *stdOut = output; + } + + if(stdErr) + { + close(outErr[1]); + NSString* errorOutput = getNSStringFromFile(outErr[0]); + *stdErr = errorOutput; + } + + return WEXITSTATUS(status); +} + +void enumerateProcessesUsingBlock(void (^enumerator)(pid_t pid, NSString* executablePath, BOOL* stop)) +{ + static int maxArgumentSize = 0; + if (maxArgumentSize == 0) { + size_t size = sizeof(maxArgumentSize); + if (sysctl((int[]){ CTL_KERN, KERN_ARGMAX }, 2, &maxArgumentSize, &size, NULL, 0) == -1) { + perror("sysctl argument size"); + maxArgumentSize = 4096; // Default + } + } + int mib[3] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL}; + struct kinfo_proc *info; + size_t length; + int count; + + if (sysctl(mib, 3, NULL, &length, NULL, 0) < 0) + return; + if (!(info = malloc(length))) + return; + if (sysctl(mib, 3, info, &length, NULL, 0) < 0) { + free(info); + return; + } + count = length / sizeof(struct kinfo_proc); + for (int i = 0; i < count; i++) { + @autoreleasepool { + pid_t pid = info[i].kp_proc.p_pid; + if (pid == 0) { + continue; + } + size_t size = maxArgumentSize; + char* buffer = (char *)malloc(length); + if (sysctl((int[]){ CTL_KERN, KERN_PROCARGS2, pid }, 3, buffer, &size, NULL, 0) == 0) { + NSString* executablePath = [NSString stringWithCString:(buffer+sizeof(int)) encoding:NSUTF8StringEncoding]; + + BOOL stop = NO; + enumerator(pid, executablePath, &stop); + if(stop) + { + free(buffer); + break; + } + } + free(buffer); + } + } + free(info); +} + +void killall(NSString* processName, BOOL softly) +{ + enumerateProcessesUsingBlock(^(pid_t pid, NSString* executablePath, BOOL* stop) + { + if([executablePath.lastPathComponent isEqualToString:processName]) + { + if(softly) + { + kill(pid, SIGTERM); + } + else + { + kill(pid, SIGKILL); + } + } + }); +} + +void respring(void) +{ + killall(@"SpringBoard", YES); + exit(0); +} diff --git a/AirTroller/trolldrop/TrollController.swift b/AirTroller/trolldrop/TrollController.swift index ed2a23b..11bfd63 100644 --- a/AirTroller/trolldrop/TrollController.swift +++ b/AirTroller/trolldrop/TrollController.swift @@ -14,9 +14,6 @@ func operationCallback(operation: TDKSFOperation, rawEvent: TDKSFOperationEvent. controller.handleOperationCallback(operation: operation, event: event, results: results) } -func dataProviderRelease(_: UnsafeMutableRawPointer?, _: UnsafeRawPointer, _: Int) -> Void { -} - public class TrollController: ObservableObject { private enum Trolling { case operation(TDKSFOperation) @@ -32,11 +29,7 @@ public class TrollController: ObservableObject { } } - public class Person: Equatable { - public static func == (lhs: TrollController.Person, rhs: TrollController.Person) -> Bool { - lhs.node == rhs.node - } - + public class Person { var displayName: String? var node: TDKSFNode @@ -143,6 +136,8 @@ public class TrollController: ObservableObject { /// Troll the person/device identified by \c node (\c TDKSFNodeRef) func troll(node: TDKSFNode) { + guard trollings[node] == nil else { return } // only troll non-trolled people + remLog("trolling \(node)") var fileIcon: CGImage? @@ -162,9 +157,13 @@ public class TrollController: ObservableObject { let operation = TDKSFOperationCreate(kCFAllocatorDefault, kTDKSFOperationKindSender, nil, nil) TDKSFOperationSetClient(operation, operationCallback, &clientContext) TDKSFOperationSetProperty(operation, kTDKSFOperationItemsKey, [sharedURL] as AnyObject) + + // Set preview if possible if let fileIcon = fileIcon { TDKSFOperationSetProperty(operation, kTDKSFOperationFileIconKey, fileIcon) } + + // Set url of image TDKSFOperationSetProperty(operation, kTDKSFOperationNodeKey, Unmanaged.fromOpaque(UnsafeRawPointer(node)).takeUnretainedValue()) TDKSFOperationSetDispatchQueue(operation, .main) TDKSFOperationResume(operation) @@ -174,7 +173,7 @@ public class TrollController: ObservableObject { } func handleBrowserCallback(browser: TDKSFBrowser, node: TDKSFNode, children: CFArray) { - let nodes = TDKSFBrowserCopyChildren(browser, nil) as [AnyObject] + let nodes = TDKSFBrowserCopyChildren(self.browser!, nil) as [AnyObject] var currentNodes = Set(minimumCapacity: nodes.count) for nodeObject in nodes { @@ -209,12 +208,12 @@ public class TrollController: ObservableObject { let workItem = DispatchWorkItem { [weak self] in self?.eventHandler?(.cancelled) self?.trollings[node]?.cancel() // cancelation of airdrop request + self?.trollings[node] = nil if self?.isRunning ?? false { // dumb fix of a bug self?.troll(node: node) // troll again :troll: } } - trollings[node] = .workItem(workItem) // wait for airdrop to appear on target device. afaik there isn't a way to know when the alert appeared. DispatchQueue.main.asyncAfter(deadline: .now() + rechargeDuration, execute: workItem) // rechargeDuration is controlled via UI default: