From 8e82524e5506b5af6bc75fa040e101c840121eec Mon Sep 17 00:00:00 2001 From: Matt Colyer Date: Sun, 17 Aug 2008 09:00:10 -0700 Subject: Enhance the usability of initconf, by giving more feedback to the user. --- configure.ac | 1 + src/Makefile.am | 3 +++ src/initconf.c | 79 ++++++++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 65 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index 12e364d..66c40fe 100644 --- a/configure.ac +++ b/configure.ac @@ -14,6 +14,7 @@ AC_PROG_CC PKG_CHECK_MODULES(libxml2, libxml-2.0 >= 2.6.30) PKG_CHECK_MODULES(libusb, libusb >= 0.1.12) PKG_CHECK_MODULES(libglib2, glib-2.0 >= 2.14.1) +PKG_CHECK_MODULES(libgthread2, gthread-2.0 >= 2.14.1) PKG_CHECK_MODULES(libgnutls, gnutls >= 1.6.3) PKG_CHECK_MODULES(libfuse, fuse >= 2.7.0) diff --git a/src/Makefile.am b/src/Makefile.am index 09d232f..dc32c04 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -4,4 +4,7 @@ AM_LDFLAGS = $(libxml2_LIBS) $(libusb_LIBS) $(libglib2_LIBS) $(libfuse_LIBS) $(l bin_PROGRAMS = iphoneclient ifuse libiphone-initconf iphoneclient_SOURCES = usbmux.c main.c iphone.c plist.c lockdown.c AFC.c userpref.c ifuse_SOURCES = ifuse.c usbmux.c iphone.c plist.c lockdown.c AFC.c userpref.c + libiphone_initconf_SOURCES = initconf.c userpref.c +libiphone_initconf_CFLAGS = $(libgthread2_CFLAGS) +libiphone_initconf_LDFLAGS = $(libgthread2_LIBS) diff --git a/src/initconf.c b/src/initconf.c index b4952e7..a8d56e4 100644 --- a/src/initconf.c +++ b/src/initconf.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -51,21 +52,46 @@ char *lockdownd_generate_hostid() { return hostid; } -int main(int argc, char *argv[]) { - - printf("This program generates keys required to connect with the iPhone\n"); - printf("It only needs to be run ONCE.\n\n"); - printf("Additionally it may take several minutes to run, please be patient.\n\n"); +void generate_key(gpointer key){ + gnutls_x509_privkey_generate(*((gnutls_x509_privkey_t*)key), GNUTLS_PK_RSA, 2048, 0); + g_thread_exit(0); +} - gnutls_global_init(); +void progress_bar(gpointer mutex){ + const char *spinner = "|/-\\|/-\\"; + int i = 0; + + while (!g_static_mutex_trylock((GStaticMutex*)mutex)){ + usleep(500000); + printf("Generating root key... %c\r", spinner[i++]); + fflush(stdout); + if (i > 8) i = 0; + } + printf("Generating key... done\n"); + g_thread_exit(0); +} +int main(int argc, char *argv[]) { + GThread *progress_thread, *key_thread; + GError *err; + static GStaticMutex mutex = G_STATIC_MUTEX_INIT; char* host_id = NULL; gnutls_x509_privkey_t root_privkey; gnutls_x509_privkey_t host_privkey; - gnutls_x509_crt_t root_cert; gnutls_x509_crt_t host_cert; + // Create the thread + if (!g_thread_supported()){ + g_thread_init(NULL); + } + gnutls_global_init(); + + printf("This program generates keys required to connect with the iPhone\n"); + printf("It only needs to be run ONCE.\n\n"); + printf("Additionally it may take several minutes to run, please be patient.\n\n"); + + gnutls_x509_privkey_init(&root_privkey); gnutls_x509_privkey_init(&host_privkey); @@ -73,19 +99,36 @@ int main(int argc, char *argv[]) { gnutls_x509_crt_init(&host_cert); /* generate HostID */ - //TODO host_id = lockdownd_generate_hostid(); - /* generate keys */ - printf("Generating root key..."); - fflush(stdout); - gnutls_x509_privkey_generate(root_privkey, GNUTLS_PK_RSA, 2048, 0); - printf("done\n"); + /* generate root key */ + g_static_mutex_lock(&mutex); + if((key_thread = g_thread_create((GThreadFunc)generate_key, &root_privkey, TRUE, &err)) == NULL) { + printf("Thread create failed: %s!!\n", err->message ); + g_error_free(err) ; + } + if((progress_thread = g_thread_create((GThreadFunc)progress_bar, &mutex, TRUE, &err)) == NULL) { + printf("Thread create failed: %s!!\n", err->message ); + g_error_free(err) ; + } + g_thread_join(key_thread); + g_static_mutex_unlock(&mutex); + g_thread_join(progress_thread); - printf("Generating private key..."); - fflush(stdout); - gnutls_x509_privkey_generate(host_privkey, GNUTLS_PK_RSA, 2048, 0); - printf("done\n"); + /* generate host key */ + g_static_mutex_init(&mutex); + g_static_mutex_lock(&mutex); + if((key_thread = g_thread_create((GThreadFunc)generate_key, &host_privkey, TRUE, &err)) == NULL) { + printf("Thread create failed: %s!!\n", err->message ); + g_error_free(err) ; + } + if((progress_thread = g_thread_create((GThreadFunc)progress_bar, &mutex, TRUE, &err)) == NULL) { + printf("Thread create failed: %s!!\n", err->message ); + g_error_free(err) ; + } + g_thread_join(key_thread); + g_static_mutex_unlock(&mutex); + g_thread_join(progress_thread); /* generate certificates */ gnutls_x509_crt_set_key(root_cert, root_privkey); @@ -133,7 +176,7 @@ int main(int argc, char *argv[]) { gnutls_x509_crt_export (root_cert, GNUTLS_X509_FMT_PEM, root_cert_pem.data, &root_cert_pem.size); printf("done\n"); - printf("Generating root certificate..."); + printf("Generating host certificate..."); gnutls_x509_crt_export (host_cert, GNUTLS_X509_FMT_PEM, host_cert_pem.data, &host_cert_pem.size); printf("done\n"); -- cgit v1.1-32-gdbae