in idb_companion/main.m [649:710]
int main(int argc, const char *argv[]) {
@autoreleasepool
{
NSArray<NSString *> *arguments = NSProcessInfo.processInfo.arguments;
if ([arguments containsObject:@"--help"]) {
fprintf(stderr, "%s", kUsageHelpMessage);
return 1;
}
if ([arguments containsObject:@"--version"]) {
WriteJSONToStdOut(@{@"build_time": @(__TIME__), @"build_date": @(__DATE__)});
return 0;
}
NSUserDefaults *userDefaults = NSUserDefaults.standardUserDefaults;
FBIDBLogger *logger = [FBIDBLogger loggerWithUserDefaults:userDefaults];
logStartupInfo(logger);
NSError *error = nil;
// Check that xcode-select returns a valid path, throw a big
// warning if not
BOOL xcodeAvailable = [FBXcodeDirectory.xcodeSelectDeveloperDirectory await:&error] != nil;
if (!xcodeAvailable) {
[logger.error logFormat:@"Xcode is not available, idb will not be able to use Simulators: %@", error];
error = nil;
}
FBFuture<NSNumber *> *signalled = [FBFuture race:@[
signalHandlerFuture(SIGINT, @"Signalled: SIGINT", logger),
signalHandlerFuture(SIGTERM, @"Signalled: SIGTERM", logger),
]];
FBFuture<NSNull *> *companionCompleted = [GetCompanionCompletedFuture(userDefaults, xcodeAvailable, logger) await:&error];
if (!companionCompleted) {
[logger.error log:error.localizedDescription];
return 1;
}
FBFuture<NSNull *> *completed = [FBFuture race:@[
companionCompleted,
signalled,
]];
if (completed.error) {
[logger.error log:completed.error.localizedDescription];
return 1;
}
id result = [completed await:&error];
if (!result) {
[logger.error log:error.localizedDescription];
return 1;
}
if (companionCompleted.state == FBFutureStateCancelled) {
[logger logFormat:@"Responding to termination of idb with signo %@", result];
FBFuture<NSNull *> *cancellation = [companionCompleted cancel];
result = [cancellation await:&error];
if (!result) {
[logger.error log:error.localizedDescription];
return 1;
}
}
}
return 0;
}