summaryrefslogtreecommitdiffstats
path: root/src/libirecovery.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libirecovery.c')
-rw-r--r--src/libirecovery.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/libirecovery.c b/src/libirecovery.c
index b44cea5..b110410 100644
--- a/src/libirecovery.c
+++ b/src/libirecovery.c
@@ -250,7 +250,28 @@ void irecv_set_debug_level(int level) {
}
}
+static irecv_error_t irecv_send_command_raw(irecv_client_t client, unsigned char* command) {
+ unsigned int length = strlen(command);
+ if (length >= 0x100) {
+ length = 0xFF;
+ }
+
+ if (length > 0) {
+ int ret = libusb_control_transfer(client->handle, 0x40, 0, 0, 0, command, length + 1, 100);
+ if (ret < 0) {
+ if (ret == LIBUSB_ERROR_PIPE)
+ return IRECV_E_PIPE;
+
+ return IRECV_E_UNKNOWN_ERROR;
+ }
+ }
+
+ return IRECV_E_SUCCESS;
+}
+
irecv_error_t irecv_send_command(irecv_client_t client, unsigned char* command) {
+ irecv_error_t error = 0;
+
if (client == NULL || client->handle == NULL) {
return IRECV_E_NO_DEVICE;
}
@@ -270,8 +291,11 @@ irecv_error_t irecv_send_command(irecv_client_t client, unsigned char* command)
}
}
- if (length > 0) {
- libusb_control_transfer(client->handle, 0x40, 0, 0, 0, command, length + 1, 100);
+ error = irecv_send_command_raw(client, command);
+ if (error != IRECV_E_SUCCESS) {
+ debug("Failed to send command %s\n", command);
+ if (error != IRECV_E_PIPE)
+ return error;
}
if(client->postcommand_callback != NULL) {
@@ -431,10 +455,11 @@ irecv_error_t irecv_getenv(irecv_client_t client, const char* variable, char** v
memset(command, '\0', sizeof(command));
snprintf(command, sizeof(command)-1, "getenv %s", variable);
- irecv_error_t error = irecv_send_command(client, command);
- if(error != IRECV_E_SUCCESS) {
+ irecv_error_t error = irecv_send_command_raw(client, command);
+ if(error == IRECV_E_PIPE)
+ return IRECV_E_SUCCESS;
+ if(error != IRECV_E_SUCCESS)
return error;
- }
unsigned char* response = (unsigned char*) malloc(256);
if (response == NULL) {
@@ -443,9 +468,8 @@ irecv_error_t irecv_getenv(irecv_client_t client, const char* variable, char** v
memset(response, '\0', 256);
int ret = libusb_control_transfer(client->handle, 0xC0, 0, 0, 0, response, 255, 500);
- if (ret < 0) {
+ if (ret < 0)
return IRECV_E_UNKNOWN_ERROR;
- }
*value = response;
return IRECV_E_SUCCESS;
@@ -563,7 +587,7 @@ irecv_error_t irecv_setenv(irecv_client_t client, const char* variable, const ch
memset(command, '\0', sizeof(command));
snprintf(command, sizeof(command)-1, "setenv %s %s", variable, value);
- irecv_error_t error = irecv_send_command(client, command);
+ irecv_error_t error = irecv_send_command_raw(client, command);
if(error != IRECV_E_SUCCESS) {
return error;
}