summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar BALATON Zoltan2016-07-12 23:01:47 +0200
committerGravatar BALATON Zoltan2017-04-08 15:48:07 +0200
commit5a8449a391d2cc848f55cfb4406bad4ded0bd138 (patch)
tree8597f3d58c6fcc5747c805806525ef877ea340d9
parent45fda819e1aae3cacf25a04b9fe22cd6ddc61f5a (diff)
downloadlibimobiledevice-5a8449a391d2cc848f55cfb4406bad4ded0bd138.tar.gz
libimobiledevice-5a8449a391d2cc848f55cfb4406bad4ded0bd138.tar.bz2
Propagate lower level errors to callers instead of returning unknown
error for most failures
-rw-r--r--include/libimobiledevice/lockdown.h2
-rw-r--r--src/idevice.c4
-rw-r--r--src/lockdown.c76
-rw-r--r--src/property_list_service.c4
4 files changed, 46 insertions, 40 deletions
diff --git a/include/libimobiledevice/lockdown.h b/include/libimobiledevice/lockdown.h
index 0e48eef..b5c126c 100644
--- a/include/libimobiledevice/lockdown.h
+++ b/include/libimobiledevice/lockdown.h
@@ -43,7 +43,7 @@ typedef enum {
LOCKDOWN_E_PAIRING_FAILED = -4,
LOCKDOWN_E_SSL_ERROR = -5,
LOCKDOWN_E_DICT_ERROR = -6,
- LOCKDOWN_E_NOT_ENOUGH_DATA = -7,
+ LOCKDOWN_E_RECEIVE_TIMEOUT = -7,
LOCKDOWN_E_MUX_ERROR = -8,
LOCKDOWN_E_NO_RUNNING_SESSION = -9,
/* native */
diff --git a/src/idevice.c b/src/idevice.c
index b6dfe4e..913038e 100644
--- a/src/idevice.c
+++ b/src/idevice.c
@@ -376,8 +376,8 @@ static idevice_error_t internal_connection_receive_timeout(idevice_connection_t
if (connection->type == CONNECTION_USBMUXD) {
int res = usbmuxd_recv_timeout((int)(long)connection->data, data, len, recv_bytes, timeout);
if (res < 0) {
- debug_info("ERROR: usbmuxd_recv_timeout returned %d (%s)", res, strerror(-res));
- return IDEVICE_E_UNKNOWN_ERROR;
+ debug_info("ERROR: usbmuxd_recv_timeout returned %d (%s)", res, strerror(errno));
+ return (res == -EAGAIN ? IDEVICE_E_NOT_ENOUGH_DATA : IDEVICE_E_UNKNOWN_ERROR);
}
return IDEVICE_E_SUCCESS;
} else {
diff --git a/src/lockdown.c b/src/lockdown.c
index cae950b..5251737 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -136,6 +136,36 @@ static lockdownd_error_t lockdownd_strtoerr(const char* name)
}
/**
+ * Convert a property_list_service_error_t value to a lockdownd_error_t
+ * value. Used internally to get correct error codes.
+ *
+ * @param err A property_list_service_error_t error code
+ *
+ * @return A matching lockdownd_error_t error code,
+ * LOCKDOWND_E_UNKNOWN_ERROR otherwise.
+ */
+static lockdownd_error_t lockdownd_error(property_list_service_error_t err)
+{
+ switch (err) {
+ case PROPERTY_LIST_SERVICE_E_SUCCESS:
+ return LOCKDOWN_E_SUCCESS;
+ case PROPERTY_LIST_SERVICE_E_INVALID_ARG:
+ return LOCKDOWN_E_INVALID_ARG;
+ case PROPERTY_LIST_SERVICE_E_PLIST_ERROR:
+ return LOCKDOWN_E_PLIST_ERROR;
+ case PROPERTY_LIST_SERVICE_E_MUX_ERROR:
+ return LOCKDOWN_E_MUX_ERROR;
+ case PROPERTY_LIST_SERVICE_E_SSL_ERROR:
+ return LOCKDOWN_E_SSL_ERROR;
+ case PROPERTY_LIST_SERVICE_E_RECEIVE_TIMEOUT:
+ return LOCKDOWN_E_RECEIVE_TIMEOUT;
+ default:
+ break;
+ }
+ return LOCKDOWN_E_UNKNOWN_ERROR;
+}
+
+/**
* Internally used function for checking the result from lockdown's answer
* plist to a previously sent request.
*
@@ -349,18 +379,8 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_receive(lockdownd_client_t clie
{
if (!client || !plist || (plist && *plist))
return LOCKDOWN_E_INVALID_ARG;
- lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
- property_list_service_error_t err;
-
- err = property_list_service_receive_plist(client->parent, plist);
- if (err != PROPERTY_LIST_SERVICE_E_SUCCESS) {
- ret = LOCKDOWN_E_UNKNOWN_ERROR;
- }
- if (!*plist)
- ret = LOCKDOWN_E_PLIST_ERROR;
-
- return ret;
+ return lockdownd_error(property_list_service_receive_plist(client->parent, plist));
}
LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist)
@@ -368,14 +388,7 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_send(lockdownd_client_t client,
if (!client || !plist)
return LOCKDOWN_E_INVALID_ARG;
- lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
- property_list_service_error_t err;
-
- err = property_list_service_send_xml_plist(client->parent, plist);
- if (err != PROPERTY_LIST_SERVICE_E_SUCCESS) {
- ret = LOCKDOWN_E_UNKNOWN_ERROR;
- }
- return ret;
+ return lockdownd_error(property_list_service_send_xml_plist(client->parent, plist));
}
LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_query_type(lockdownd_client_t client, char **type)
@@ -686,13 +699,11 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_client_new_with_handshake(idevi
}
/* perform handshake */
- if (LOCKDOWN_E_SUCCESS != lockdownd_query_type(client_loc, &type)) {
+ ret = lockdownd_query_type(client_loc, &type);
+ if (LOCKDOWN_E_SUCCESS != ret) {
debug_info("QueryType failed in the lockdownd client.");
- ret = LOCKDOWN_E_NOT_ENOUGH_DATA;
- } else {
- if (strcmp("com.apple.mobile.lockdown", type)) {
- debug_info("Warning QueryType request returned \"%s\".", type);
- }
+ } else if (strcmp("com.apple.mobile.lockdown", type)) {
+ debug_info("Warning QueryType request returned \"%s\".", type);
}
free(type);
@@ -1113,7 +1124,6 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_goodbye(lockdownd_client_t clie
LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_start_session(lockdownd_client_t client, const char *host_id, char **session_id, int *ssl_enabled)
{
lockdownd_error_t ret = LOCKDOWN_E_SUCCESS;
- property_list_service_error_t plret;
plist_t dict = NULL;
if (!client || !host_id)
@@ -1184,20 +1194,14 @@ LIBIMOBILEDEVICE_API lockdownd_error_t lockdownd_start_session(lockdownd_client_
debug_info("Failed to get SessionID!");
}
- debug_info("Enable SSL Session: %s", (use_ssl?"true":"false"));
+ debug_info("Enable SSL Session: %s", (use_ssl ? "true" : "false"));
if (use_ssl) {
- plret = property_list_service_enable_ssl(client->parent);
- if (plret == PROPERTY_LIST_SERVICE_E_SUCCESS) {
- ret = LOCKDOWN_E_SUCCESS;
- client->ssl_enabled = 1;
- } else {
- ret = LOCKDOWN_E_SSL_ERROR;
- client->ssl_enabled = 0;
- }
+ ret = lockdownd_error(property_list_service_enable_ssl(client->parent));
+ client->ssl_enabled = (ret == LOCKDOWN_E_SUCCESS ? 1 : 0);
} else {
- client->ssl_enabled = 0;
ret = LOCKDOWN_E_SUCCESS;
+ client->ssl_enabled = 0;
}
}
diff --git a/src/property_list_service.c b/src/property_list_service.c
index a5bdf9b..f411699 100644
--- a/src/property_list_service.c
+++ b/src/property_list_service.c
@@ -98,7 +98,8 @@ LIBIMOBILEDEVICE_API property_list_service_error_t property_list_service_client_
* @return PROPERTY_LIST_SERVICE_E_SUCCESS on success,
* PROPERTY_LIST_SERVICE_E_INVALID_ARG when one or more parameters are
* invalid, PROPERTY_LIST_SERVICE_E_PLIST_ERROR when dict is not a valid
- * plist, or PROPERTY_LIST_SERVICE_E_UNKNOWN_ERROR when an unspecified
+ * plist, PROPERTY_LIST_SERVICE_E_MUX_ERROR when a communication error
+ * occurs, or PROPERTY_LIST_SERVICE_E_UNKNOWN_ERROR when an unspecified
* error occurs.
*/
static property_list_service_error_t internal_plist_send(property_list_service_client_t client, plist_t plist, int binary)
@@ -140,6 +141,7 @@ static property_list_service_error_t internal_plist_send(property_list_service_c
}
if (bytes <= 0) {
debug_info("ERROR: sending to device failed.");
+ res = PROPERTY_LIST_SERVICE_E_MUX_ERROR;
}
free(content);