diff options
-rw-r--r-- | src/conf.c | 32 | ||||
-rw-r--r-- | src/conf.h | 1 | ||||
-rw-r--r-- | src/preflight.c | 25 |
3 files changed, 47 insertions, 11 deletions
@@ -326,6 +326,35 @@ static int config_set_system_buid(const char *system_buid) } /** + * Determines whether a pairing record is present for the given device. + * + * @param udid The device UDID as given by the device. + * + * @return 1 if there's a pairing record for the given udid or 0 otherwise. + */ +int config_has_device_record(const char *udid) +{ + int res = 0; + if (!udid) return 0; + + /* ensure config directory exists */ + config_create_config_dir(); + + /* build file path */ + const char *config_path = config_get_config_dir(); + char *device_record_file = string_concat(config_path, DIR_SEP_S, udid, CONFIG_EXT, NULL); + + struct stat st; + + if ((stat(device_record_file, &st) == 0) && S_ISREG(st.st_mode)) + res = 1; + + free(device_record_file); + + return res; +} + +/** * Reads the BUID from a previously generated configuration file. * * @param system_buid pointer to a variable that will be set to point to a @@ -430,7 +459,8 @@ int config_get_device_record(const char *udid, char **record_data, uint64_t *rec char *device_record_file = string_concat(config_path, DIR_SEP_S, udid, CONFIG_EXT, NULL); /* read file */ - buffer_read_from_filename(device_record_file, record_data, record_size); if (!*record_data) { + buffer_read_from_filename(device_record_file, record_data, record_size); + if (!*record_data) { usbmuxd_log(LL_ERROR, "%s: failed to read '%s': %s", __func__, device_record_file, strerror(errno)); res = -ENOENT; } @@ -31,6 +31,7 @@ const char *config_get_config_dir(); void config_get_system_buid(char **system_buid); +int config_has_device_record(const char *udid); int config_get_device_record(const char *udid, char **record_data, uint64_t *record_size); int config_set_device_record(const char *udid, char* record_data, uint64_t record_size); int config_remove_device_record(const char *udid); diff --git a/src/preflight.c b/src/preflight.c index b011344..5198d8c 100644 --- a/src/preflight.c +++ b/src/preflight.c @@ -161,17 +161,22 @@ retry: int is_device_paired = 0; char *host_id = NULL; - config_device_record_get_host_id(dev->udid, &host_id); - lerr = lockdownd_start_session(lockdown, host_id, NULL, NULL); - free(host_id); - if (lerr == LOCKDOWN_E_SUCCESS) { - usbmuxd_log(LL_INFO, "%s: StartSession success for device %s", __func__, _dev->udid); - usbmuxd_log(LL_INFO, "%s: Finished preflight on device %s", __func__, _dev->udid); - client_device_add(info); - goto leave; - } + if (config_has_device_record(dev->udid)) { + config_device_record_get_host_id(dev->udid, &host_id); + lerr = lockdownd_start_session(lockdown, host_id, NULL, NULL); + if (host_id) + free(host_id); + if (lerr == LOCKDOWN_E_SUCCESS) { + usbmuxd_log(LL_INFO, "%s: StartSession success for device %s", __func__, _dev->udid); + usbmuxd_log(LL_INFO, "%s: Finished preflight on device %s", __func__, _dev->udid); + client_device_add(info); + goto leave; + } - usbmuxd_log(LL_INFO, "%s: StartSession failed on device %s, lockdown error %d", __func__, _dev->udid, lerr); + usbmuxd_log(LL_INFO, "%s: StartSession failed on device %s, lockdown error %d", __func__, _dev->udid, lerr); + } else { + lerr = LOCKDOWN_E_INVALID_HOST_ID; + } switch (lerr) { case LOCKDOWN_E_INVALID_HOST_ID: usbmuxd_log(LL_INFO, "%s: Device %s is not paired with this host.", __func__, _dev->udid); |