summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2019-11-07 23:29:00 +0100
committerGravatar Nikias Bassen2019-11-07 23:29:00 +0100
commit953c13961071a9836430a814159aae33502e2e0c (patch)
tree7b5b03a73007948909d64c8edc56f1079a26b2c9
parent5390060ec90bed0f565698a389cebc57c09c3ac8 (diff)
downloadlibimobiledevice-953c13961071a9836430a814159aae33502e2e0c.tar.gz
libimobiledevice-953c13961071a9836430a814159aae33502e2e0c.tar.bz2
Add new idevice_get_device_list_extended() allowing to list all devices, including network
Instead of just returning a list of UDIDs (like idevice_get_device_list) this function will return idevice_info_t* records which also contains the type of the connection and the connection data.
-rw-r--r--include/libimobiledevice/libimobiledevice.h32
-rw-r--r--src/idevice.c56
2 files changed, 84 insertions, 4 deletions
diff --git a/include/libimobiledevice/libimobiledevice.h b/include/libimobiledevice/libimobiledevice.h
index c1d5460..8bf022a 100644
--- a/include/libimobiledevice/libimobiledevice.h
+++ b/include/libimobiledevice/libimobiledevice.h
@@ -124,25 +124,49 @@ idevice_error_t idevice_event_unsubscribe(void);
/* discovery (synchronous) */
/**
- * Get a list of currently available devices.
+ * Get a list of UDIDs of currently available devices (USBMUX devices only).
*
- * @param devices List of udids of devices that are currently available.
+ * @param devices List of UDIDs of devices that are currently available.
* This list is terminated by a NULL pointer.
* @param count Number of devices found.
*
* @return IDEVICE_E_SUCCESS on success or an error value when an error occurred.
+ *
+ * @note This function only returns the UDIDs of USBMUX devices. To also include
+ * network devices in the list, use idevice_get_device_list_extended().
+ * @see idevice_get_device_list_extended
*/
idevice_error_t idevice_get_device_list(char ***devices, int *count);
/**
- * Free a list of device udids.
+ * Free a list of device UDIDs.
*
- * @param devices List of udids to free.
+ * @param devices List of UDIDs to free.
*
* @return Always returnes IDEVICE_E_SUCCESS.
*/
idevice_error_t idevice_device_list_free(char **devices);
+/**
+ * Get a list of currently available devices
+ *
+ * @param devices List of idevice_info_t records with device information.
+ * This list is terminated by a NULL pointer.
+ * @param count Number of devices included in the list.
+ *
+ * @return IDEVICE_E_SUCCESS on success or an error value when an error occurred.
+ */
+idevice_error_t idevice_get_device_list_extended(idevice_info_t **devices, int *count);
+
+/**
+ * Free an extended device list retrieved through idevice_get_device_list_extended().
+ *
+ * @param devices Device list to free.
+ *
+ * @return IDEVICE_E_SUCCESS on success or an error value when an error occurred.
+ */
+idevice_error_t idevice_device_list_extended_free(idevice_info_t *devices);
+
/* device structure creation and destruction */
/**
diff --git a/src/idevice.c b/src/idevice.c
index d23c5b5..31a8d3a 100644
--- a/src/idevice.c
+++ b/src/idevice.c
@@ -227,6 +227,62 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_event_unsubscribe(void)
return IDEVICE_E_SUCCESS;
}
+LIBIMOBILEDEVICE_API idevice_error_t idevice_get_device_list_extended(idevice_info_t **devices, int *count)
+{
+ usbmuxd_device_info_t *dev_list;
+
+ *devices = NULL;
+ *count = 0;
+
+ if (usbmuxd_get_device_list(&dev_list) < 0) {
+ debug_info("ERROR: usbmuxd is not running!", __func__);
+ return IDEVICE_E_NO_DEVICE;
+ }
+
+ idevice_info_t *newlist = NULL;
+ int i, newcount = 0;
+
+ for (i = 0; dev_list[i].handle > 0; i++) {
+ newlist = realloc(*devices, sizeof(idevice_info_t) * (newcount+1));
+ newlist[newcount] = malloc(sizeof(struct idevice_info));
+ newlist[newcount]->udid = strdup(dev_list[i].udid);
+ if (dev_list[i].conn_type == CONNECTION_TYPE_USB) {
+ newlist[newcount]->conn_type = CONNECTION_USBMUXD;
+ newlist[newcount]->conn_data = NULL;
+ } else if (dev_list[i].conn_type == CONNECTION_TYPE_NETWORK) {
+ newlist[newcount]->conn_type = CONNECTION_NETWORK;
+ size_t addrlen = dev_list[i].conn_data[0];
+ newlist[newcount]->conn_data = malloc(addrlen);
+ memcpy(newlist[newcount]->conn_data, dev_list[i].conn_data, addrlen);
+ }
+ newcount++;
+ *devices = newlist;
+ }
+ usbmuxd_device_list_free(&dev_list);
+
+ *count = newcount;
+ newlist = realloc(*devices, sizeof(idevice_info_t) * (newcount+1));
+ newlist[newcount] = NULL;
+ *devices = newlist;
+
+ return IDEVICE_E_SUCCESS;
+}
+
+LIBIMOBILEDEVICE_API idevice_error_t idevice_device_list_extended_free(idevice_info_t *devices)
+{
+ if (devices) {
+ int i = 0;
+ while (devices[i]) {
+ free(devices[i]->udid);
+ free(devices[i]->conn_data);
+ free(devices[i]);
+ i++;
+ }
+ free(devices);
+ }
+ return IDEVICE_E_SUCCESS;
+}
+
LIBIMOBILEDEVICE_API idevice_error_t idevice_get_device_list(char ***devices, int *count)
{
usbmuxd_device_info_t *dev_list;