#import #import "AppInstaller.h" #include "AppKitPrevention.h" int main(int __unused argc, const char __unused *argv[]) { @autoreleasepool { NSArray *args = [[NSProcessInfo processInfo] arguments]; if (args.count != 4) { return EXIT_FAILURE; } NSString *hostBundleIdentifier = args[1]; NSString *homeDirectory = args[2]; NSString *userName = args[3]; AppInstaller *appInstaller = [[AppInstaller alloc] initWithHostBundleIdentifier:hostBundleIdentifier homeDirectory:homeDirectory userName:userName]; [appInstaller start]; // Ignore SIGTERM because we are going to catch it ourselves signal(SIGTERM, SIG_IGN); // Ignore SIGPIPE because we won't want read or write failures due to broken pipe to unexpectably // terminate the process (e.g, when extracting archives or performing package installs). signal(SIGPIPE, SIG_IGN); dispatch_source_t sigtermSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGTERM, 0, dispatch_get_main_queue()); dispatch_source_set_event_handler(sigtermSource, ^{ [appInstaller cleanupAndExitWithStatus:SIGTERM error:nil]; }); dispatch_resume(sigtermSource); [[NSRunLoop currentRunLoop] run]; } return EXIT_SUCCESS; }