summaryrefslogtreecommitdiffstats
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c134
1 files changed, 42 insertions, 92 deletions
diff --git a/src/common.c b/src/common.c
index 4dbabc0..d31c558 100644
--- a/src/common.c
+++ b/src/common.c
@@ -35,6 +35,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
+#include <libimobiledevice-glue/thread.h>
#ifdef WIN32
#include <windows.h>
@@ -63,6 +64,7 @@ struct idevicerestore_mode_t idevicerestore_modes[] = {
{ 3, "Recovery" },
{ 4, "Restore" },
{ 5, "Normal" },
+ { 6, "Port DFU" },
};
int idevicerestore_debug = 0;
@@ -78,17 +80,30 @@ static int info_disabled = 0;
static int error_disabled = 0;
static int debug_disabled = 0;
+static mutex_t log_mutex;
+static thread_once_t init_once = THREAD_ONCE_INIT;
+
+static void _log_init(void)
+{
+ mutex_init(&log_mutex);
+}
+
void info(const char* format, ...)
{
if (info_disabled) return;
+ thread_once(&init_once, _log_init);
+ mutex_lock(&log_mutex);
va_list vargs;
va_start(vargs, format);
vfprintf((info_stream) ? info_stream : stdout, format, vargs);
va_end(vargs);
+ mutex_unlock(&log_mutex);
}
void error(const char* format, ...)
{
+ thread_once(&init_once, _log_init);
+ mutex_lock(&log_mutex);
va_list vargs, vargs2;
va_start(vargs, format);
va_copy(vargs2, vargs);
@@ -98,6 +113,7 @@ void error(const char* format, ...)
vfprintf((error_stream) ? error_stream : stderr, format, vargs2);
}
va_end(vargs2);
+ mutex_unlock(&log_mutex);
}
void debug(const char* format, ...)
@@ -106,10 +122,13 @@ void debug(const char* format, ...)
if (!idevicerestore_debug) {
return;
}
+ thread_once(&init_once, _log_init);
+ mutex_lock(&log_mutex);
va_list vargs;
va_start(vargs, format);
vfprintf((debug_stream) ? debug_stream : stderr, format, vargs);
va_end(vargs);
+ mutex_unlock(&log_mutex);
}
void idevicerestore_set_info_stream(FILE* strm)
@@ -226,9 +245,9 @@ void debug_plist(plist_t plist) {
char* data = NULL;
plist_to_xml(plist, &data, &size);
if (size <= MAX_PRINT_LEN)
- info("%s:printing %i bytes plist:\n%s", __FILE__, size, data);
+ info("printing %i bytes plist:\n%s", size, data);
else
- info("%s:supressed printing %i bytes plist...\n", __FILE__, size);
+ info("supressed printing %i bytes plist...\n", size);
free(data);
}
@@ -238,13 +257,13 @@ void print_progress_bar(double progress) {
int i = 0;
if(progress < 0) return;
if(progress > 100) progress = 100;
- info("\r[");
+ fprintf((info_stream) ? info_stream : stdout, "\r[");
for(i = 0; i < 50; i++) {
- if(i < progress / 2) info("=");
- else info(" ");
+ if(i < progress / 2) fprintf((info_stream) ? info_stream : stdout, "=");
+ else fprintf((info_stream) ? info_stream : stdout, " ");
}
- info("] %5.1f%%", progress);
- if(progress >= 100) info("\n");
+ fprintf((info_stream) ? info_stream : stdout, "] %5.1f%%", progress);
+ if(progress >= 100) fprintf((info_stream) ? info_stream : stdout, "\n");
fflush((info_stream) ? info_stream : stdout);
#endif
}
@@ -463,14 +482,17 @@ char *get_temp_filename(const char *prefix)
void idevicerestore_progress(struct idevicerestore_client_t* client, int step, double progress)
{
+ thread_once(&init_once, _log_init);
+ mutex_lock(&log_mutex);
if(client && client->progress_cb) {
client->progress_cb(step, progress, client->progress_cb_data);
} else {
// we don't want to be too verbose in regular idevicerestore.
- if ((step == RESTORE_STEP_UPLOAD_FS) || (step == RESTORE_STEP_VERIFY_FS) || (step == RESTORE_STEP_FLASH_FW)) {
+ if ((step == RESTORE_STEP_UPLOAD_FS) || (step == RESTORE_STEP_VERIFY_FS) || (step == RESTORE_STEP_FLASH_FW) || (step == RESTORE_STEP_UPLOAD_IMG)) {
print_progress_bar(100.0 * progress);
}
}
+ mutex_unlock(&log_mutex);
}
#ifndef HAVE_STRSEP
@@ -557,91 +579,19 @@ void get_user_input(char *buf, int maxlen, int secure)
buf[len] = 0;
}
-uint64_t _plist_dict_get_uint(plist_t dict, const char *key)
+const char* path_get_basename(const char* path)
{
- uint64_t uintval = 0;
- char *strval = NULL;
- uint64_t strsz = 0;
- plist_t node = plist_dict_get_item(dict, key);
- if (!node) {
- return (uint64_t)-1LL;
- }
- switch (plist_get_node_type(node)) {
- case PLIST_UINT:
- plist_get_uint_val(node, &uintval);
- break;
- case PLIST_STRING:
- plist_get_string_val(node, &strval);
- if (strval) {
- uintval = strtoull(strval, NULL, 0);
- free(strval);
- }
- break;
- case PLIST_DATA:
- plist_get_data_val(node, &strval, &strsz);
- if (strval) {
- if (strsz == 8) {
- uintval = le64toh(*(uint64_t*)strval);
- } else if (strsz == 4) {
- uintval = le32toh(*(uint32_t*)strval);
- } else if (strsz == 2) {
- uintval = le16toh(*(uint16_t*)strval);
- } else if (strsz == 1) {
- uintval = strval[0];
- } else {
- error("%s: ERROR: invalid size %" PRIu64 " for data to integer conversion\n", __func__, strsz);
- }
- free(strval);
- }
- break;
- default:
- break;
- }
- return uintval;
-}
-
-uint8_t _plist_dict_get_bool(plist_t dict, const char *key)
-{
- uint8_t bval = 0;
- uint64_t uintval = 0;
- char *strval = NULL;
- uint64_t strsz = 0;
- plist_t node = plist_dict_get_item(dict, key);
- if (!node) {
- return 0;
- }
- switch (plist_get_node_type(node)) {
- case PLIST_BOOLEAN:
- plist_get_bool_val(node, &bval);
- break;
- case PLIST_UINT:
- plist_get_uint_val(node, &uintval);
- bval = (uint8_t)uintval;
- break;
- case PLIST_STRING:
- plist_get_string_val(node, &strval);
- if (strval) {
- if (strcmp(strval, "true")) {
- bval = 1;
- } else if (strcmp(strval, "false")) {
- bval = 0;
- }
- free(strval);
- }
- break;
- case PLIST_DATA:
- plist_get_data_val(node, &strval, &strsz);
- if (strval) {
- if (strsz == 1) {
- bval = strval[0];
- } else {
- error("%s: ERROR: invalid size %" PRIu64 " for data to boolean conversion\n", __func__, strsz);
- }
- free(strval);
+#ifdef WIN32
+ const char *p = path + strlen(path);
+ while (p > path) {
+ if ((*p == '/') || (*p == '\\')) {
+ return p+1;
}
- break;
- default:
- break;
+ p--;
}
- return bval;
+ return p;
+#else
+ const char *p = strrchr(path, '/');
+ return p ? p + 1 : path;
+#endif
}