summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Martin Szulecki2014-10-02 16:15:48 +0200
committerGravatar Martin Szulecki2014-10-02 16:15:48 +0200
commit4a9f1c098cdc0e96ceac5bc3bbf6566cad32d7bd (patch)
treeb0a124bbb2af20bb51f7c05bf25e3094572adf1b
parent3b1e983a519d0b4d820109e953d62bebd181c47c (diff)
downloadlibimobiledevice-4a9f1c098cdc0e96ceac5bc3bbf6566cad32d7bd.tar.gz
libimobiledevice-4a9f1c098cdc0e96ceac5bc3bbf6566cad32d7bd.tar.bz2
afc: Implement afc_remove_path_and_contents() for recursive deletion
Only available on iOS 6 and later.
-rw-r--r--include/libimobiledevice/afc.h12
-rw-r--r--src/afc.c24
2 files changed, 36 insertions, 0 deletions
diff --git a/include/libimobiledevice/afc.h b/include/libimobiledevice/afc.h
index 667fd63..b045554 100644
--- a/include/libimobiledevice/afc.h
+++ b/include/libimobiledevice/afc.h
@@ -338,6 +338,18 @@ afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, const c
*/
afc_error_t afc_set_file_time(afc_client_t client, const char *path, uint64_t mtime);
+/**
+ * Deletes a file or directory including possible contents.
+ *
+ * @param client The client to use.
+ * @param path The path to delete. (must be a fully-qualified path)
+ * @since libimobiledevice 1.1.7
+ * @note Only available in iOS 6 and later.
+ *
+ * @return AFC_E_SUCCESS on success or an AFC_E_* error value.
+ */
+afc_error_t afc_remove_path_and_contents(afc_client_t client, const char *path);
+
/* Helper functions */
/**
diff --git a/src/afc.c b/src/afc.c
index 50ac5bf..2e2d62c 100644
--- a/src/afc.c
+++ b/src/afc.c
@@ -998,6 +998,30 @@ afc_error_t afc_set_file_time(afc_client_t client, const char *path, uint64_t mt
return ret;
}
+afc_error_t afc_remove_path_and_contents(afc_client_t client, const char *path)
+{
+ uint32_t bytes = 0;
+ afc_error_t ret = AFC_E_UNKNOWN_ERROR;
+
+ if (!client || !path || !client->afc_packet || !client->parent)
+ return AFC_E_INVALID_ARG;
+
+ afc_lock(client);
+
+ /* Send command */
+ ret = afc_dispatch_packet(client, AFC_OP_REMOVE_PATH_AND_CONTENTS, path, strlen(path)+1, NULL, 0, &bytes);
+ if (ret != AFC_E_SUCCESS) {
+ afc_unlock(client);
+ return AFC_E_NOT_ENOUGH_DATA;
+ }
+ /* Receive response */
+ ret = afc_receive_data(client, NULL, &bytes);
+
+ afc_unlock(client);
+
+ return ret;
+}
+
afc_error_t afc_dictionary_free(char **dictionary)
{
int i = 0;