More user friendly error messages.

This commit is contained in:
Julius Trinkunas 2015-05-15 17:23:53 +03:00
parent 3857c9afc6
commit 8a3dbce11f
2 changed files with 405 additions and 44 deletions

358
errors.h Normal file
View File

@ -0,0 +1,358 @@
typedef struct errorcode_to_id {
unsigned int error;
const char* id;
} errorcode_to_id_t;
typedef struct error_id_to_message {
const char* id;
const char* message;
} error_id_to_message_t;
// Taken from https://github.com/samdmarshall/SDMMobileDevice/blob/master/Framework/MobileDevice/Error/SDMMD_Error.h
static errorcode_to_id_t errorcode_to_id[] = {
{ 0xe8000001, "kAMDUndefinedError" },
{ 0xe8000002, "kAMDBadHeaderError" },
{ 0xe8000003, "kAMDNoResourcesError" },
{ 0xe8000004, "kAMDReadError" },
{ 0xe8000005, "kAMDWriteError" },
{ 0xe8000006, "kAMDUnknownPacketError" },
{ 0xe8000007, "kAMDInvalidArgumentError" },
{ 0xe8000008, "kAMDNotFoundError" },
{ 0xe8000009, "kAMDIsDirectoryError" },
{ 0xe800000a, "kAMDPermissionError" },
{ 0xe800000b, "kAMDNotConnectedError" },
{ 0xe800000c, "kAMDTimeOutError" },
{ 0xe800000d, "kAMDOverrunError" },
{ 0xe800000e, "kAMDEOFError" },
{ 0xe800000f, "kAMDUnsupportedError" },
{ 0xe8000010, "kAMDFileExistsError" },
{ 0xe8000011, "kAMDBusyError" },
{ 0xe8000012, "kAMDCryptoError" },
{ 0xe8000013, "kAMDInvalidResponseError" },
{ 0xe8000014, "kAMDMissingKeyError" },
{ 0xe8000015, "kAMDMissingValueError" },
{ 0xe8000016, "kAMDGetProhibitedError" },
{ 0xe8000017, "kAMDSetProhibitedError" },
{ 0xe8000018, "kAMDRemoveProhibitedError" },
{ 0xe8000019, "kAMDImmutableValueError" },
{ 0xe800001a, "kAMDPasswordProtectedError" },
{ 0xe800001b, "kAMDMissingHostIDError" },
{ 0xe800001c, "kAMDInvalidHostIDError" },
{ 0xe800001d, "kAMDSessionActiveError" },
{ 0xe800001e, "kAMDSessionInactiveError" },
{ 0xe800001f, "kAMDMissingSessionIDError" },
{ 0xe8000020, "kAMDInvalidSessionIDError" },
{ 0xe8000021, "kAMDMissingServiceError" },
{ 0xe8000022, "kAMDInvalidServiceError" },
{ 0xe8000023, "kAMDInvalidCheckinError" },
{ 0xe8000024, "kAMDCheckinTimeoutError" },
{ 0xe8000025, "kAMDMissingPairRecordError" },
{ 0xe8000026, "kAMDInvalidActivationRecordError" },
{ 0xe8000027, "kAMDMissingActivationRecordError" },
{ 0xe8000028, "kAMDWrongDroidError" },
{ 0xe8000029, "kAMDSUVerificationError" },
{ 0xe800002a, "kAMDSUPatchError" },
{ 0xe800002b, "kAMDSUFirmwareError" },
{ 0xe800002c, "kAMDProvisioningProfileNotValid" },
{ 0xe800002d, "kAMDSendMessageError" },
{ 0xe800002e, "kAMDReceiveMessageError" },
{ 0xe800002f, "kAMDMissingOptionsError" },
{ 0xe8000030, "kAMDMissingImageTypeError" },
{ 0xe8000031, "kAMDDigestFailedError" },
{ 0xe8000032, "kAMDStartServiceError" },
{ 0xe8000033, "kAMDInvalidDiskImageError" },
{ 0xe8000034, "kAMDMissingDigestError" },
{ 0xe8000035, "kAMDMuxError" },
{ 0xe8000036, "kAMDApplicationAlreadyInstalledError" },
{ 0xe8000037, "kAMDApplicationMoveFailedError" },
{ 0xe8000038, "kAMDApplicationSINFCaptureFailedError" },
{ 0xe8000039, "kAMDApplicationSandboxFailedError" },
{ 0xe800003a, "kAMDApplicationVerificationFailedError" },
{ 0xe800003b, "kAMDArchiveDestructionFailedError" },
{ 0xe800003c, "kAMDBundleVerificationFailedError" },
{ 0xe800003d, "kAMDCarrierBundleCopyFailedError" },
{ 0xe800003e, "kAMDCarrierBundleDirectoryCreationFailedError" },
{ 0xe800003f, "kAMDCarrierBundleMissingSupportedSIMsError" },
{ 0xe8000040, "kAMDCommCenterNotificationFailedError" },
{ 0xe8000041, "kAMDContainerCreationFailedError" },
{ 0xe8000042, "kAMDContainerP0wnFailedError" },
{ 0xe8000043, "kAMDContainerRemovalFailedError" },
{ 0xe8000044, "kAMDEmbeddedProfileInstallFailedError" },
{ 0xe8000045, "kAMDErrorError" },
{ 0xe8000046, "kAMDExecutableTwiddleFailedError" },
{ 0xe8000047, "kAMDExistenceCheckFailedError" },
{ 0xe8000048, "kAMDInstallMapUpdateFailedError" },
{ 0xe8000049, "kAMDManifestCaptureFailedError" },
{ 0xe800004a, "kAMDMapGenerationFailedError" },
{ 0xe800004b, "kAMDMissingBundleExecutableError" },
{ 0xe800004c, "kAMDMissingBundleIdentifierError" },
{ 0xe800004d, "kAMDMissingBundlePathError" },
{ 0xe800004e, "kAMDMissingContainerError" },
{ 0xe800004f, "kAMDNotificationFailedError" },
{ 0xe8000050, "kAMDPackageExtractionFailedError" },
{ 0xe8000051, "kAMDPackageInspectionFailedError" },
{ 0xe8000052, "kAMDPackageMoveFailedError" },
{ 0xe8000053, "kAMDPathConversionFailedError" },
{ 0xe8000054, "kAMDRestoreContainerFailedError" },
{ 0xe8000055, "kAMDSeatbeltProfileRemovalFailedError" },
{ 0xe8000056, "kAMDStageCreationFailedError" },
{ 0xe8000057, "kAMDSymlinkFailedError" },
{ 0xe8000058, "kAMDiTunesArtworkCaptureFailedError" },
{ 0xe8000059, "kAMDiTunesMetadataCaptureFailedError" },
{ 0xe800005a, "kAMDAlreadyArchivedError" },
{ 0xe800005b, "kAMDServiceLimitError" },
{ 0xe800005c, "kAMDInvalidPairRecordError" },
{ 0xe800005d, "kAMDServiceProhibitedError" },
{ 0xe800005e, "kAMDCheckinSetupFailedError" },
{ 0xe800005f, "kAMDCheckinConnectionFailedError" },
{ 0xe8000060, "kAMDCheckinReceiveFailedError" },
{ 0xe8000061, "kAMDCheckinResponseFailedError" },
{ 0xe8000062, "kAMDCheckinSendFailedError" },
{ 0xe8000063, "kAMDMuxCreateListenerError" },
{ 0xe8000064, "kAMDMuxGetListenerError" },
{ 0xe8000065, "kAMDMuxConnectError" },
{ 0xe8000066, "kAMDUnknownCommandError" },
{ 0xe8000067, "kAMDAPIInternalError" },
{ 0xe8000068, "kAMDSavePairRecordFailedError" },
{ 0xe8000069, "kAMDCheckinOutOfMemoryError" },
{ 0xe800006a, "kAMDDeviceTooNewError" },
{ 0xe800006b, "kAMDDeviceRefNoGood" },
{ 0xe800006c, "kAMDCannotTranslateError" },
{ 0xe800006d, "kAMDMobileImageMounterMissingImageSignature" },
{ 0xe800006e, "kAMDMobileImageMounterResponseCreationFailed" },
{ 0xe800006f, "kAMDMobileImageMounterMissingImageType" },
{ 0xe8000070, "kAMDMobileImageMounterMissingImagePath" },
{ 0xe8000071, "kAMDMobileImageMounterImageMapLoadFailed" },
{ 0xe8000072, "kAMDMobileImageMounterAlreadyMounted" },
{ 0xe8000073, "kAMDMobileImageMounterImageMoveFailed" },
{ 0xe8000074, "kAMDMobileImageMounterMountPathMissing" },
{ 0xe8000075, "kAMDMobileImageMounterMountPathNotEmpty" },
{ 0xe8000076, "kAMDMobileImageMounterImageMountFailed" },
{ 0xe8000077, "kAMDMobileImageMounterTrustCacheLoadFailed" },
{ 0xe8000078, "kAMDMobileImageMounterDigestFailed" },
{ 0xe8000079, "kAMDMobileImageMounterDigestCreationFailed" },
{ 0xe800007a, "kAMDMobileImageMounterImageVerificationFailed" },
{ 0xe800007b, "kAMDMobileImageMounterImageInfoCreationFailed" },
{ 0xe800007c, "kAMDMobileImageMounterImageMapStoreFailed" },
{ 0xe800007d, "kAMDBonjourSetupError" },
{ 0xe800007e, "kAMDDeviceOSVersionTooLow" },
{ 0xe800007f, "kAMDNoWifiSyncSupportError" },
{ 0xe8000080, "kAMDDeviceFamilyNotSupported" },
{ 0xe8000081, "kAMDEscrowLockedError" },
{ 0xe8000082, "kAMDPairingProhibitedError" },
{ 0xe8000083, "kAMDProhibitedBySupervision" },
{ 0xe8000084, "kAMDDeviceDisconnectedError" },
{ 0xe8000085, "kAMDTooBigError" },
{ 0xe8000086, "kAMDPackagePatchFailedError" },
{ 0xe8000087, "kAMDIncorrectArchitectureError" },
{ 0xe8000088, "kAMDPluginCopyFailedError" },
{ 0xe8000089, "kAMDBreadcrumbFailedError" },
{ 0xe800008a, "kAMDBreadcrumbUnlockError" },
{ 0xe800008b, "kAMDGeoJSONCaptureFailedError" },
{ 0xe800008c, "kAMDNewsstandArtworkCaptureFailedError" },
{ 0xe800008d, "kAMDMissingCommandError" },
{ 0xe800008e, "kAMDNotEntitledError" },
{ 0xe800008f, "kAMDMissingPackagePathError" },
{ 0xe8000090, "kAMDMissingContainerPathError" },
{ 0xe8000091, "kAMDMissingApplicationIdentifierError" },
{ 0xe8000092, "kAMDMissingAttributeValueError" },
{ 0xe8000093, "kAMDLookupFailedError" },
{ 0xe8000094, "kAMDDictCreationFailedError" },
{ 0xe8000095, "kAMDUserDeniedPairingError" },
{ 0xe8000096, "kAMDPairingDialogResponsePendingError" },
{ 0xe8000097, "kAMDInstallProhibitedError" },
{ 0xe8000098, "kAMDUninstallProhibitedError" },
{ 0xe8000099, "kAMDFMiPProtectedError" },
{ 0xe800009a, "kAMDMCProtected" },
{ 0xe800009b, "kAMDMCChallengeRequired" },
{ 0xe800009c, "kAMDMissingBundleVersionError" },
{ 0xe8008015, "A valid provisioning profile for this executable was not found."},
};
const int errorcode_to_id_count = sizeof(errorcode_to_id) / sizeof(errorcode_to_id_t);
// Taken from /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/en_GB.lproj/Localizable.strings
error_id_to_message_t error_id_to_message[] = {
{ "kAMDAPIInternalError", "There was an internal API error." },
{ "kAMDAlreadyArchivedError", "The application is already archived." },
{ "kAMDAppBlacklistedError", "This app is not allowed to be installed on this device." },
{ "kAMDApplicationAlreadyInstalledError", "A system application with the given bundle identifier is already installed on the device and cannot be replaced." },
{ "kAMDApplicationMoveFailedError", "The application could not be moved into place on the device." },
{ "kAMDApplicationSandboxFailedError", "The application could not be sandboxed." },
{ "kAMDApplicationVerificationFailedError", "The application could not be verified." },
{ "kAMDArchiveDestructionFailedError", "Could not remove the application archive." },
{ "kAMDBadHeaderError", "Could not transfer file." },
{ "kAMDBreadcrumbFailedError", "Could not write installation breadcrumb." },
{ "kAMDBreadcrumbUnlockError", "Could not update installation breadcrumb." },
{ "kAMDBundleVerificationFailedError", "The carrier bundle could not be verified." },
{ "kAMDBusyError", "The device is busy." },
{ "kAMDCannotTranslateError", "Could not translate messages from device" },
{ "kAMDCarrierBundleCopyFailedError", "Could not install the carrier bundle." },
{ "kAMDCarrierBundleDirectoryCreationFailedError", "Could not create the carrier bundle directory." },
{ "kAMDCarrierBundleMissingSupportedSIMsError", "There are no supported SIMs for this carrier bundle." },
{ "kAMDCheckinConnectionFailedError", "The service did not start properly on the device." },
{ "kAMDCheckinOutOfMemoryError", "The service did not start properly on the device." },
{ "kAMDCheckinReceiveFailedError", "The service did not start properly on the device." },
{ "kAMDCheckinResponseFailedError", "The service did not start properly on the device." },
{ "kAMDCheckinSendFailedError", "The service did not start properly on the device." },
{ "kAMDCheckinSetupFailedError", "Could not start service on device" },
{ "kAMDCheckinTimeoutError", "The service did not start properly on the device." },
{ "kAMDCommCenterNotificationFailedError", "Could not listen for notification from the baseband." },
{ "kAMDContainerCreationFailedError", "Could not create application container." },
{ "kAMDContainerP0wnFailedError", "Could not repair permissions on application container." },
{ "kAMDContainerRemovalFailedError", "Could not remove the application container." },
{ "kAMDCryptoError", "Could not establish a secure connection to the device." },
{ "kAMDDeviceDisconnectedError", "This device is no longer connected." },
{ "kAMDDeviceFamilyNotSupported", "This application does not support this kind of device." },
{ "kAMDDeviceOSVersionTooLow", "The device OS version is too low." },
{ "kAMDDeviceRefNoGood", "This device is no longer connected." },
{ "kAMDDeviceTooNewError", "This application needs to be updated." },
{ "kAMDDictCreationFailedError", "Could not extract capabilities from the request." },
{ "kAMDDigestFailedError", "Could not read disk image." },
{ "kAMDEOFError", "End of file." },
{ "kAMDEmbeddedProfileInstallFailedError", "Could not install the embedded provisioning profile." },
{ "kAMDErrorError", "An error occurred." },
{ "kAMDEscrowLockedError", "Device is not available until first unlock after boot." },
{ "kAMDExecutableTwiddleFailedError", "Could not change executable permissions on the application." },
{ "kAMDExistenceCheckFailedError", "Could not check to see if the application already exists." },
{ "kAMDFMiPProtectedError", "The device is in lost mode." },
{ "kAMDFileExistsError", "The file already exists." },
{ "kAMDGeoJSONCaptureFailedError", "Could not save the GeoJSON data." },
{ "kAMDGetProhibitedError", "Cannot retrieve value from the passcode-locked device." },
{ "kAMDImmutableValueError", "This value cannot be changed." },
{ "kAMDIncorrectArchitectureError", "This application does not support this device's CPU type." },
{ "kAMDInstallMapUpdateFailedError", "Could not update the installed applications list." },
{ "kAMDInstallProhibitedError", "Installation of apps is prohibited by a policy on the device." },
{ "kAMDInvalidActivationRecordError", "The activation record is not valid." },
{ "kAMDInvalidArgumentError", "The argument is invalid." },
{ "kAMDInvalidCheckinError", "Could not start service on device" },
{ "kAMDInvalidDiskImageError", "The disk image is invalid." },
{ "kAMDInvalidHostIDError", "The device does not recognise this host." },
{ "kAMDInvalidPairRecordError", "The host is no longer paired with the device." },
{ "kAMDInvalidResponseError", "Received an unexpected response from the device." },
{ "kAMDInvalidServiceError", "The service is invalid." },
{ "kAMDInvalidSessionIDError", "The session ID is invalid." },
{ "kAMDIsDirectoryError", "The path is a directory." },
{ "kAMDLookupFailedError", "Could not list installed applications." },
{ "kAMDMCChallengeRequired", "A policy on the device requires secure pairing." },
{ "kAMDMCProtected", "Pairing is prohibited by a policy on the device." },
{ "kAMDManifestCaptureFailedError", "Could not save the application manifest." },
{ "kAMDMapGenerationFailedError", "Could not generate the map." },
{ "kAMDMissingActivationRecordError", "The activation record could not be found." },
{ "kAMDMissingApplicationIdentifierError", "Request was missing the application identifier." },
{ "kAMDMissingAttributeValueError", "Request was missing a required value." },
{ "kAMDMissingBundleExecutableError", "The application bundle does not contain an executable." },
{ "kAMDMissingBundleIdentifierError", "The application bundle does not contain a valid identifier." },
{ "kAMDMissingBundlePathError", "Could not determine the application bundle path." },
{ "kAMDMissingBundleVersionError", "The bundle's Info.plist does not contain a CFBundleVersion key or its value is not a string." },
{ "kAMDMissingCommandError", "The request did not contain a command." },
{ "kAMDMissingContainerError", "Could not find the container for the installed application." },
{ "kAMDMissingContainerPathError", "Request was missing the container path." },
{ "kAMDMissingDigestError", "The digest is missing." },
{ "kAMDMissingHostIDError", "The device does not recognise this host." },
{ "kAMDMissingImageTypeError", "The image is missing." },
{ "kAMDMissingKeyError", "The key is missing." },
{ "kAMDMissingOptionsError", "The options are missing." },
{ "kAMDMissingPackagePathError", "Request was missing the package path." },
{ "kAMDMissingPairRecordError", "The host is not paired with the device." },
{ "kAMDMissingServiceError", "The service is missing." },
{ "kAMDMissingSessionIDError", "The session ID is missing." },
{ "kAMDMissingValueError", "The value is missing." },
{ "kAMDMobileImageMounterAlreadyMounted", "Could not support development." },
{ "kAMDMobileImageMounterDigestCreationFailed", "Could not support development." },
{ "kAMDMobileImageMounterDigestFailed", "Could not support development." },
{ "kAMDMobileImageMounterImageInfoCreationFailed", "Could not support development." },
{ "kAMDMobileImageMounterImageMapLoadFailed", "Could not support development." },
{ "kAMDMobileImageMounterImageMapStoreFailed", "Could not support development." },
{ "kAMDMobileImageMounterImageMountFailed", "Could not support development." },
{ "kAMDMobileImageMounterImageMoveFailed", "Could not support development." },
{ "kAMDMobileImageMounterImageVerificationFailed", "Could not support development." },
{ "kAMDMobileImageMounterMissingImagePath", "Could not support development." },
{ "kAMDMobileImageMounterMissingImageSignature", "Could not support development." },
{ "kAMDMobileImageMounterMissingImageType", "Could not support development." },
{ "kAMDMobileImageMounterMountPathMissing", "Could not support development." },
{ "kAMDMobileImageMounterMountPathNotEmpty", "Could not support development." },
{ "kAMDMobileImageMounterResponseCreationFailed", "Could not support development." },
{ "kAMDMobileImageMounterTrustCacheLoadFailed", "Could not support development." },
{ "kAMDMuxConnectError", "Could not connect to the device." },
{ "kAMDMuxCreateListenerError", "Could not listen for USB devices." },
{ "kAMDMuxError", "There was an error with the USB device multiplexor." },
{ "kAMDMuxGetListenerError", "Could not get the USB listener." },
{ "kAMDNewsstandArtworkCaptureFailedError", "Could not save the Newsstand artwork." },
{ "kAMDNoResourcesError", "Could not allocate a resource." },
{ "kAMDNoWifiSyncSupportError", "Device doesn't support wireless sync." },
{ "kAMDNotConnectedError", "Not connected to the device." },
{ "kAMDNotEntitledError", "The requesting application is not allowed to make this request." },
{ "kAMDNotFoundError", "The file could not be found." },
{ "kAMDNotificationFailedError", "Could not post a notification." },
{ "kAMDOverrunError", "There was a buffer overrun." },
{ "kAMDPackageExtractionFailedError", "Could not open the application package." },
{ "kAMDPackageInspectionFailedError", "Could not inspect the application package." },
{ "kAMDPackageMoveFailedError", "Could not move the application package into the staging location." },
{ "kAMDPackagePatchFailedError", "Could not apply patch update to application." },
{ "kAMDPairingDialogResponsePendingError", "The user has not yet responded to the pairing request." },
{ "kAMDPairingProhibitedError", "Pairing only allowed over USB." },
{ "kAMDPasswordProtectedError", "The device is passcode protected." },
{ "kAMDPathConversionFailedError", "Could not convert the path." },
{ "kAMDPermissionError", "You do not have permission." },
{ "kAMDPluginCopyFailedError", "Could not copy VPN Plug-in into app container." },
{ "kAMDProhibitedBySupervision", "Operation prohibited on supervised devices." },
{ "kAMDProvisioningProfileNotValid", "The provisioning profile is not valid." },
{ "kAMDReadError", "Could not read from the device." },
{ "kAMDReceiveMessageError", "Could not receive a message from the device." },
{ "kAMDRemoveProhibitedError", "Cannot remove value on device." },
{ "kAMDRestoreContainerFailedError", "Could not restore the application container." },
{ "kAMDSUFirmwareError", "Could not flash the firmware." },
{ "kAMDSUPatchError", "Could not patch the file." },
{ "kAMDSUVerificationError", "The software update package could not be verified." },
{ "kAMDSavePairRecordFailedError", "Could not save the pairing record." },
{ "kAMDSeatbeltProfileRemovalFailedError", "Could not remove the application seatbelt profile." },
{ "kAMDSendMessageError", "Could not send a message to the device." },
{ "kAMDServiceLimitError", "Too many instances of this service are already running." },
{ "kAMDServiceProhibitedError", "The service could not be started on the device." },
{ "kAMDSessionActiveError", "The session is active." },
{ "kAMDSessionInactiveError", "The session is inactive." },
{ "kAMDSetProhibitedError", "Cannot set value on device." },
{ "kAMDStageCreationFailedError", "Could not create the staging directory." },
{ "kAMDStartServiceError", "The service could not be started." },
{ "kAMDSuccess", "There was no error." },
{ "kAMDSymlinkFailedError", "Could not create the symlink." },
{ "kAMDTimeOutError", "The operation timed out." },
{ "kAMDTooBigError", "The message is too big." },
{ "kAMDUndefinedError", "An unknown error occurred." },
{ "kAMDUninstallProhibitedError", "Uninstallation of apps is prohibited by a policy on the device." },
{ "kAMDUnknownCommandError", "The device does not recognise the command." },
{ "kAMDUnknownPacketError", "The packet is unknown." },
{ "kAMDUnsupportedError", "This operation is unsupported." },
{ "kAMDUserDeniedPairingError", "The device rejected the pairing attempt." },
{ "kAMDWriteError", "Could not write to the device." },
{ "kAMDWrongDroidError", "The device is in recovery mode." },
{ "kAMDiTunesArtworkCaptureFailedError", "Could not save the iTunes artwork." },
{ "kAMDiTunesMetadataCaptureFailedError", "Could not save the iTunes metadata." },
};
const int error_id_to_message_count = sizeof(error_id_to_message) / sizeof(error_id_to_message_t);
const char* get_error_message(unsigned int error) {
const char* id = NULL;
// Lookup error localization id
for (int i = 0; i < errorcode_to_id_count; i++) {
if (errorcode_to_id[i].error == error) {
id = errorcode_to_id[i].id;
break;
}
}
// Lookup error message
if (id) {
for (int i = 0; i < error_id_to_message_count; i++)
if (strcmp(error_id_to_message[i].id, id) == 0)
return error_id_to_message[i].message;
}
// If message is not found, then at least return id if it was found, otherwise NULL
return id;
};

