idevice_error_t idevice_get_device_list(char ***devices, int *count) { usbmuxd_device_info_t *dev_list; *devices = NULL; *count = 0; int ret=0; if ((ret=usbmuxd_get_device_list(&dev_list)) < 0) { debug_info("ERROR: usbmuxd is not running!", __func__); return IDEVICE_E_NO_DEVICE; } char **newlist = NULL; int i, newcount = 0; for (i = 0; dev_list[i].handle > 0; i++) { newlist = (char**)realloc(*devices, sizeof(char*)* (newcount + 1)); newlist[newcount++] = _strdup(dev_list[i].udid); *devices = newlist; } usbmuxd_device_list_free(&dev_list); *count = newcount; newlist = (char**)realloc(*devices, sizeof(char*)* (newcount + 1)); newlist[newcount] = NULL; *devices = newlist; return IDEVICE_E_SUCCESS; }
/** * Get a list of currently available devices. * * @param devices List of uuids of devices that are currently available. * This list is terminated by a NULL pointer. * @param count Number of devices found. * * @return IPHONE_E_SUCCESS on success or an error value when an error occured. */ iphone_error_t iphone_get_device_list(char ***devices, int *count) { usbmuxd_device_info_t *dev_list; *devices = NULL; *count = 0; if (usbmuxd_get_device_list(&dev_list) < 0) { log_debug_msg("%s: ERROR: usbmuxd is not running!\n", __func__); return IPHONE_E_NO_DEVICE; } char **newlist = NULL; int i, newcount = 0; for (i = 0; dev_list[i].handle > 0; i++) { newlist = realloc(*devices, sizeof(char*) * (newcount+1)); newlist[newcount++] = strdup(dev_list[i].uuid); *devices = newlist; } usbmuxd_device_list_free(&dev_list); *count = newcount; newlist = realloc(*devices, sizeof(char*) * (newcount+1)); newlist[newcount] = NULL; *devices = newlist; return IPHONE_E_SUCCESS; }
static void *acceptor_thread(void *arg) { struct client_data *cdata; usbmuxd_device_info_t *dev_list = NULL; #ifdef WIN32 HANDLE ctos = NULL; #else pthread_t ctos; #endif int count; if (!arg) { fprintf(stderr, "invalid client_data provided!\n"); return NULL; } cdata = (struct client_data*)arg; if ((count = usbmuxd_get_device_list(&dev_list)) < 0) { printf("Connecting to usbmuxd failed, terminating.\n"); free(dev_list); return NULL; } fprintf(stdout, "Number of available devices == %d\n", count); if (dev_list == NULL || dev_list[0].handle == 0) { printf("No connected device found, terminating.\n"); free(dev_list); return NULL; } fprintf(stdout, "Requesting connecion to device handle == %d (serial: %s), port %d\n", dev_list[0].handle, dev_list[0].udid, device_port); cdata->sfd = usbmuxd_connect(dev_list[0].handle, device_port); free(dev_list); if (cdata->sfd < 0) { fprintf(stderr, "Error connecting to device!\n"); } else { cdata->stop_ctos = 0; #ifdef WIN32 ctos = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)run_ctos_loop, cdata, 0, NULL); WaitForSingleObject(ctos, INFINITE); #else pthread_create(&ctos, NULL, run_ctos_loop, cdata); pthread_join(ctos, NULL); #endif } if (cdata->fd > 0) { close(cdata->fd); } if (cdata->sfd > 0) { close(cdata->sfd); } return NULL; }
LIBIMOBILEDEVICE_API idevice_error_t idevice_get_device_list(char ***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; } char **newlist = NULL; int i, newcount = 0; for (i = 0; dev_list[i].handle > 0; i++) { newlist = realloc(*devices, sizeof(char*) * (newcount+1)); const char * connectionType = NULL; switch (dev_list[i].connection_type) { case UC_USB: connectionType = "USB"; break; case UC_WIFI: connectionType = "WIFI"; break; default: connectionType = "unknown"; } size_t devNameLen = strlen(connectionType) + strlen(dev_list[i].udid) + strlen("%s (%s)") + 1; newlist[newcount] = malloc(devNameLen); snprintf(newlist[newcount],devNameLen, "%s (%s)",dev_list[i].udid,connectionType); newcount++; *devices = newlist; } usbmuxd_device_list_free(&dev_list); *count = newcount; newlist = realloc(*devices, sizeof(char*) * (newcount+1)); newlist[newcount] = NULL; *devices = newlist; return IDEVICE_E_SUCCESS; }