summaryrefslogtreecommitdiffstats
path: root/src/iphone.c
diff options
context:
space:
mode:
authorGravatar Matt Colyer2008-08-13 23:21:04 -0700
committerGravatar Matt Colyer2008-08-13 23:21:04 -0700
commitb39a0c05e41f5dca5931cd3d550ef0c2a4142e4b (patch)
treef765ebe786886ded0a74521c9fa1c13b32e2837b /src/iphone.c
parentf281e24cca43149db1f6077a8b42e456393a8856 (diff)
downloadlibimobiledevice-b39a0c05e41f5dca5931cd3d550ef0c2a4142e4b.tar.gz
libimobiledevice-b39a0c05e41f5dca5931cd3d550ef0c2a4142e4b.tar.bz2
Minor cleanups, refactored and commented iphone.c.
Diffstat (limited to 'src/iphone.c')
-rw-r--r--src/iphone.c128
1 files changed, 77 insertions, 51 deletions
diff --git a/src/iphone.c b/src/iphone.c
index 558dd9a..104418f 100644
--- a/src/iphone.c
+++ b/src/iphone.c
@@ -29,30 +29,36 @@
extern int debug;
-/**
+/** Gets a handle to an iPhone
*
* @return A structure with data on the first iPhone it finds. (Or NULL, on
- * error)
+ * error)
*/
iPhone *get_iPhone() {
iPhone *phone = (iPhone*)malloc(sizeof(iPhone));
usbmux_version_header *version = version_header();
+ struct usb_bus *bus, *busses;
+ struct usb_device *dev;
- // initialize the struct
+ // Initialize the struct
phone->device = NULL;
phone->__device = NULL;
phone->buffer = NULL;
- // Initialize libusb.
+ // Initialize libusb
usb_init();
usb_find_busses();
usb_find_devices();
- struct usb_bus *busses = usb_get_busses(), *bus;
- struct usb_device *dev;
+ busses = usb_get_busses();
for (bus = busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
- if (dev->descriptor.idVendor == 0x05ac && (dev->descriptor.idProduct == 0x1290 || dev->descriptor.idProduct == 0x1291 || dev->descriptor.idProduct == 0x1292)) {
+ if (dev->descriptor.idVendor == 0x05ac &&
+ (dev->descriptor.idProduct == 0x1290 ||
+ dev->descriptor.idProduct == 0x1291 ||
+ dev->descriptor.idProduct == 0x1292
+ )
+ ) {
phone->__device = dev;
phone->device = usb_open(phone->__device);
usb_reset(phone->device);
@@ -60,12 +66,18 @@ iPhone *get_iPhone() {
}
}
- phone->device = NULL; // :( sorry Daniel
- phone->__device = NULL; // :( sorry Daniel
+ phone->device = NULL;
+ phone->__device = NULL;
- for (bus = busses; bus; bus = bus->next) { // do it again as per libusb documentation
+ // Set the device configuration
+ for (bus = busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
- if (dev->descriptor.idVendor == 0x05ac && (dev->descriptor.idProduct == 0x1290 || dev->descriptor.idProduct == 0x1291 || dev->descriptor.idProduct == 0x1292)) {
+ if (dev->descriptor.idVendor == 0x05ac &&
+ (dev->descriptor.idProduct == 0x1290 ||
+ dev->descriptor.idProduct == 0x1291 ||
+ dev->descriptor.idProduct == 0x1292
+ )
+ ) {
phone->__device = dev;
phone->device = usb_open(phone->__device);
usb_set_configuration(phone->device, 3);
@@ -76,58 +88,73 @@ iPhone *get_iPhone() {
if (phone->__device && phone->device) break;
}
- if (!phone->device || !phone->__device) { // nothing connected
+ // Check to see if we are connected
+ if (!phone->device || !phone->__device) {
free_iPhone(phone);
- if (debug) printf("get_iPhone(): iPhone not found\n");
+ if (debug) fprintf(stderr, "get_iPhone(): iPhone not found\n");
return NULL;
}
- // Okay, initialize the phone now.
+ // Send the version command to the phone
int bytes = 0;
bytes = usb_bulk_write(phone->device, BULKOUT, (char*)version, sizeof(*version), 800);
if (bytes < 20 && debug) {
- printf("get_iPhone(): libusb did NOT send enough!\n");
+ fprintf(stderr, "get_iPhone(): libusb did NOT send enough!\n");
if (bytes < 0) {
- printf("get_iPhone(): libusb gave me the error %d: %s (%s)\n",
+ fprintf(stderr, "get_iPhone(): libusb gave me the error %d: %s (%s)\n",
bytes, usb_strerror(), strerror(-bytes));
}
}
+
+ // Read the phone's response
bytes = usb_bulk_read(phone->device, BULKIN, (char*)version, sizeof(*version), 800);
+
+ // Check for bad response
if (bytes < 20) {
free_iPhone(phone);
- if (debug) printf("get_iPhone(): Invalid version message -- header too short.\n");
- if (debug && bytes < 0) printf("get_iPhone(): libusb error message %d: %s (%s)\n", bytes, usb_strerror(), strerror(-bytes));
+ free(version);
+ if (debug) fprintf(stderr, "get_iPhone(): Invalid version message -- header too short.\n");
+ if (debug && bytes < 0) fprintf(stderr, "get_iPhone(): libusb error message %d: %s (%s)\n",
+ bytes, usb_strerror(), strerror(-bytes));
+ return NULL;
+ }
+
+ // Check for correct version
+ if (ntohl(version->major) == 1 && ntohl(version->minor) == 0) {
+ // We're all ready to roll.
+ fprintf(stderr, "get_iPhone() success\n");
+ free(version);
+ return phone;
+ } else {
+ // Bad header
+ free_iPhone(phone);
+ free(version);
+ if (debug) fprintf(stderr, "get_iPhone(): Received a bad header/invalid version number.");
return NULL;
- } else {
- if (ntohl(version->major) == 1 && ntohl(version->minor) == 0) {
- // We're all ready to roll.
- printf("get_iPhone() success\n");
- return phone;
- } else { // BAD HEADER
- free_iPhone(phone);
- if (debug) printf("get_iPhone(): Received a bad header/invalid version number.");
- return NULL;
- }
}
- if (debug) printf("get_iPhone(): Unknown error.\n");
- return NULL; // if it got to this point it's gotta be bad
+
+ // If it got to this point it's gotta be bad
+ if (debug) fprintf(stderr, "get_iPhone(): Unknown error.\n");
+ free_iPhone(phone);
+ free(version);
+ return NULL;
}
/** Cleans up an iPhone structure, then frees the structure itself.
* This is a library-level function; deals directly with the iPhone to tear
* down relations, but otherwise is mostly internal.
*
- * @param victim A pointer to an iPhone structure.
+ * @param phone A pointer to an iPhone structure.
*/
-void free_iPhone(iPhone *victim) {
- if (victim->buffer) free(victim->buffer);
- if (victim->device) {
- usb_release_interface(victim->device, 1);
- usb_reset(victim->device);
- usb_close(victim->device);
+void free_iPhone(iPhone *phone) {
+ if (phone->buffer) free(phone->buffer);
+ if (phone->device) {
+ usb_release_interface(phone->device, 1);
+ usb_reset(phone->device);
+ usb_close(phone->device);
}
- free(victim);
+ free(phone);
}
/** Sends data to the phone
@@ -139,16 +166,15 @@ void free_iPhone(iPhone *victim) {
* @return The number of bytes sent, or -1 on error or something.
*/
int send_to_phone(iPhone *phone, char *data, int datalen) {
- if (!phone) return -1;
int bytes = 0;
- // it may die here
- if (debug) printf("dying here?\ndatalen = %i\ndata = %p\n", datalen, data);
+
+ if (!phone) return -1;
+ if (debug) fprintf(stderr, "send_to_phone: Attempting to send datalen = %i data = %p\n", datalen, data);
bytes = usb_bulk_write(phone->device, BULKOUT, data, datalen, 800);
- if (debug) printf("noooo...?\n");
if (bytes < datalen) {
if(debug && bytes < 0)
- printf("send_to_iphone(): libusb gave me the error %d: %s - %s\n", bytes, usb_strerror(), strerror(-bytes));
+ fprintf(stderr, "send_to_iphone(): libusb gave me the error %d: %s - %s\n", bytes, usb_strerror(), strerror(-bytes));
return -1;
} else {
return bytes;
@@ -157,8 +183,7 @@ int send_to_phone(iPhone *phone, char *data, int datalen) {
return -1;
}
-/**
- * This function is a low-level (i.e. direct to iPhone) function.
+/** This function is a low-level (i.e. direct to iPhone) function.
*
* @param phone The iPhone to receive data from
* @param data Where to put data read
@@ -167,15 +192,16 @@ int send_to_phone(iPhone *phone, char *data, int datalen) {
* @return How many bytes were read in, or -1 on error.
*/
int recv_from_phone(iPhone *phone, char *data, int datalen) {
- if (!phone) return -1;
int bytes = 0;
- if (debug) printf("recv_from_phone(): attempting to receive %i bytes\n", datalen);
+
+ if (!phone) return -1;
+ if (debug) fprintf(stderr, "recv_from_phone(): attempting to receive %i bytes\n", datalen);
+
bytes = usb_bulk_read(phone->device, BULKIN, data, datalen, 3500);
- if(bytes < 0)
- {
- if(debug) printf("recv_from_phone(): libusb gave me the error %d: %s (%s)\n", bytes, usb_strerror(), strerror(-bytes));
+ if (bytes < 0) {
+ if(debug) fprintf(stderr, "recv_from_phone(): libusb gave me the error %d: %s (%s)\n", bytes, usb_strerror(), strerror(-bytes));
return -1;
}
+
return bytes;
}
-