View File

@ -14,7 +14,9 @@
#include <pwd.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include "MobileDevice.h"
#include "errors.h"
#define APP_VERSION "1.6.1"
#define PREP_CMDS_PATH "/tmp/fruitstrap-lldb-prep-cmds-"
@ -183,6 +185,17 @@ AMDeviceRef best_device_match = NULL;
const int exitcode_error = 253;
const int exitcode_app_crash = 254;
// Checks for MobileDevice.framework errors, tries to print them and exits.
#define check_error(call) \
do { \
unsigned int err = (unsigned int)call; \
if (err != 0) \
{ \
const char* msg = get_error_message(err); \
on_error("Error 0x%x: %s " #call, err, msg ? msg : "unknown."); \
} \
} while (false);
// Print error message and exit
void on_error(const char* fmt, ...) {
char buf[256];
@ -674,8 +687,7 @@ CFURLRef copy_device_app_url(AMDeviceRef device, CFStringRef identifier) {
NSDictionary *optionsDict = [NSDictionary dictionaryWithObject:a forKey:@"ReturnAttributes"];
CFDictionaryRef options = (CFDictionaryRef)optionsDict;
afc_error_t resultStatus = AMDeviceLookupApplications(device, options, &result);
assert(resultStatus == 0);
check_error(AMDeviceLookupApplications(device, options, &result));
CFDictionaryRef app_dict = CFDictionaryGetValue(result, identifier);
assert(app_dict != NULL);
@ -877,8 +889,7 @@ void fdvendor_callback(CFSocketRef s, CFSocketCallBackType callbackType, CFDataR
void start_remote_debug_server(AMDeviceRef device) {
int res = AMDeviceStartService(device, CFSTR("com.apple.debugserver"), &gdbfd, NULL);
assert(res == 0);
check_error(AMDeviceStartService(device, CFSTR("com.apple.debugserver"), &gdbfd, NULL));
assert(gdbfd > 0);
/*
@ -907,7 +918,7 @@ void start_remote_debug_server(AMDeviceRef device) {
CFSocketSetAddress(fdvendor, address_data);
CFRelease(address_data);
socklen_t addrlen = sizeof(addr4);
res = getsockname(CFSocketGetNative(fdvendor),(struct sockaddr *)&addr4,&addrlen);
int res = getsockname(CFSocketGetNative(fdvendor),(struct sockaddr *)&addr4,&addrlen);
assert(res == 0);
port = ntohs(addr4.sin_port);
@ -989,8 +1000,8 @@ void setup_lldb(AMDeviceRef device, CFURLRef url) {
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
printf("------ Debug phase ------\n");
@ -1210,8 +1221,8 @@ void read_dir(service_conn_t afcFd, afc_connection* afc_conn_p, const char* dir,
service_conn_t start_house_arrest_service(AMDeviceRef device) {
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
service_conn_t houseFd;
@ -1227,8 +1238,8 @@ service_conn_t start_house_arrest_service(AMDeviceRef device) {
exit(1);
}
assert(AMDeviceStopSession(device) == 0);
assert(AMDeviceDisconnect(device) == 0);
check_error(AMDeviceStopSession(device));
check_error(AMDeviceDisconnect(device));
CFRelease(cf_bundle_id);
return houseFd;
@ -1291,8 +1302,8 @@ int app_exists(AMDeviceRef device)
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
CFStringRef cf_bundle_id = CFStringCreateWithCString(NULL, bundle_id, kCFStringEncodingASCII);
@ -1301,8 +1312,7 @@ int app_exists(AMDeviceRef device)
CFDictionaryRef options = (CFDictionaryRef)optionsDict;
CFDictionaryRef result = nil;
afc_error_t resultStatus = AMDeviceLookupApplications(device, options, &result);
assert(resultStatus == 0);
check_error(AMDeviceLookupApplications(device, options, &result));
CFDictionaryRef app_dict = CFDictionaryGetValue(result, cf_bundle_id);
@ -1310,8 +1320,8 @@ int app_exists(AMDeviceRef device)
CFRelease(cf_bundle_id);
assert(AMDeviceStopSession(device) == 0);
assert(AMDeviceDisconnect(device) == 0);
check_error(AMDeviceStopSession(device));
check_error(AMDeviceDisconnect(device));
return appExists;
}
@ -1443,7 +1453,7 @@ void upload_file(AMDeviceRef device) {
c++;
}
*lastSlash = '\0';
assert(AFCDirectoryCreate(afc_conn_p, dirpath) == 0);
check_error(AFCDirectoryCreate(afc_conn_p, dirpath));
}
@ -1511,8 +1521,8 @@ void uninstall_app(AMDeviceRef device) {
} else {
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
int code = AMDeviceSecureUninstallApplication(0, device, cf_uninstall_bundle_id, 0, NULL, 0);
if (code == 0) {
@ -1520,8 +1530,8 @@ void uninstall_app(AMDeviceRef device) {
} else {
printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(cf_uninstall_bundle_id, CFStringGetSystemEncoding()));
}
assert(AMDeviceStopSession(device) == 0);
assert(AMDeviceDisconnect(device) == 0);
check_error(AMDeviceStopSession(device));
check_error(AMDeviceDisconnect(device));
}
}
@ -1597,8 +1607,8 @@ void handle_device(AMDeviceRef device) {
} else {
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
int code = AMDeviceSecureUninstallApplication(0, device, cf_uninstall_bundle_id, 0, NULL, 0);
if (code == 0) {
@ -1606,8 +1616,8 @@ void handle_device(AMDeviceRef device) {
} else {
printf("[ ERROR ] Could not uninstall package with bundle id %s\n", CFStringGetCStringPtr(cf_uninstall_bundle_id, CFStringGetSystemEncoding()));
}
assert(AMDeviceStopSession(device) == 0);
assert(AMDeviceDisconnect(device) == 0);
check_error(AMDeviceStopSession(device));
check_error(AMDeviceDisconnect(device));
}
}
@ -1617,22 +1627,22 @@ void handle_device(AMDeviceRef device) {
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
// NOTE: the secure version doesn't seem to require us to start the AFC service
service_conn_t afcFd;
assert(AMDeviceSecureStartService(device, CFSTR("com.apple.afc"), NULL, &afcFd) == 0);
assert(AMDeviceStopSession(device) == 0);
assert(AMDeviceDisconnect(device) == 0);
check_error(AMDeviceSecureStartService(device, CFSTR("com.apple.afc"), NULL, &afcFd));
check_error(AMDeviceStopSession(device));
check_error(AMDeviceDisconnect(device));
CFStringRef keys[] = { CFSTR("PackageType") };
CFStringRef values[] = { CFSTR("Developer") };
CFDictionaryRef options = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
//assert(AMDeviceTransferApplication(afcFd, path, NULL, transfer_callback, NULL) == 0);
assert(AMDeviceSecureTransferPath(0, device, url, options, transfer_callback, 0)==0);
check_error(AMDeviceSecureTransferPath(0, device, url, options, transfer_callback, 0));
close(afcFd);
@ -1640,8 +1650,8 @@ void handle_device(AMDeviceRef device) {
AMDeviceConnect(device);
assert(AMDeviceIsPaired(device));
assert(AMDeviceValidatePairing(device) == 0);
assert(AMDeviceStartSession(device) == 0);
check_error(AMDeviceValidatePairing(device));
check_error(AMDeviceStartSession(device));
// // NOTE: the secure version doesn't seem to require us to start the installation_proxy service
// // Although I can't find it right now, I in some code that the first param of AMDeviceSecureInstallApplication was a "dontStartInstallProxy"
@ -1651,19 +1661,12 @@ void handle_device(AMDeviceRef device) {
//assert(AMDeviceSecureStartService(device, CFSTR("com.apple.mobile.installation_proxy"), NULL, &installFd) == 0);
//mach_error_t result = AMDeviceInstallApplication(installFd, path, options, install_callback, NULL);
mach_error_t result = AMDeviceSecureInstallApplication(0, device, url, options, install_callback, 0);
if (result != 0)
{
char* error = "Unknown error.";
if (result == 0xe8008015)
error = "Your application failed code-signing checks. Check your certificates, provisioning profiles, and bundle ids.";
on_error("AMDeviceInstallApplication failed: 0x%X: %s", result, error);
}
check_error(AMDeviceSecureInstallApplication(0, device, url, options, install_callback, 0));
// close(installFd);
assert(AMDeviceStopSession(device) == 0);
assert(AMDeviceDisconnect(device) == 0);
check_error(AMDeviceStopSession(device));
check_error(AMDeviceDisconnect(device));
CFRelease(path);
CFRelease(options);