From 96238bbe0ad81961b85a392c4b99aee11b17eb26 Mon Sep 17 00:00:00 2001 From: Daniel Ansorregui Date: Thu, 17 Feb 2022 18:40:38 +0000 Subject: [PATCH] Dynamically allocated ADB devices * This fixes connection to farm servers with many more than 16 devices --- app/src/adb/adb.c | 16 +++++++++++++--- app/src/adb/adb_parser.c | 3 ++- app/src/adb/adb_parser.h | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/adb/adb.c b/app/src/adb/adb.c index e415eb4f..81fd3cb8 100644 --- a/app/src/adb/adb.c +++ b/app/src/adb/adb.c @@ -519,9 +519,7 @@ bool sc_adb_select_device(struct sc_intr *intr, const struct sc_adb_device_selector *selector, unsigned flags, struct sc_adb_device *out_device) { - struct sc_adb_device devices[16]; - ssize_t count = - sc_adb_list_devices(intr, flags, devices, ARRAY_LEN(devices)); + ssize_t count = sc_adb_list_devices(intr, flags, NULL, 4096); if (count == -1) { LOGE("Could not list ADB devices"); return false; @@ -532,6 +530,14 @@ sc_adb_select_device(struct sc_intr *intr, return false; } + struct sc_adb_device *devices = malloc(sizeof(struct sc_adb_device) * count); + ssize_t parseCount = sc_adb_list_devices(intr, flags, devices, count); + if (parseCount != count) { + LOGE("Missmatch in second parsing"); + free(devices); + return false; + } + size_t sel_idx; // index of the single matching device if sel_count == 1 size_t sel_count = sc_adb_devices_select(devices, count, selector, &sel_idx); @@ -559,6 +565,7 @@ sc_adb_select_device(struct sc_intr *intr, sc_adb_devices_log(SC_LOG_LEVEL_ERROR, devices, count); sc_adb_devices_destroy_all(devices, count); + free(devices); return false; } @@ -588,6 +595,7 @@ sc_adb_select_device(struct sc_intr *intr, LOGE("Select a device via -s (--serial), -d (--select-usb) or -e " "(--select-tcpip)"); sc_adb_devices_destroy_all(devices, count); + free(devices); return false; } @@ -597,6 +605,7 @@ sc_adb_select_device(struct sc_intr *intr, bool ok = sc_adb_device_check_state(device, devices, count); if (!ok) { sc_adb_devices_destroy_all(devices, count); + free(devices); return false; } @@ -606,6 +615,7 @@ sc_adb_select_device(struct sc_intr *intr, // Move devics into out_device (do not destroy device) sc_adb_device_move(out_device, device); sc_adb_devices_destroy_all(devices, count); + free(devices); return true; } diff --git a/app/src/adb/adb_parser.c b/app/src/adb/adb_parser.c index 85e8ffaf..67a37d7d 100644 --- a/app/src/adb/adb_parser.c +++ b/app/src/adb/adb_parser.c @@ -113,6 +113,7 @@ ssize_t sc_adb_parse_devices(char *str, struct sc_adb_device *devices, size_t devices_len) { size_t dev_count = 0; + struct sc_adb_device scratch_device; #define HEADER "List of devices attached" #define HEADER_LEN (sizeof(HEADER) - 1) @@ -144,7 +145,7 @@ sc_adb_parse_devices(char *str, struct sc_adb_device *devices, size_t line_len = sc_str_remove_trailing_cr(line, len); line[line_len] = '\0'; - bool ok = sc_adb_parse_device(line, &devices[dev_count]); + bool ok = sc_adb_parse_device(line, devices ? &devices[dev_count] : &scratch_device); if (!ok) { continue; } diff --git a/app/src/adb/adb_parser.h b/app/src/adb/adb_parser.h index 65493a2e..84af5c6d 100644 --- a/app/src/adb/adb_parser.h +++ b/app/src/adb/adb_parser.h @@ -11,6 +11,8 @@ * Parse the available devices from the output of `adb devices` * * The parameter must be a NUL-terminated string. + * If a devices is a nullptr it will parse and report the caller + * the amount of devices in ADB. * * Warning: this function modifies the buffer for optimization purposes. */