int main()

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;
}