diff options
Diffstat (limited to 'src/iphone.c')
| -rw-r--r-- | src/iphone.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/src/iphone.c b/src/iphone.c index e0e150f..f3b7202 100644 --- a/src/iphone.c +++ b/src/iphone.c | |||
| @@ -34,10 +34,15 @@ extern int debug; | |||
| 34 | * @return A structure with data on the first iPhone it finds. (Or NULL, on | 34 | * @return A structure with data on the first iPhone it finds. (Or NULL, on |
| 35 | * error) | 35 | * error) |
| 36 | */ | 36 | */ |
| 37 | iPhone_t get_iPhone() { | 37 | int iphone_get_device ( iphone_device_t *device ){ |
| 38 | iPhone *phone = (iPhone*)malloc(sizeof(iPhone)); | 38 | //check we can actually write in device |
| 39 | if (!device || (device && *device)) | ||
| 40 | return IPHONE_E_INVALID_ARG; | ||
| 41 | |||
| 39 | struct usb_bus *bus, *busses; | 42 | struct usb_bus *bus, *busses; |
| 40 | struct usb_device *dev; | 43 | struct usb_device *dev; |
| 44 | iphone_device_t phone = (iphone_device_t)malloc(sizeof(struct iphone_device_int)); | ||
| 45 | usbmux_version_header *version = version_header(); | ||
| 41 | 46 | ||
| 42 | // Initialize the struct | 47 | // Initialize the struct |
| 43 | phone->device = NULL; | 48 | phone->device = NULL; |
| @@ -74,7 +79,7 @@ iPhone_t get_iPhone() { | |||
| 74 | if (!phone->device || !phone->__device) { | 79 | if (!phone->device || !phone->__device) { |
| 75 | free_iPhone(phone); | 80 | free_iPhone(phone); |
| 76 | if (debug) fprintf(stderr, "get_iPhone(): iPhone not found\n"); | 81 | if (debug) fprintf(stderr, "get_iPhone(): iPhone not found\n"); |
| 77 | return NULL; | 82 | return IPHONE_E_NO_DEVICE; |
| 78 | } | 83 | } |
| 79 | 84 | ||
| 80 | // Send the version command to the phone | 85 | // Send the version command to the phone |
| @@ -99,7 +104,7 @@ iPhone_t get_iPhone() { | |||
| 99 | if (debug) fprintf(stderr, "get_iPhone(): Invalid version message -- header too short.\n"); | 104 | if (debug) fprintf(stderr, "get_iPhone(): Invalid version message -- header too short.\n"); |
| 100 | if (debug && bytes < 0) fprintf(stderr, "get_iPhone(): libusb error message %d: %s (%s)\n", | 105 | if (debug && bytes < 0) fprintf(stderr, "get_iPhone(): libusb error message %d: %s (%s)\n", |
| 101 | bytes, usb_strerror(), strerror(-bytes)); | 106 | bytes, usb_strerror(), strerror(-bytes)); |
| 102 | return NULL; | 107 | return IPHONE_E_NOT_ENOUGH_DATA; |
| 103 | } | 108 | } |
| 104 | 109 | ||
| 105 | // Check for correct version | 110 | // Check for correct version |
| @@ -107,20 +112,21 @@ iPhone_t get_iPhone() { | |||
| 107 | // We're all ready to roll. | 112 | // We're all ready to roll. |
| 108 | fprintf(stderr, "get_iPhone() success\n"); | 113 | fprintf(stderr, "get_iPhone() success\n"); |
| 109 | free(version); | 114 | free(version); |
| 110 | return phone; | 115 | *device = phone; |
| 116 | return IPHONE_E_SUCCESS; | ||
| 111 | } else { | 117 | } else { |
| 112 | // Bad header | 118 | // Bad header |
| 113 | free_iPhone(phone); | 119 | free_iPhone(phone); |
| 114 | free(version); | 120 | free(version); |
| 115 | if (debug) fprintf(stderr, "get_iPhone(): Received a bad header/invalid version number."); | 121 | if (debug) fprintf(stderr, "get_iPhone(): Received a bad header/invalid version number."); |
| 116 | return NULL; | 122 | return IPHONE_E_BAD_HEADER; |
| 117 | } | 123 | } |
| 118 | 124 | ||
| 119 | // If it got to this point it's gotta be bad | 125 | // If it got to this point it's gotta be bad |
| 120 | if (debug) fprintf(stderr, "get_iPhone(): Unknown error.\n"); | 126 | if (debug) fprintf(stderr, "get_iPhone(): Unknown error.\n"); |
| 121 | free_iPhone(phone); | 127 | free_iPhone(phone); |
| 122 | free(version); | 128 | free(version); |
| 123 | return NULL; | 129 | return IPHONE_E_NO_DEVICE; // if it got to this point it's gotta be bad |
| 124 | } | 130 | } |
| 125 | 131 | ||
| 126 | /** Cleans up an iPhone structure, then frees the structure itself. | 132 | /** Cleans up an iPhone structure, then frees the structure itself. |
| @@ -129,14 +135,14 @@ iPhone_t get_iPhone() { | |||
| 129 | * | 135 | * |
| 130 | * @param phone A pointer to an iPhone structure. | 136 | * @param phone A pointer to an iPhone structure. |
| 131 | */ | 137 | */ |
| 132 | void free_iPhone(iPhone_t phone) { | 138 | void iphone_free_device ( iphone_device_t device ) { |
| 133 | if (phone->buffer) free(phone->buffer); | 139 | if (device->buffer) free(device->buffer); |
| 134 | if (phone->device) { | 140 | if (device->device) { |
| 135 | usb_release_interface(phone->device, 1); | 141 | usb_release_interface(device->device, 1); |
| 136 | usb_reset(phone->device); | 142 | usb_reset(device->device); |
| 137 | usb_close(phone->device); | 143 | usb_close(device->device); |
| 138 | } | 144 | } |
| 139 | free(phone); | 145 | free(device); |
| 140 | } | 146 | } |
| 141 | 147 | ||
| 142 | /** Sends data to the phone | 148 | /** Sends data to the phone |
| @@ -147,7 +153,8 @@ void free_iPhone(iPhone_t phone) { | |||
| 147 | * @param datalen The length of the data | 153 | * @param datalen The length of the data |
| 148 | * @return The number of bytes sent, or -1 on error or something. | 154 | * @return The number of bytes sent, or -1 on error or something. |
| 149 | */ | 155 | */ |
| 150 | int send_to_phone(iPhone *phone, char *data, int datalen) { | 156 | int send_to_phone(iphone_device_t phone, char *data, int datalen) { |
| 157 | if (!phone) return -1; | ||
| 151 | int bytes = 0; | 158 | int bytes = 0; |
| 152 | 159 | ||
| 153 | if (!phone) return -1; | 160 | if (!phone) return -1; |
| @@ -173,7 +180,8 @@ int send_to_phone(iPhone *phone, char *data, int datalen) { | |||
| 173 | * | 180 | * |
| 174 | * @return How many bytes were read in, or -1 on error. | 181 | * @return How many bytes were read in, or -1 on error. |
| 175 | */ | 182 | */ |
| 176 | int recv_from_phone(iPhone *phone, char *data, int datalen) { | 183 | int recv_from_phone(iphone_device_t phone, char *data, int datalen) { |
| 184 | if (!phone) return -1; | ||
| 177 | int bytes = 0; | 185 | int bytes = 0; |
| 178 | 186 | ||
| 179 | if (!phone) return -1; | 187 | if (!phone) return -1; |
