summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libiphone/libiphone.h1
-rw-r--r--src/AFC.c49
-rw-r--r--src/AFC.h1
3 files changed, 50 insertions, 1 deletions
diff --git a/include/libiphone/libiphone.h b/include/libiphone/libiphone.h
index 32d47d3..158fd84 100644
--- a/include/libiphone/libiphone.h
+++ b/include/libiphone/libiphone.h
@@ -118,6 +118,7 @@ iphone_error_t iphone_afc_truncate_file ( iphone_afc_client_t client, iphone_afc
iphone_error_t iphone_afc_delete_file ( iphone_afc_client_t client, const char *path);
iphone_error_t iphone_afc_rename_file ( iphone_afc_client_t client, const char *from, const char *to);
iphone_error_t iphone_afc_mkdir ( iphone_afc_client_t client, const char *dir);
+iphone_error_t iphone_afc_truncate(iphone_afc_client_t client, const char *path, off_t newsize);
#ifdef __cplusplus
diff --git a/src/AFC.c b/src/AFC.c
index cd24cc6..dc8fe20 100644
--- a/src/AFC.c
+++ b/src/AFC.c
@@ -179,7 +179,7 @@ static int dispatch_AFC_packet(iphone_afc_client_t client, const char *data, int
log_debug_msg("dispatch_AFC_packet: sent the first now go with the second\n");
log_debug_msg("Length: %i\n", length - offset);
log_debug_msg("Buffer: \n");
- log_debug_msg(data + offset);
+ log_debug_buffer(data + offset, length - offset);
iphone_mux_send(client->connection, data + offset, length - offset, &bytes);
return bytes;
@@ -1017,6 +1017,53 @@ iphone_error_t iphone_afc_truncate_file(iphone_afc_client_t client, iphone_afc_f
}
}
+/** Sets the size of a file on the phone without prior opening it.
+ *
+ * @param client The client to use to set the file size.
+ * @param path The path of the file to be truncated.
+ * @param newsize The size to set the file to.
+ *
+ * @return IPHONE_E_SUCCESS if everything went well, IPHONE_E_INVALID_ARG
+ * if arguments are NULL or invalid, IPHONE_E_NOT_ENOUGH_DATA otherwise.
+ */
+iphone_error_t iphone_afc_truncate(iphone_afc_client_t client, const char *path, off_t newsize)
+{
+ char *response = NULL;
+ char *send = (char *) malloc(sizeof(char) * (strlen(path) + 1 + 8));
+ int bytes = 0;
+ uint64_t size_requested = newsize;
+
+ if (!client || !path || !client->afc_packet || !client->connection)
+ return IPHONE_E_INVALID_ARG;
+
+ afc_lock(client);
+
+ // Send command
+ memcpy(send, &size_requested, 8);
+ memcpy(send + 8, path, strlen(path) + 1);
+ client->afc_packet->entire_length = client->afc_packet->this_length = 0;
+ client->afc_packet->operation = AFC_TRUNCATE;
+ bytes = dispatch_AFC_packet(client, send, 8 + strlen(path));
+ free(send);
+ if (bytes <= 0) {
+ afc_unlock(client);
+ return IPHONE_E_NOT_ENOUGH_DATA;
+ }
+ // Receive response
+ bytes = receive_AFC_data(client, &response);
+ if (response)
+ free(response);
+
+ afc_unlock(client);
+
+ if (bytes < 0) {
+ return IPHONE_E_NOT_ENOUGH_DATA;
+ } else {
+ return IPHONE_E_SUCCESS;
+ }
+}
+
+
uint32 iphone_afc_get_file_handle(iphone_afc_file_t file)
{
return file->filehandle;
diff --git a/src/AFC.h b/src/AFC.h
index 463c13e..de4e071 100644
--- a/src/AFC.h
+++ b/src/AFC.h
@@ -63,6 +63,7 @@ enum {
AFC_LIST_DIR = 0x00000003,
AFC_MAKE_DIR = 0x00000009,
AFC_DELETE = 0x00000008,
+ AFC_TRUNCATE = 0x00000007,
AFC_RENAME = 0x00000018,
AFC_SUCCESS_RESPONSE = 0x00000002,
AFC_FILE_OPEN = 0x0000000d,