diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/afc.c | 213 | ||||
-rw-r--r-- | src/afc.h | 58 | ||||
-rw-r--r-- | src/device_link_service.h | 3 | ||||
-rw-r--r-- | src/idevice.c | 17 | ||||
-rw-r--r-- | src/lockdown.c | 247 | ||||
-rw-r--r-- | src/mobilebackup.c | 31 | ||||
-rw-r--r-- | src/mobilesync.c | 31 | ||||
-rw-r--r-- | src/sbservices.c | 2 | ||||
-rw-r--r-- | src/screenshotr.h | 2 | ||||
-rw-r--r-- | src/userpref.c | 44 |
10 files changed, 416 insertions, 232 deletions
@@ -27,10 +27,11 @@ #include "idevice.h" #include "debug.h" -// This is the maximum size an AFC data packet can be +/** The maximum size an AFC data packet can be */ static const int MAXIMUM_PACKET_SIZE = (2 << 15); -/** Locks an AFC client, done for thread safety stuff +/** + * Locks an AFC client, done for thread safety stuff * * @param client The AFC client connection to lock */ @@ -40,7 +41,8 @@ static void afc_lock(afc_client_t client) g_mutex_lock(client->mutex); } -/** Unlocks an AFC client, done for thread safety stuff. +/** + * Unlocks an AFC client, done for thread safety stuff. * * @param client The AFC */ @@ -50,7 +52,8 @@ static void afc_unlock(afc_client_t client) g_mutex_unlock(client->mutex); } -/** Makes a connection to the AFC service on the phone. +/** + * Makes a connection to the AFC service on the phone. * * @param device The device to connect to. * @param port The destination port. @@ -118,14 +121,15 @@ afc_error_t afc_client_free(afc_client_t client) return AFC_E_SUCCESS; } -/** Dispatches an AFC packet over a client. +/** + * Dispatches an AFC packet over a client. * * @param client The client to send data through. * @param data The data to send. * @param length The length to send. * @param bytes_sent The number of bytes actually sent. * - * @return AFC_E_SUCCESS on success, or an AFC_E_* error value on error. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. * * @warning set client->afc_packet->this_length and * client->afc_packet->entire_length to 0 before calling this. The @@ -153,9 +157,9 @@ static afc_error_t afc_dispatch_packet(afc_client_t client, const char *data, ui if (!client->afc_packet->this_length) { client->afc_packet->this_length = sizeof(AFCPacket); } - // We want to send two segments; buffer+sizeof(AFCPacket) to - // this_length is the parameters - // And everything beyond that is the next packet. (for writing) + /* We want to send two segments; buffer+sizeof(AFCPacket) to this_length + is the parameters and everything beyond that is the next packet. + (for writing) */ if (client->afc_packet->this_length != client->afc_packet->entire_length) { offset = client->afc_packet->this_length - sizeof(AFCPacket); @@ -222,14 +226,14 @@ static afc_error_t afc_dispatch_packet(afc_client_t client, const char *data, ui return AFC_E_INTERNAL_ERROR; } -/** Receives data through an AFC client and sets a variable to the received data. +/** + * Receives data through an AFC client and sets a variable to the received data. * * @param client The client to receive data on. * @param dump_here The char* to point to the newly-received data. * @param bytes_recv How much data was received. * - * @return AFC_E_SUCCESS when data has been received, or an AFC_E_* error value - * when an error occured. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ static afc_error_t afc_receive_data(afc_client_t client, char **dump_here, uint32_t *bytes_recv) { @@ -371,6 +375,9 @@ static afc_error_t afc_receive_data(afc_client_t client, char **dump_here, uint3 return AFC_E_SUCCESS; } +/** + * Returns counts of null characters within a string. + */ static uint32_t count_nullspaces(char *string, uint32_t number) { uint32_t i = 0, nulls = 0; @@ -412,13 +419,15 @@ static char **make_strings_list(char *tokens, uint32_t length) return list; } -/** Gets a directory listing of the directory requested. +/** + * Gets a directory listing of the directory requested. * * @param client The client to get a directory listing from. * @param dir The directory to list. (must be a fully-qualified path) + * @param list A char list of files in that directory, terminated by an empty + * string or NULL if there was an error. * - * @return A char ** list of files in that directory, terminated by an empty - * string for now or NULL if there was an error. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ afc_error_t afc_read_directory(afc_client_t client, const char *dir, char ***list) { @@ -431,7 +440,7 @@ afc_error_t afc_read_directory(afc_client_t client, const char *dir, char ***lis afc_lock(client); - // Send the command + /* Send the command */ client->afc_packet->operation = AFC_OP_READ_DIR; client->afc_packet->entire_length = 0; client->afc_packet->this_length = 0; @@ -440,13 +449,13 @@ afc_error_t afc_read_directory(afc_client_t client, const char *dir, char ***lis afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive the data + /* Receive the data */ ret = afc_receive_data(client, &data, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return ret; } - // Parse the data + /* Parse the data */ list_loc = make_strings_list(data, bytes); if (data) free(data); @@ -457,12 +466,16 @@ afc_error_t afc_read_directory(afc_client_t client, const char *dir, char ***lis return ret; } -/** Get device info for a client connection to phone. (free space on disk, etc.) +/** + * Get device info for a client connection to phone. The device information + * returned is the device model as well as the free space, the total capacity + * and blocksize on the accessed disk partition. * * @param client The client to get device info for. + * @param infos A char ** list of parameters as given by AFC or NULL if there + * was an error. * - * @return A char ** list of parameters as given by AFC or NULL if there was an - * error. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ afc_error_t afc_get_device_info(afc_client_t client, char ***infos) { @@ -475,7 +488,7 @@ afc_error_t afc_get_device_info(afc_client_t client, char ***infos) afc_lock(client); - // Send the command + /* Send the command */ client->afc_packet->operation = AFC_OP_GET_DEVINFO; client->afc_packet->entire_length = client->afc_packet->this_length = 0; ret = afc_dispatch_packet(client, NULL, 0, &bytes); @@ -483,13 +496,13 @@ afc_error_t afc_get_device_info(afc_client_t client, char ***infos) afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive the data + /* Receive the data */ ret = afc_receive_data(client, &data, &bytes); if (ret != AFC_E_SUCCESS) { afc_unlock(client); return ret; } - // Parse the data + /* Parse the data */ list = make_strings_list(data, bytes); if (data) free(data); @@ -501,7 +514,8 @@ afc_error_t afc_get_device_info(afc_client_t client, char ***infos) return ret; } -/** Get a specific key of the device info list for a client connection. +/** + * Get a specific key of the device info list for a client connection. * Known key values are: Model, FSTotalBytes, FSFreeBytes and FSBlockSize. * This is a helper function for afc_get_device_info(). * @@ -536,7 +550,8 @@ afc_error_t afc_get_device_info_key(afc_client_t client, const char *key, char * return ret; } -/** Deletes a file or directory. +/** + * Deletes a file or directory. * * @param client The client to use. * @param path The path to delete. (must be a fully-qualified path) @@ -554,7 +569,7 @@ afc_error_t afc_remove_path(afc_client_t client, const char *path) afc_lock(client); - // Send command + /* Send command */ client->afc_packet->this_length = client->afc_packet->entire_length = 0; client->afc_packet->operation = AFC_OP_REMOVE_PATH; ret = afc_dispatch_packet(client, path, strlen(path)+1, &bytes); @@ -562,7 +577,7 @@ afc_error_t afc_remove_path(afc_client_t client, const char *path) afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &response, &bytes); if (response) free(response); @@ -576,7 +591,8 @@ afc_error_t afc_remove_path(afc_client_t client, const char *path) return ret; } -/** Renames a file or directory on the phone. +/** + * Renames a file or directory on the phone. * * @param client The client to have rename. * @param from The name to rename from. (must be a fully-qualified path) @@ -596,7 +612,7 @@ afc_error_t afc_rename_path(afc_client_t client, const char *from, const char *t afc_lock(client); - // Send command + /* Send command */ memcpy(send, from, strlen(from) + 1); memcpy(send + strlen(from) + 1, to, strlen(to) + 1); client->afc_packet->entire_length = client->afc_packet->this_length = 0; @@ -607,7 +623,7 @@ afc_error_t afc_rename_path(afc_client_t client, const char *from, const char *t afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &response, &bytes); if (response) free(response); @@ -617,7 +633,8 @@ afc_error_t afc_rename_path(afc_client_t client, const char *from, const char *t return ret; } -/** Creates a directory on the phone. +/** + * Creates a directory on the phone. * * @param client The client to use to make a directory. * @param dir The directory's path. (must be a fully-qualified path, I assume @@ -636,7 +653,7 @@ afc_error_t afc_make_directory(afc_client_t client, const char *dir) afc_lock(client); - // Send command + /* Send command */ client->afc_packet->operation = AFC_OP_MAKE_DIR; client->afc_packet->this_length = client->afc_packet->entire_length = 0; ret = afc_dispatch_packet(client, dir, strlen(dir)+1, &bytes); @@ -644,7 +661,7 @@ afc_error_t afc_make_directory(afc_client_t client, const char *dir) afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &response, &bytes); if (response) free(response); @@ -654,7 +671,8 @@ afc_error_t afc_make_directory(afc_client_t client, const char *dir) return ret; } -/** Gets information about a specific file. +/** + * Gets information about a specific file. * * @param client The client to use to get the information of the file. * @param path The fully-qualified path to the file. @@ -662,8 +680,7 @@ afc_error_t afc_make_directory(afc_client_t client, const char *dir) * list of strings with the file information. * Set to NULL before calling this function. * - * @return AFC_E_SUCCESS on success or an AFC_E_* error value - * when something went wrong. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***infolist) { @@ -676,7 +693,7 @@ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***inf afc_lock(client); - // Send command + /* Send command */ client->afc_packet->operation = AFC_OP_GET_FILE_INFO; client->afc_packet->entire_length = client->afc_packet->this_length = 0; ret = afc_dispatch_packet(client, path, strlen(path)+1, &bytes); @@ -685,7 +702,7 @@ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***inf return AFC_E_NOT_ENOUGH_DATA; } - // Receive data + /* Receive data */ ret = afc_receive_data(client, &received, &bytes); if (received) { *infolist = make_strings_list(received, bytes); @@ -697,7 +714,8 @@ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***inf return ret; } -/** Opens a file on the phone. +/** + * Opens a file on the phone. * * @param client The client to use to open the file. * @param filename The file to open. (must be a fully-qualified path) @@ -707,7 +725,7 @@ afc_error_t afc_get_file_info(afc_client_t client, const char *path, char ***inf * destroying anything previously there. * @param handle Pointer to a uint64_t that will hold the handle of the file * - * @return AFC_E_SUCCESS on success or an AFC_E_* error on failure. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ idevice_error_t afc_file_open(afc_client_t client, const char *filename, @@ -718,7 +736,7 @@ afc_file_open(afc_client_t client, const char *filename, char *data = (char *) malloc(sizeof(char) * (8 + strlen(filename) + 1)); afc_error_t ret = AFC_E_UNKNOWN_ERROR; - // set handle to 0 so in case an error occurs, the handle is invalid + /* set handle to 0 so in case an error occurs, the handle is invalid */ *handle = 0; if (!client || !client->connection || !client->afc_packet) @@ -726,7 +744,7 @@ afc_file_open(afc_client_t client, const char *filename, afc_lock(client); - // Send command + /* Send command */ memcpy(data, &file_mode_loc, 8); memcpy(data + 8, filename, strlen(filename)); data[8 + strlen(filename)] = '\0'; @@ -740,12 +758,12 @@ afc_file_open(afc_client_t client, const char *filename, afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive the data + /* Receive the data */ ret = afc_receive_data(client, &data, &bytes); if ((ret == AFC_E_SUCCESS) && (bytes > 0) && data) { afc_unlock(client); - // Get the file handle + /* Get the file handle */ memcpy(handle, data, sizeof(uint64_t)); free(data); return ret; @@ -758,7 +776,8 @@ afc_file_open(afc_client_t client, const char *filename, return ret; } -/** Attempts to the read the given number of bytes from the given file. +/** + * Attempts to the read the given number of bytes from the given file. * * @param client The relevant AFC client * @param handle File handle of a previously opened file @@ -766,7 +785,7 @@ afc_file_open(afc_client_t client, const char *filename, * @param length The number of bytes to read * @param bytes_read The number of bytes actually read. * - * @return AFC_E_SUCCESS on success or an AFC_E_* error value on error. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ idevice_error_t afc_file_read(afc_client_t client, uint64_t handle, char *data, uint32_t length, uint32_t *bytes_read) @@ -782,12 +801,12 @@ afc_file_read(afc_client_t client, uint64_t handle, char *data, uint32_t length, afc_lock(client); - // Looping here to get around the maximum amount of data that - // afc_receive_data can handle + /* Looping here to get around the maximum amount of data that + afc_receive_data can handle */ while (current_count < length) { debug_info("current count is %i but length is %i", current_count, length); - // Send the read command + /* Send the read command */ AFCFilePacket *packet = (AFCFilePacket *) malloc(sizeof(AFCFilePacket)); packet->filehandle = handle; packet->size = GUINT64_TO_LE(((length - current_count) < MAXIMUM_READ_SIZE) ? (length - current_count) : MAXIMUM_READ_SIZE); @@ -800,7 +819,7 @@ afc_file_read(afc_client_t client, uint64_t handle, char *data, uint32_t length, afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive the data + /* Receive the data */ ret = afc_receive_data(client, &input, &bytes_loc); debug_info("afc_receive_data returned error: %d", ret); debug_info("bytes returned: %i", bytes_loc); @@ -831,7 +850,8 @@ afc_file_read(afc_client_t client, uint64_t handle, char *data, uint32_t length, return ret; } -/** Writes a given number of bytes to a file. +/** + * Writes a given number of bytes to a file. * * @param client The client to use to write to the file. * @param handle File handle of previously opened file. @@ -839,7 +859,7 @@ afc_file_read(afc_client_t client, uint64_t handle, char *data, uint32_t length, * @param length How much data to write. * @param bytes_written The number of bytes actually written to the file. * - * @return AFC_E_SUCCESS on success, or an AFC_E_* error value on error. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ idevice_error_t afc_file_write(afc_client_t client, uint64_t handle, const char *data, uint32_t length, uint32_t *bytes_written) @@ -859,9 +879,9 @@ afc_file_write(afc_client_t client, uint64_t handle, const char *data, uint32_t debug_info("Write length: %i", length); - // Divide the file into segments. + /* Divide the file into segments. */ for (i = 0; i < segments; i++) { - // Send the segment + /* Send the segment */ client->afc_packet->this_length = sizeof(AFCPacket) + 8; client->afc_packet->entire_length = client->afc_packet->this_length + MAXIMUM_WRITE_SIZE; client->afc_packet->operation = AFC_OP_WRITE; @@ -886,10 +906,9 @@ afc_file_write(afc_client_t client, uint64_t handle, const char *data, uint32_t } } - // By this point, we should be at the end. i.e. the last segment that - // didn't get sent in the for loop - // this length is fine because it's always sizeof(AFCPacket) + 8, but - // to be sure we do it again + /* By this point, we should be at the end. i.e. the last segment that didn't + get sent in the for loop. This length is fine because it's always + sizeof(AFCPacket) + 8, but to be sure we do it again */ if (current_count == length) { afc_unlock(client); *bytes_written = current_count; @@ -925,7 +944,8 @@ afc_file_write(afc_client_t client, uint64_t handle, const char *data, uint32_t return ret; } -/** Closes a file on the phone. +/** + * Closes a file on the phone. * * @param client The client to close the file with. * @param handle File handle of a previously opened file. @@ -943,7 +963,7 @@ afc_error_t afc_file_close(afc_client_t client, uint64_t handle) debug_info("File handle %i", handle); - // Send command + /* Send command */ memcpy(buffer, &handle, sizeof(uint64_t)); client->afc_packet->operation = AFC_OP_FILE_CLOSE; client->afc_packet->entire_length = client->afc_packet->this_length = 0; @@ -956,7 +976,7 @@ afc_error_t afc_file_close(afc_client_t client, uint64_t handle) return AFC_E_UNKNOWN_ERROR; } - // Receive the response + /* Receive the response */ ret = afc_receive_data(client, &buffer, &bytes); if (buffer) free(buffer); @@ -966,7 +986,8 @@ afc_error_t afc_file_close(afc_client_t client, uint64_t handle) return ret; } -/** Locks or unlocks a file on the phone. +/** + * Locks or unlocks a file on the phone. * * makes use of flock on the device, see * http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/flock.2.html @@ -991,7 +1012,7 @@ afc_error_t afc_file_lock(afc_client_t client, uint64_t handle, afc_lock_op_t op debug_info("file handle %i", handle); - // Send command + /* Send command */ memcpy(buffer, &handle, sizeof(uint64_t)); memcpy(buffer + 8, &op, 8); @@ -1006,7 +1027,7 @@ afc_error_t afc_file_lock(afc_client_t client, uint64_t handle, afc_lock_op_t op debug_info("could not send lock command"); return AFC_E_UNKNOWN_ERROR; } - // Receive the response + /* Receive the response */ ret = afc_receive_data(client, &buffer, &bytes); if (buffer) { debug_buffer(buffer, bytes); @@ -1017,14 +1038,15 @@ afc_error_t afc_file_lock(afc_client_t client, uint64_t handle, afc_lock_op_t op return ret; } -/** Seeks to a given position of a pre-opened file on the phone. +/** + * Seeks to a given position of a pre-opened file on the phone. * * @param client The client to use to seek to the position. * @param handle File handle of a previously opened. * @param offset Seek offset. * @param whence Seeking direction, one of SEEK_SET, SEEK_CUR, or SEEK_END. * - * @return AFC_E_SUCCESS on success, AFC_E_NOT_ENOUGH_DATA on failure. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ afc_error_t afc_file_seek(afc_client_t client, uint64_t handle, int64_t offset, int whence) { @@ -1039,10 +1061,10 @@ afc_error_t afc_file_seek(afc_client_t client, uint64_t handle, int64_t offset, afc_lock(client); - // Send the command - memcpy(buffer, &handle, sizeof(uint64_t)); // handle - memcpy(buffer + 8, &whence_loc, sizeof(uint64_t)); // fromwhere - memcpy(buffer + 16, &offset_loc, sizeof(uint64_t)); // offset + /* Send the command */ + memcpy(buffer, &handle, sizeof(uint64_t)); /* handle */ + memcpy(buffer + 8, &whence_loc, sizeof(uint64_t)); /* fromwhere */ + memcpy(buffer + 16, &offset_loc, sizeof(uint64_t)); /* offset */ client->afc_packet->operation = AFC_OP_FILE_SEEK; client->afc_packet->this_length = client->afc_packet->entire_length = 0; ret = afc_dispatch_packet(client, buffer, 24, &bytes); @@ -1053,7 +1075,7 @@ afc_error_t afc_file_seek(afc_client_t client, uint64_t handle, int64_t offset, afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &buffer, &bytes); if (buffer) free(buffer); @@ -1063,13 +1085,14 @@ afc_error_t afc_file_seek(afc_client_t client, uint64_t handle, int64_t offset, return ret; } -/** Returns current position in a pre-opened file on the phone. +/** + * Returns current position in a pre-opened file on the phone. * * @param client The client to use. * @param handle File handle of a previously opened file. * @param position Position in bytes of indicator * - * @return AFC_E_SUCCESS on success, AFC_E_NOT_ENOUGH_DATA on failure. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. */ afc_error_t afc_file_tell(afc_client_t client, uint64_t handle, uint64_t *position) { @@ -1082,8 +1105,8 @@ afc_error_t afc_file_tell(afc_client_t client, uint64_t handle, uint64_t *positi afc_lock(client); - // Send the command - memcpy(buffer, &handle, sizeof(uint64_t)); // handle + /* Send the command */ + memcpy(buffer, &handle, sizeof(uint64_t)); /* handle */ client->afc_packet->operation = AFC_OP_FILE_TELL; client->afc_packet->this_length = client->afc_packet->entire_length = 0; ret = afc_dispatch_packet(client, buffer, 8, &bytes); @@ -1095,7 +1118,7 @@ afc_error_t afc_file_tell(afc_client_t client, uint64_t handle, uint64_t *positi return AFC_E_NOT_ENOUGH_DATA; } - // Receive the data + /* Receive the data */ ret = afc_receive_data(client, &buffer, &bytes); if (bytes > 0 && buffer) { /* Get the position */ @@ -1110,13 +1133,14 @@ afc_error_t afc_file_tell(afc_client_t client, uint64_t handle, uint64_t *positi return ret; } -/** Sets the size of a file on the phone. +/** + * Sets the size of a file on the phone. * * @param client The client to use to set the file size. * @param handle File handle of a previously opened file. * @param newsize The size to set the file to. * - * @return 0 on success, -1 on failure. + * @return AFC_E_SUCCESS on success or an AFC_E_* error value. * * @note This function is more akin to ftruncate than truncate, and truncate * calls would have to open the file before calling this, sadly. @@ -1133,9 +1157,9 @@ afc_error_t afc_file_truncate(afc_client_t client, uint64_t handle, uint64_t new afc_lock(client); - // Send command - memcpy(buffer, &handle, sizeof(uint64_t)); // handle - memcpy(buffer + 8, &newsize_loc, sizeof(uint64_t)); // newsize + /* Send command */ + memcpy(buffer, &handle, sizeof(uint64_t)); /* handle */ + memcpy(buffer + 8, &newsize_loc, sizeof(uint64_t)); /* newsize */ client->afc_packet->operation = AFC_OP_FILE_SET_SIZE; client->afc_packet->this_length = client->afc_packet->entire_length = 0; ret = afc_dispatch_packet(client, buffer, 16, &bytes); @@ -1146,7 +1170,7 @@ afc_error_t afc_file_truncate(afc_client_t client, uint64_t handle, uint64_t new afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &buffer, &bytes); if (buffer) free(buffer); @@ -1156,7 +1180,8 @@ afc_error_t afc_file_truncate(afc_client_t client, uint64_t handle, uint64_t new return ret; } -/** Sets the size of a file on the phone without prior opening it. +/** + * 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. @@ -1177,7 +1202,7 @@ afc_error_t afc_truncate(afc_client_t client, const char *path, uint64_t newsize afc_lock(client); - // Send command + /* 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; @@ -1188,7 +1213,7 @@ afc_error_t afc_truncate(afc_client_t client, const char *path, uint64_t newsize afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &response, &bytes); if (response) free(response); @@ -1198,10 +1223,11 @@ afc_error_t afc_truncate(afc_client_t client, const char *path, uint64_t newsize return ret; } -/** Creates a hard link or symbolic link on the device. +/** + * Creates a hard link or symbolic link on the device. * * @param client The client to use for making a link - * @param type 1 = hard link, 2 = symlink + * @param linktype 1 = hard link, 2 = symlink * @param target The file to be linked. * @param linkname The name of link. * @@ -1224,7 +1250,7 @@ afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, const c debug_info("target: %s, length:%d", target, strlen(target)); debug_info("linkname: %s, length:%d", linkname, strlen(linkname)); - // Send command + /* Send command */ memcpy(send, &type, 8); memcpy(send + 8, target, strlen(target) + 1); memcpy(send + 8 + strlen(target) + 1, linkname, strlen(linkname) + 1); @@ -1236,7 +1262,7 @@ afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, const c afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &response, &bytes); if (response) free(response); @@ -1246,7 +1272,8 @@ afc_error_t afc_make_link(afc_client_t client, afc_link_type_t linktype, const c return ret; } -/** Sets the modification time of a file on the phone. +/** + * Sets the modification time of a file on the phone. * * @param client The client to use to set the file size. * @param path Path of the file for which the modification time should be set. @@ -1267,7 +1294,7 @@ afc_error_t afc_set_file_time(afc_client_t client, const char *path, uint64_t mt afc_lock(client); - // Send command + /* Send command */ memcpy(send, &mtime_loc, 8); memcpy(send + 8, path, strlen(path) + 1); client->afc_packet->entire_length = client->afc_packet->this_length = 0; @@ -1278,7 +1305,7 @@ afc_error_t afc_set_file_time(afc_client_t client, const char *path, uint64_t mt afc_unlock(client); return AFC_E_NOT_ENOUGH_DATA; } - // Receive response + /* Receive response */ ret = afc_receive_data(client, &response, &bytes); if (response) free(response); @@ -62,34 +62,34 @@ struct afc_client_private { /* AFC Operations */ enum { - AFC_OP_STATUS = 0x00000001, // Status - AFC_OP_DATA = 0x00000002, // Data - AFC_OP_READ_DIR = 0x00000003, // ReadDir - AFC_OP_READ_FILE = 0x00000004, // ReadFile - AFC_OP_WRITE_FILE = 0x00000005, // WriteFile - AFC_OP_WRITE_PART = 0x00000006, // WritePart - AFC_OP_TRUNCATE = 0x00000007, // TruncateFile - AFC_OP_REMOVE_PATH = 0x00000008, // RemovePath - AFC_OP_MAKE_DIR = 0x00000009, // MakeDir - AFC_OP_GET_FILE_INFO = 0x0000000a, // GetFileInfo - AFC_OP_GET_DEVINFO = 0x0000000b, // GetDeviceInfo - AFC_OP_WRITE_FILE_ATOM = 0x0000000c, // WriteFileAtomic (tmp file+rename) - AFC_OP_FILE_OPEN = 0x0000000d, // FileRefOpen - AFC_OP_FILE_OPEN_RES = 0x0000000e, // FileRefOpenResult - AFC_OP_READ = 0x0000000f, // FileRefRead - AFC_OP_WRITE = 0x00000010, // FileRefWrite - AFC_OP_FILE_SEEK = 0x00000011, // FileRefSeek - AFC_OP_FILE_TELL = 0x00000012, // FileRefTell - AFC_OP_FILE_TELL_RES = 0x00000013, // FileRefTellResult - AFC_OP_FILE_CLOSE = 0x00000014, // FileRefClose - AFC_OP_FILE_SET_SIZE = 0x00000015, // FileRefSetFileSize (ftruncate) - AFC_OP_GET_CON_INFO = 0x00000016, // GetConnectionInfo - AFC_OP_SET_CON_OPTIONS = 0x00000017, // SetConnectionOptions - AFC_OP_RENAME_PATH = 0x00000018, // RenamePath - AFC_OP_SET_FS_BS = 0x00000019, // SetFSBlockSize (0x800000) - AFC_OP_SET_SOCKET_BS = 0x0000001A, // SetSocketBlockSize (0x800000) - AFC_OP_FILE_LOCK = 0x0000001B, // FileRefLock - AFC_OP_MAKE_LINK = 0x0000001C, // MakeLink - AFC_OP_SET_FILE_TIME = 0x0000001E // set st_mtime + AFC_OP_STATUS = 0x00000001, /* Status */ + AFC_OP_DATA = 0x00000002, /* Data */ + AFC_OP_READ_DIR = 0x00000003, /* ReadDir */ + AFC_OP_READ_FILE = 0x00000004, /* ReadFile */ + AFC_OP_WRITE_FILE = 0x00000005, /* WriteFile */ + AFC_OP_WRITE_PART = 0x00000006, /* WritePart */ + AFC_OP_TRUNCATE = 0x00000007, /* TruncateFile */ + AFC_OP_REMOVE_PATH = 0x00000008, /* RemovePath */ + AFC_OP_MAKE_DIR = 0x00000009, /* MakeDir */ + AFC_OP_GET_FILE_INFO = 0x0000000a, /* GetFileInfo */ + AFC_OP_GET_DEVINFO = 0x0000000b, /* GetDeviceInfo */ + AFC_OP_WRITE_FILE_ATOM = 0x0000000c, /* WriteFileAtomic (tmp file+rename) */ + AFC_OP_FILE_OPEN = 0x0000000d, /* FileRefOpen */ + AFC_OP_FILE_OPEN_RES = 0x0000000e, /* FileRefOpenResult */ + AFC_OP_READ = 0x0000000f, /* FileRefRead */ + AFC_OP_WRITE = 0x00000010, /* FileRefWrite */ + AFC_OP_FILE_SEEK = 0x00000011, /* FileRefSeek */ + AFC_OP_FILE_TELL = 0x00000012, /* FileRefTell */ + AFC_OP_FILE_TELL_RES = 0x00000013, /* FileRefTellResult */ + AFC_OP_FILE_CLOSE = 0x00000014, /* FileRefClose */ + AFC_OP_FILE_SET_SIZE = 0x00000015, /* FileRefSetFileSize (ftruncate) */ + AFC_OP_GET_CON_INFO = 0x00000016, /* GetConnectionInfo */ + AFC_OP_SET_CON_OPTIONS = 0x00000017, /* SetConnectionOptions */ + AFC_OP_RENAME_PATH = 0x00000018, /* RenamePath */ + AFC_OP_SET_FS_BS = 0x00000019, /* SetFSBlockSize (0x800000) */ + AFC_OP_SET_SOCKET_BS = 0x0000001A, /* SetSocketBlockSize (0x800000) */ + AFC_OP_FILE_LOCK = 0x0000001B, /* FileRefLock */ + AFC_OP_MAKE_LINK = 0x0000001C, /* MakeLink */ + AFC_OP_SET_FILE_TIME = 0x0000001E /* set st_mtime */ }; diff --git a/src/device_link_service.h b/src/device_link_service.h index c80686d..8b58ccf 100644 --- a/src/device_link_service.h +++ b/src/device_link_service.h @@ -32,12 +32,13 @@ #define DEVICE_LINK_SERVICE_E_UNKNOWN_ERROR -256 +/** Represents an error code. */ +typedef int16_t device_link_service_error_t; struct device_link_service_client_private { property_list_service_client_t parent; }; -typedef int16_t device_link_service_error_t; typedef struct device_link_service_client_private *device_link_service_client_t; device_link_service_error_t device_link_service_client_new(idevice_t device, uint16_t port, device_link_service_client_t *client); diff --git a/src/idevice.c b/src/idevice.c index 0bdf3f5..b72b623 100644 --- a/src/idevice.c +++ b/src/idevice.c @@ -172,7 +172,8 @@ idevice_error_t idevice_new(idevice_t * device, const char *uuid) return IDEVICE_E_NO_DEVICE; } -/** Cleans up an idevice structure, then frees the structure itself. +/** + * Cleans up an idevice structure, then frees the structure itself. * This is a library-level function; deals directly with the device to tear * down relations, but otherwise is mostly internal. * @@ -422,6 +423,9 @@ idevice_error_t idevice_connection_receive(idevice_connection_t connection, char return internal_connection_receive(connection, data, len, recv_bytes); } +/** + * Gets the handle of the device. Depends on the connection type. + */ idevice_error_t idevice_get_handle(idevice_t device, uint32_t *handle) { if (!device) @@ -436,6 +440,9 @@ idevice_error_t idevice_get_handle(idevice_t device, uint32_t *handle) return IDEVICE_E_UNKNOWN_ERROR; } +/** + * Gets the unique id for the device. + */ idevice_error_t idevice_get_uuid(idevice_t device, char **uuid) { if (!device) @@ -469,10 +476,10 @@ static ssize_t internal_ssl_read(gnutls_transport_ptr_t transport, char *buffer, } debug_info("post-read we got %i bytes", bytes); - // increase read count + /* increase read count */ tbytes += bytes; - // fill the buffer with what we got right now + /* fill the buffer with what we got right now */ memcpy(buffer + pos_start_fill, recv_buffer, bytes); pos_start_fill += bytes; @@ -538,7 +545,7 @@ idevice_error_t idevice_connection_enable_ssl(idevice_connection_t connection) ssl_data_t ssl_data_loc = (ssl_data_t)malloc(sizeof(struct ssl_data_private)); - // Set up GnuTLS... + /* Set up GnuTLS... */ debug_info("enabling SSL mode"); errno = 0; gnutls_global_init(); @@ -558,7 +565,7 @@ idevice_error_t idevice_connection_enable_ssl(idevice_connection_t connection) gnutls_protocol_set_priority(ssl_data_loc->session, protocol_priority); gnutls_mac_set_priority(ssl_data_loc->session, mac_priority); } - gnutls_credentials_set(ssl_data_loc->session, GNUTLS_CRD_CERTIFICATE, ssl_data_loc->certificate); // this part is killing me. + gnutls_credentials_set(ssl_data_loc->session, GNUTLS_CRD_CERTIFICATE, ssl_data_loc->certificate); /* this part is killing me. */ debug_info("GnuTLS step 1..."); gnutls_transport_set_ptr(ssl_data_loc->session, (gnutls_transport_ptr_t)connection); diff --git a/src/lockdown.c b/src/lockdown.c index 25a6c6a..515c58e 100644 --- a/src/lockdown.c +++ b/src/lockdown.c @@ -1,6 +1,6 @@ /* * lockdown.c - * libimobiledevice built-in lockdownd client + * com.apple.mobile.lockdownd service implementation. * * Copyright (c) 2008 Zach C. All Rights Reserved. * @@ -124,15 +124,14 @@ static void plist_dict_add_label(plist_t plist, const char *label) } /** - * Closes the lockdownd communication session, by sending the StopSession - * Request to the device. + * Closes the lockdownd session by sending the StopSession request. * * @see lockdownd_start_session * - * @param control The lockdown client + * @param client The lockdown client * @param session_id The id of a running session * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client, const char *session_id) { @@ -178,11 +177,13 @@ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client, const char * return ret; } -/** Closes the lockdownd client and does the necessary housekeeping. +/** + * Closes the lockdownd client session if one is running and frees up the + * lockdownd_client struct. * * @param client The lockdown client * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_client_free(lockdownd_client_t client) { @@ -229,12 +230,14 @@ void lockdownd_client_set_label(lockdownd_client_t client, const char *label) } } -/** Polls the device for lockdownd data. +/** + * Receives a plist from lockdownd. * - * @param control The lockdownd client + * @param client The lockdownd client * @param plist The plist to store the received data * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client or + * plist is NULL */ lockdownd_error_t lockdownd_receive(lockdownd_client_t client, plist_t *plist) { @@ -254,7 +257,8 @@ lockdownd_error_t lockdownd_receive(lockdownd_client_t client, plist_t *plist) return ret; } -/** Sends lockdownd data to the device +/** + * Sends a plist to lockdownd. * * @note This function is low-level and should only be used if you need to send * a new type of message. @@ -262,7 +266,8 @@ lockdownd_error_t lockdownd_receive(lockdownd_client_t client, plist_t *plist) * @param client The lockdownd client * @param plist The plist to send * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client or + * plist is NULL */ lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist) { @@ -279,13 +284,14 @@ lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist) return ret; } -/** Query the type of the service daemon. Depending on whether the device is +/** + * Query the type of the service daemon. Depending on whether the device is * queried in normal mode or restore mode, different types will be returned. * * @param client The lockdownd client - * @param type The type returned by the service daemon. Can be NULL to ignore. + * @param type The type returned by the service daemon. Pass NULL to ignore. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_query_type(lockdownd_client_t client, char **type) { @@ -325,14 +331,15 @@ lockdownd_error_t lockdownd_query_type(lockdownd_client_t client, char **type) return ret; } -/** Retrieves a preferences plist using an optional domain and/or key name. +/** + * Retrieves a preferences plist using an optional domain and/or key name. * - * @param client an initialized lockdownd client. - * @param domain the domain to query on or NULL for global domain - * @param key the key name to request or NULL to query for all keys - * @param value a plist node representing the result value node + * @param client An initialized lockdownd client. + * @param domain The domain to query on or NULL for global domain + * @param key The key name to request or NULL to query for all keys + * @param value A plist node representing the result value node * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_get_value(lockdownd_client_t client, const char *domain, const char *key, plist_t *value) { @@ -387,14 +394,16 @@ lockdownd_error_t lockdownd_get_value(lockdownd_client_t client, const char *dom return ret; } -/** Sets a preferences value using a plist and optional domain and/or key name. +/** + * Sets a preferences value using a plist and optional by domain and/or key name. * * @param client an initialized lockdownd client. * @param domain the domain to query on or NULL for global domain * @param key the key name to set the value or NULL to set a value dict plist * @param value a plist node of any node type representing the value to set * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client or + * value is NULL */ lockdownd_error_t lockdownd_set_value(lockdownd_client_t client, const char *domain, const char *key, plist_t value) { @@ -444,15 +453,16 @@ lockdownd_error_t lockdownd_set_value(lockdownd_client_t client, const char *dom return ret; } -/** Removes a preference node on the device by domain and/or key name +/** + * Removes a preference node by domain and/or key name. * * @note: Use with caution as this could remove vital information on the device * - * @param client an initialized lockdownd client. - * @param domain the domain to query on or NULL for global domain - * @param key the key name to remove or NULL remove all keys for the current domain + * @param client An initialized lockdownd client. + * @param domain The domain to query on or NULL for global domain + * @param key The key name to remove or NULL remove all keys for the current domain * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_remove_value(lockdownd_client_t client, const char *domain, const char *key) { @@ -501,9 +511,14 @@ lockdownd_error_t lockdownd_remove_value(lockdownd_client_t client, const char * return ret; } -/** Asks for the device's unique id. Part of the lockdownd handshake. +/** + * Returns the unique id of the device from lockdownd. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @param client An initialized lockdownd client. + * @param uuid Holds the unique id of the device. The caller is responsible + * for freeing the memory. + * + * @return LOCKDOWN_E_SUCCESS on success */ lockdownd_error_t lockdownd_get_device_uuid(lockdownd_client_t client, char **uuid) { @@ -521,9 +536,14 @@ lockdownd_error_t lockdownd_get_device_uuid(lockdownd_client_t client, char **uu return ret; } -/** Askes for the device's public key. Part of the lockdownd handshake. +/** + * Retrieves the public key of the device from lockdownd. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @param client An initialized lockdownd client. + * @param public_key Holds the public key of the device. The caller is + * responsible for freeing the memory. + * + * @return LOCKDOWN_E_SUCCESS on success */ lockdownd_error_t lockdownd_get_device_public_key(lockdownd_client_t client, gnutls_datum_t * public_key) { @@ -546,12 +566,14 @@ lockdownd_error_t lockdownd_get_device_public_key(lockdownd_client_t client, gnu return ret; } -/** Askes for the device's name. - * - * @param client The pointer to the location of the new lockdownd_client +/** + * Retrieves the name of the device from lockdownd set by the user. * + * @param client An initialized lockdownd client. + * @param device_name Holds the name of the device. The caller is + * responsible for freeing the memory. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success */ lockdownd_error_t lockdownd_get_device_name(lockdownd_client_t client, char **device_name) { @@ -570,13 +592,17 @@ lockdownd_error_t lockdownd_get_device_name(lockdownd_client_t client, char **de return ret; } -/** Creates a lockdownd client for the device. +/** + * Creates a new lockdownd client for the device. * - * @param phone The device to create a lockdownd client for + * @note This function does not pair with the device or start a session. This + * has to be done manually by the caller after the client is created. + * + * @param device The device to create a lockdownd client for * @param client The pointer to the location of the new lockdownd_client - * @param label The label to use for communication. Usually the program name + * @param label The label to use for communication. Usually the program name. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_client_new(idevice_t device, lockdownd_client_t *client, const char *label) { @@ -609,15 +635,18 @@ lockdownd_error_t lockdownd_client_new(idevice_t device, lockdownd_client_t *cli return ret; } -/** Creates a lockdownd client for the device and starts initial handshake. - * The handshake consists of query_type, validate_pair, pair and - * start_session calls. +/** + * Creates a new lockdownd client for the device and starts initial handshake. + * The handshake consists out of query_type, validate_pair, pair and + * start_session calls. It uses the internal pairing record management. * - * @param phone The device to create a lockdownd client for + * @param device The device to create a lockdownd client for * @param client The pointer to the location of the new lockdownd_client - * @param label The label to use for communication. Usually the program name + * @param label The label to use for communication. Usually the program name. + * Pass NULL to disable sending the label in requests to lockdownd. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_INVALID_CONF if configuration data is wrong */ lockdownd_error_t lockdownd_client_new_with_handshake(idevice_t device, lockdownd_client_t *client, const char *label) { @@ -690,6 +719,14 @@ lockdownd_error_t lockdownd_client_new_with_handshake(idevice_t device, lockdown return ret; } +/** + * Returns a new plist from the supplied lockdownd pair record. The caller is + * responsible for freeing the plist. + * + * @param pair_record The pair record to create a plist from. + * + * @return A pair record plist from the device, NULL if pair_record is not set + */ static plist_t lockdownd_pair_record_to_plist(lockdownd_pair_record_t pair_record) { if (!pair_record) @@ -712,6 +749,17 @@ static plist_t lockdownd_pair_record_to_plist(lockdownd_pair_record_t pair_recor return dict; } +/** + * Generates a new pairing record plist and required certificates for the + * supplied public key of the device and the host_id of the caller's host + * computer. + * + * @param public_key The public key of the device. + * @param host_id The HostID to use for the pair record plist. + * @param pair_record_plist Holds the generated pair record. + * + * @return LOCKDOWN_E_SUCCESS on success + */ static lockdownd_error_t generate_pair_record_plist(gnutls_datum_t public_key, char *host_id, plist_t *pair_record_plist) { lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; @@ -743,7 +791,8 @@ static lockdownd_error_t generate_pair_record_plist(gnutls_datum_t public_key, c return ret; } -/** Function used internally by lockdownd_pair() and lockdownd_validate_pair() +/** + * Function used internally by lockdownd_pair() and lockdownd_validate_pair() * * @param client The lockdown client to pair with. * @param pair_record The pair record to use for pairing. If NULL is passed, then @@ -751,10 +800,17 @@ static lockdownd_error_t generate_pair_record_plist(gnutls_datum_t public_key, c * generated automatically when pairing is done for the first time. * @param verb This is either "Pair", "ValidatePair" or "Unpair". * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_PLIST_ERROR if the pair_record certificates are wrong, + * LOCKDOWN_E_PAIRING_FAILED if the pairing failed, + * LOCKDOWN_E_PASSWORD_PROTECTED if the device is password protected, + * LOCKDOWN_E_INVALID_HOST_ID if the device does not know the caller's host id */ static lockdownd_error_t lockdownd_do_pair(lockdownd_client_t client, lockdownd_pair_record_t pair_record, const char *verb) { + if (!client) + return LOCKDOWN_E_INVALID_ARG; + lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; plist_t dict = NULL; plist_t dict_record = NULL; @@ -855,15 +911,18 @@ static lockdownd_error_t lockdownd_do_pair(lockdownd_client_t client, lockdownd_ } /** - * Pairs the device with the given HostID. - * It's part of the lockdownd handshake. + * Pairs the device using the supplied pair record. * * @param client The lockdown client to pair with. * @param pair_record The pair record to use for pairing. If NULL is passed, then * the pair records from the current machine are used. New records will be * generated automatically when pairing is done for the first time. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_PLIST_ERROR if the pair_record certificates are wrong, + * LOCKDOWN_E_PAIRING_FAILED if the pairing failed, + * LOCKDOWN_E_PASSWORD_PROTECTED if the device is password protected, + * LOCKDOWN_E_INVALID_HOST_ID if the device does not know the caller's host id */ lockdownd_error_t lockdownd_pair(lockdownd_client_t client, lockdownd_pair_record_t pair_record) { @@ -871,17 +930,21 @@ lockdownd_error_t lockdownd_pair(lockdownd_client_t client, lockdownd_pair_recor } /** - * Pairs the device with the given HostID. The difference to lockdownd_pair() - * is that the specified host will become trusted host of the device. - * It's part of the lockdownd handshake. + * Validates if the device is paired with the given HostID. If succeeded them + * specified host will become trusted host of the device indicated by the + * lockdownd preference named TrustedHostAttached. Otherwise the host must because + * paired using lockdownd_pair() first. * * @param client The lockdown client to pair with. * @param pair_record The pair record to validate pairing with. If NULL is - * passed, then the pair records from the current machine are used. - * New records will be generated automatically when pairing is done - * for the first time. + * passed, then the pair record is read from the internal pairing record + * management. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_PLIST_ERROR if the pair_record certificates are wrong, + * LOCKDOWN_E_PAIRING_FAILED if the pairing failed, + * LOCKDOWN_E_PASSWORD_PROTECTED if the device is password protected, + * LOCKDOWN_E_INVALID_HOST_ID if the device does not know the caller's host id */ lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, lockdownd_pair_record_t pair_record) { @@ -890,13 +953,17 @@ lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, lockdownd_p /** * Unpairs the device with the given HostID and removes the pairing records - * from the device and host. + * from the device and host if the internal pairing record management is used. * * @param client The lockdown client to pair with. * @param pair_record The pair record to use for unpair. If NULL is passed, then * the pair records from the current machine are used. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_PLIST_ERROR if the pair_record certificates are wrong, + * LOCKDOWN_E_PAIRING_FAILED if the pairing failed, + * LOCKDOWN_E_PASSWORD_PROTECTED if the device is password protected, + * LOCKDOWN_E_INVALID_HOST_ID if the device does not know the caller's host id */ lockdownd_error_t lockdownd_unpair(lockdownd_client_t client, lockdownd_pair_record_t pair_record) { @@ -908,7 +975,7 @@ lockdownd_error_t lockdownd_unpair(lockdownd_client_t client, lockdownd_pair_rec * * @param client The lockdown client * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL */ lockdownd_error_t lockdownd_enter_recovery(lockdownd_client_t client) { @@ -939,12 +1006,12 @@ lockdownd_error_t lockdownd_enter_recovery(lockdownd_client_t client) } /** - * Performs the Goodbye Request to tell the device the communication - * session is now closed. + * Sends the Goodbye request to lockdownd signaling the end of communication. * * @param client The lockdown client * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_PLIST_ERROR if the device did not acknowledge the request */ lockdownd_error_t lockdownd_goodbye(lockdownd_client_t client) { @@ -978,10 +1045,18 @@ lockdownd_error_t lockdownd_goodbye(lockdownd_client_t client) return ret; } -/** Generates the device certificate from the public key as well as the host - * and root certificates. +/** + * Generates the device certificate from the public key as well as the host + * and root certificates. * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @param public_key The public key of the device to use for generation. + * @param odevice_cert Holds the generated device certificate. + * @param ohost_cert Holds the generated host certificate. + * @param oroot_cert Holds the generated root certificate. + * + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when a parameter is NULL, + * LOCKDOWN_E_INVALID_CONF if the internal configuration system failed, + * LOCKDOWN_E_SSL_ERROR if the certificates could not be generated */ lockdownd_error_t lockdownd_gen_pair_cert(gnutls_datum_t public_key, gnutls_datum_t * odevice_cert, gnutls_datum_t * ohost_cert, gnutls_datum_t * oroot_cert) @@ -1116,15 +1191,18 @@ lockdownd_error_t lockdownd_gen_pair_cert(gnutls_datum_t public_key, gnutls_datu return ret; } -/** Starts communication with lockdownd after the device has been paired, - * and if the device requires it, switches to SSL mode. +/** + * Opens a session with lockdownd and switches to SSL mode if device wants it. * * @param client The lockdownd client * @param host_id The HostID of the computer - * @param session_id The session_id of the created session + * @param session_id The new session_id of the created session * @param ssl_enabled Whether SSL communication is used in the session * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when a client or + * host_id is NULL, LOCKDOWN_E_PLIST_ERROR if the response plist had errors, + * LOCKDOWN_E_INVALID_HOST_ID if the device does not know the supplied HostID, + * LOCKDOWN_E_SSL_ERROR if enabling SSL communication failed */ lockdownd_error_t lockdownd_start_session(lockdownd_client_t client, const char *host_id, char **session_id, int *ssl_enabled) { @@ -1212,13 +1290,17 @@ lockdownd_error_t lockdownd_start_session(lockdownd_client_t client, const char return ret; } -/** Command to start the desired service +/** + * Requests to start a service and retrieve it's port on success. * * @param client The lockdownd client * @param service The name of the service to start * @param port The port number the service was started on - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG if a parameter + * is NULL, LOCKDOWN_E_INVALID_SERVICE if the requested service is not known + * by the device, LOCKDOWN_E_START_SERVICE_FAILED if the service could not because + * started by the device */ lockdownd_error_t lockdownd_start_service(lockdownd_client_t client, const char *service, uint16_t *port) { @@ -1300,10 +1382,15 @@ lockdownd_error_t lockdownd_start_service(lockdownd_client_t client, const char * * @see http://iphone-docs.org/doku.php?id=docs:protocols:activation * - * @param control The lockdown client + * @param client The lockdown client * @param activation_record The activation record plist dictionary * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client or + * activation_record is NULL, LOCKDOWN_E_NO_RUNNING_SESSION if no session is + * open, LOCKDOWN_E_PLIST_ERROR if the received plist is broken, + * LOCKDOWN_E_ACTIVATION_FAILED if the activation failed, + * LOCKDOWN_E_INVALID_ACTIVATION_RECORD if the device reports that the + * activation_record is invalid */ lockdownd_error_t lockdownd_activate(lockdownd_client_t client, plist_t activation_record) { @@ -1357,12 +1444,14 @@ lockdownd_error_t lockdownd_activate(lockdownd_client_t client, plist_t activati } /** - * Deactivates the device, returning it to the locked - * “Activate with iTunes” screen. + * Deactivates the device, returning it to the locked “Activate with iTunes” + * screen. * - * @param control The lockdown client + * @param client The lockdown client * - * @return an error code (LOCKDOWN_E_SUCCESS on success) + * @return LOCKDOWN_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, + * LOCKDOWN_E_NO_RUNNING_SESSION if no session is open, + * LOCKDOWN_E_PLIST_ERROR if the received plist is broken */ lockdownd_error_t lockdownd_deactivate(lockdownd_client_t client) { diff --git a/src/mobilebackup.c b/src/mobilebackup.c index c5f0a84..15da0a1 100644 --- a/src/mobilebackup.c +++ b/src/mobilebackup.c @@ -59,6 +59,18 @@ static mobilebackup_error_t mobilebackup_error(device_link_service_error_t err) return MOBILEBACKUP_E_UNKNOWN_ERROR; } +/** + * Connects to the mobilebackup service on the specified device. + * + * @param device The device to connect to. + * @param port Destination port (usually given by lockdownd_start_service). + * @param client Pointer that will be set to a newly allocated + * mobilebackup_client_t upon successful return. + * + * @return MOBILEBACKUP_E_SUCCESS on success, MOBILEBACKUP_E_INVALID ARG if one + * or more parameters are invalid, or DEVICE_LINK_SERVICE_E_BAD_VERSION if + * the mobilebackup version on the device is newer. + */ mobilebackup_error_t mobilebackup_client_new(idevice_t device, uint16_t port, mobilebackup_client_t * client) { @@ -87,6 +99,15 @@ mobilebackup_error_t mobilebackup_client_new(idevice_t device, uint16_t port, return ret; } +/** + * Disconnects a mobilebackup client from the device and frees up the + * mobilebackup client data. + * + * @param client The mobilebackup client to disconnect and free. + * + * @return MOBILEBACKUP_E_SUCCESS on success, or MOBILEBACKUP_E_INVALID_ARG + * if client is NULL. + */ mobilebackup_error_t mobilebackup_client_free(mobilebackup_client_t client) { if (!client) @@ -97,9 +118,10 @@ mobilebackup_error_t mobilebackup_client_free(mobilebackup_client_t client) return err; } -/** Polls the device for MobileBackup data. +/** + * Polls the device for mobilebackup data. * - * @param client The MobileBackup client + * @param client The mobilebackup client * @param plist A pointer to the location where the plist should be stored * * @return an error code @@ -112,12 +134,13 @@ mobilebackup_error_t mobilebackup_receive(mobilebackup_client_t client, plist_t return ret; } -/** Sends MobileBackup data to the device +/** + * Sends mobilebackup data to the device * * @note This function is low-level and should only be used if you need to send * a new type of message. * - * @param client The MobileBackup client + * @param client The mobilebackup client * @param plist The location of the plist to send * * @return an error code diff --git a/src/mobilesync.c b/src/mobilesync.c index 88d8497..47fcfdf 100644 --- a/src/mobilesync.c +++ b/src/mobilesync.c @@ -59,6 +59,18 @@ static mobilesync_error_t mobilesync_error(device_link_service_error_t err) return MOBILESYNC_E_UNKNOWN_ERROR; } +/** + * Connects to the mobilesync service on the specified device. + * + * @param device The device to connect to. + * @param port Destination port (usually given by lockdownd_start_service). + * @param client Pointer that will be set to a newly allocated + * mobilesync_client_t upon successful return. + * + * @return MOBILESYNC_E_SUCCESS on success, MOBILESYNC_E_INVALID ARG if one + * or more parameters are invalid, or DEVICE_LINK_SERVICE_E_BAD_VERSION if + * the mobilesync version on the device is newer. + */ mobilesync_error_t mobilesync_client_new(idevice_t device, uint16_t port, mobilesync_client_t * client) { @@ -87,6 +99,15 @@ mobilesync_error_t mobilesync_client_new(idevice_t device, uint16_t port, return ret; } +/** + * Disconnects a mobilesync client from the device and frees up the + * mobilesync client data. + * + * @param client The mobilesync client to disconnect and free. + * + * @return MOBILESYNC_E_SUCCESS on success, or MOBILESYNC_E_INVALID_ARG + * if client is NULL. + */ mobilesync_error_t mobilesync_client_free(mobilesync_client_t client) { if (!client) @@ -97,9 +118,10 @@ mobilesync_error_t mobilesync_client_free(mobilesync_client_t client) return err; } -/** Polls the device for MobileSync data. +/** + * Polls the device for mobilesync data. * - * @param client The MobileSync client + * @param client The mobilesync client * @param plist A pointer to the location where the plist should be stored * * @return an error code @@ -112,12 +134,13 @@ mobilesync_error_t mobilesync_receive(mobilesync_client_t client, plist_t * plis return ret; } -/** Sends MobileSync data to the device +/** + * Sends mobilesync data to the device * * @note This function is low-level and should only be used if you need to send * a new type of message. * - * @param client The MobileSync client + * @param client The mobilesync client * @param plist The location of the plist to send * * @return an error code diff --git a/src/sbservices.c b/src/sbservices.c index 91f4b9c..076e25d 100644 --- a/src/sbservices.c +++ b/src/sbservices.c @@ -208,7 +208,7 @@ sbservices_error_t sbservices_set_icon_state(sbservices_client_t client, plist_t if (res != SBSERVICES_E_SUCCESS) { debug_info("could not send plist, error %d", res); } - // NO RESPONSE + /* NO RESPONSE */ if (dict) { plist_free(dict); diff --git a/src/screenshotr.h b/src/screenshotr.h index 5ba93b0..df6774a 100644 --- a/src/screenshotr.h +++ b/src/screenshotr.h @@ -1,4 +1,4 @@ -/* +/* * screenshotr.h * com.apple.mobile.screenshotr service header file. * diff --git a/src/userpref.c b/src/userpref.c index 3a8a9d6..59c61b6 100644 --- a/src/userpref.c +++ b/src/userpref.c @@ -42,7 +42,8 @@ #define LIBIMOBILEDEVICE_HOST_CERTIF "HostCertificate.pem" -/** Creates a freedesktop compatible configuration directory. +/** + * Creates a freedesktop compatible configuration directory. */ static void userpref_create_config_dir(void) { @@ -60,7 +61,8 @@ static int get_rand(int min, int max) return retval; } -/** Generates a valid HostID (which is actually a UUID). +/** + * Generates a valid HostID (which is actually a UUID). * * @return A null terminated string containing a valid HostID. */ @@ -85,7 +87,8 @@ static char *userpref_generate_host_id() return hostid; } -/** Store HostID in config file. +/** + * Store HostID in config file. * * @param host_id A null terminated string containing a valid HostID. */ @@ -123,7 +126,8 @@ static int userpref_set_host_id(const char *host_id) return 1; } -/** Reads the HostID from a previously generated configuration file. +/** + * Reads the HostID from a previously generated configuration file. * * @note It is the responsibility of the calling function to free the returned host_id * @@ -158,7 +162,8 @@ void userpref_get_host_id(char **host_id) debug_info("Using %s as HostID", *host_id); } -/** Determines whether this device has been connected to this system before. +/** + * Determines whether this device has been connected to this system before. * * @param uid The device uid as given by the device. * @@ -180,8 +185,9 @@ int userpref_has_device_public_key(const char *uuid) return ret; } -/** Mark the device (as represented by the key) as having connected to this - * configuration. +/** + * Mark the device (as represented by the key) as having connected to this + * configuration. * * @param public_key The public key given by the device * @@ -213,7 +219,8 @@ userpref_error_t userpref_set_device_public_key(const char *uuid, gnutls_datum_t return USERPREF_E_SUCCESS; } -/** Remove the public key stored for the device with uuid from this host. +/** + * Remove the public key stored for the device with uuid from this host. * * @param uuid The uuid of the device * @@ -237,7 +244,8 @@ userpref_error_t userpref_remove_device_public_key(const char *uuid) return USERPREF_E_SUCCESS; } -/** Private function which reads the given file into a gnutls structure. +/** + * Private function which reads the given file into a gnutls structure. * * @param file The filename of the file to read * @param data The pointer at which to store the data. @@ -266,7 +274,8 @@ static int userpref_get_file_contents(const char *file, gnutls_datum_t * data) return success; } -/** Private function which generate private keys and certificates. +/** + * Private function which generate private keys and certificates. * * @return 1 if keys were successfully generated, 0 otherwise */ @@ -365,7 +374,8 @@ static userpref_error_t userpref_gen_keys_and_cert(void) return ret; } -/** Private function which import the given key into a gnutls structure. +/** + * Private function which import the given key into a gnutls structure. * * @param key_name The filename of the private key to import. * @param key the gnutls key structure. @@ -387,7 +397,8 @@ static userpref_error_t userpref_import_key(const char* key_name, gnutls_x509_pr return ret; } -/** Private function which import the given certificate into a gnutls structure. +/** + * Private function which import the given certificate into a gnutls structure. * * @param crt_name The filename of the certificate to import. * @param cert the gnutls certificate structure. @@ -409,7 +420,8 @@ static userpref_error_t userpref_import_crt(const char* crt_name, gnutls_x509_cr return ret; } -/** Function to retrieve host keys and certificates. +/** + * Function to retrieve host keys and certificates. * This function trigger key generation if they do not exists yet or are invalid. * * @note This function can take few seconds to complete (typically 5 seconds) @@ -459,7 +471,8 @@ userpref_error_t userpref_get_keys_and_certs(gnutls_x509_privkey_t root_privkey, return ret; } -/** Function to retrieve certificates encoded in PEM format. +/** + * Function to retrieve certificates encoded in PEM format. * * @param pem_root_cert The root certificate. * @param pem_host_cert The host certificate. @@ -480,7 +493,8 @@ userpref_error_t userpref_get_certs_as_pem(gnutls_datum_t *pem_root_cert, gnutls return USERPREF_E_INVALID_CONF; } -/** Create and save a configuration file containing the given data. +/** + * Create and save a configuration file containing the given data. * * @note: All fields must specified and be non-null * |