CFStringRef copy_developer_disk_image_path(AMDeviceRef device) { CFStringRef version = AMDeviceCopyValue(device, 0, CFSTR("ProductVersion")); CFStringRef build = AMDeviceCopyValue(device, 0, CFSTR("BuildVersion")); const char *home = getenv("HOME"); CFStringRef path; bool found = false; CFStringRef xcodeDevPath = copy_xcode_dev_path(); path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/iOS DeviceSupport/%@ (%@)/DeveloperDiskImage.dmg"), home, version, build); found = path_exists(path); if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/iOS DeviceSupport/%@/DeveloperDiskImage.dmg"), home, version); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/iOS DeviceSupport/Latest/DeveloperDiskImage.dmg"), home); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/Platforms/iPhoneOS.platform/DeviceSupport/%@ (%@)/DeveloperDiskImage.dmg"), xcodeDevPath, version, build); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/Platforms/iPhoneOS.platform/DeviceSupport/%@/DeveloperDiskImage.dmg"), xcodeDevPath, version); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/Platforms/iPhoneOS.platform/DeviceSupport/Latest/DeveloperDiskImage.dmg"), xcodeDevPath); found = path_exists(path); } CFRelease(version); CFRelease(build); CFRelease(xcodeDevPath); if (!found) { PRINT("[ !! ] Unable to locate DeviceSupport directory containing DeveloperDiskImage.dmg.\n"); CFIndex pathLength = CFStringGetLength(path); char *buffer = calloc(pathLength + 1, sizeof(char)); Boolean success = CFStringGetCString(path, buffer, pathLength + 1, kCFStringEncodingUTF8); CFRelease(path); if (success) PRINT("[ !! ] Last path checked: %s\n", buffer); exit(EXIT_FAILURE); } return path; }
CFStringRef copy_device_support_path(AMDeviceRef device) { CFStringRef version = AMDeviceCopyValue(device, 0, CFSTR("ProductVersion")); CFStringRef build = AMDeviceCopyValue(device, 0, CFSTR("BuildVersion")); const char* home = getenv("HOME"); CFStringRef path; bool found = false; CFStringRef xcodeDevPath = copy_xcode_dev_path(); path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/iOS DeviceSupport/%@ (%@)"), home, version, build); found = path_exists(path); if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/iOS DeviceSupport/%@"), home, version); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/iOS DeviceSupport/Latest"), home); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/Platforms/iPhoneOS.platform/DeviceSupport/%@ (%@)"), xcodeDevPath, version, build); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/Platforms/iPhoneOS.platform/DeviceSupport/%@"), xcodeDevPath, version); found = path_exists(path); } if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/Platforms/iPhoneOS.platform/DeviceSupport/Latest"), xcodeDevPath); found = path_exists(path); } CFRelease(version); CFRelease(build); CFRelease(xcodeDevPath); if (!found) { PRINT("[ !! ] Unable to locate DeviceSupport directory.\n"); CFRelease(path); exit(EXIT_FAILURE); } return path; }
CFStringRef copy_xcode_path_for(CFStringRef subPath, CFStringRef search) { CFStringRef xcodeDevPath = copy_xcode_dev_path(); CFStringRef path; bool found = false; const char* home = get_home(); // Try using xcode-select --print-path if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/%@/%@"), xcodeDevPath, subPath, search); found = path_exists(path); } // Try find `xcode-select --print-path` with search as a name pattern if (!found) { path = find_path(CFStringCreateWithFormat(NULL, NULL, CFSTR("%@/%@"), xcodeDevPath, subPath), search, CFSTR("-maxdepth 1")); found = CFStringGetLength(path) > 0 && path_exists(path); } // If not look in the default xcode location (xcode-select is sometimes wrong) if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("/Applications/Xcode.app/Contents/Developer/%@&%@"), subPath, search); found = path_exists(path); } // If not look in the users home directory, Xcode can store device support stuff there if (!found) { path = CFStringCreateWithFormat(NULL, NULL, CFSTR("%s/Library/Developer/Xcode/%@/%@"), home, subPath, search); found = path_exists(path); } CFRelease(xcodeDevPath); if (found) { return path; } else { CFRelease(path); return NULL; } }