diff options
author | Nikias Bassen | 2021-09-13 20:28:16 +0200 |
---|---|---|
committer | Nikias Bassen | 2021-09-13 20:28:16 +0200 |
commit | 40b25fd572bf94d65e880a216bba5e825e5bbf2d (patch) | |
tree | b6df709be2dbdec2186df1c7e2bec211b8d0dec5 /src | |
parent | bcf56b30fea3b841ee11a9b4f3ac74f6de465f3d (diff) | |
download | libirecovery-40b25fd572bf94d65e880a216bba5e825e5bbf2d.tar.gz libirecovery-40b25fd572bf94d65e880a216bba5e825e5bbf2d.tar.bz2 |
Remove duplicated thread/collection code and use new libimobiledevice-glue instead
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 7 | ||||
-rw-r--r-- | src/libirecovery-1.0.pc.in | 2 | ||||
-rw-r--r-- | src/libirecovery.c | 11 | ||||
-rw-r--r-- | src/thread.c | 215 | ||||
-rw-r--r-- | src/thread.h | 87 | ||||
-rw-r--r-- | src/utils.c | 92 | ||||
-rw-r--r-- | src/utils.h | 52 |
7 files changed, 9 insertions, 457 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 06a6374..f80ffa7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,19 +3,18 @@ AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = \ $(GLOBAL_CFLAGS) \ $(LFS_CFLAGS) \ + $(limd_glue_CFLAGS) \ $(libusb_CFLAGS) AM_LDFLAGS = \ $(GLOBAL_LDFLAGS) \ + $(limd_glue_LIBS) \ $(libusb_LIBS) lib_LTLIBRARIES = libirecovery-1.0.la libirecovery_1_0_la_CFLAGS = $(AM_CFLAGS) libirecovery_1_0_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBIRECOVERY_SO_VERSION) -no-undefined -libirecovery_1_0_la_SOURCES = \ - libirecovery.c \ - utils.c utils.h \ - thread.c thread.h +libirecovery_1_0_la_SOURCES = libirecovery.c if WIN32 libirecovery_1_0_la_LDFLAGS += -avoid-version diff --git a/src/libirecovery-1.0.pc.in b/src/libirecovery-1.0.pc.in index 25144da..e6c94a3 100644 --- a/src/libirecovery-1.0.pc.in +++ b/src/libirecovery-1.0.pc.in @@ -8,4 +8,4 @@ Description: A library to communicate with iBoot/iBSS on iOS devices via USB Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lirecovery-1.0 Cflags: -I${includedir} -Requires.private: @LIBUSB_REQUIRED@ +Requires.private: libimobiledevice-glue-1.0 >= @LIMD_GLUE_VERSION@ @LIBUSB_REQUIRED@ diff --git a/src/libirecovery.c b/src/libirecovery.c index 2219f36..0446e01 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c @@ -32,11 +32,13 @@ #include <unistd.h> #include <sys/stat.h> +#include <libimobiledevice-glue/collection.h> +#include <libimobiledevice-glue/thread.h> + #ifndef USE_DUMMY #ifndef WIN32 #ifndef HAVE_IOKIT #include <libusb.h> -#include <pthread.h> #if (defined(LIBUSB_API_VERSION) && (LIBUSB_API_VERSION >= 0x01000102)) || (defined(LIBUSBX_API_VERSION) && (LIBUSBX_API_VERSION >= 0x01000102)) #define HAVE_LIBUSB_HOTPLUG_API 1 #endif @@ -44,7 +46,6 @@ #include <CoreFoundation/CoreFoundation.h> #include <IOKit/usb/IOUSBLib.h> #include <IOKit/IOCFPlugIn.h> -#include <pthread.h> #endif #else #define WIN32_LEAN_AND_MEAN @@ -67,8 +68,6 @@ #endif #include "libirecovery.h" -#include "utils.h" -#include "thread.h" struct irecv_client_private { int debug; @@ -2977,8 +2976,8 @@ IRECV_API irecv_error_t irecv_trigger_limera1n_exploit(irecv_client_t client) { // which can be accomplished by sending on another thread. void *args[2] = { client->handle, &req }; - pthread_t thread; - pthread_create(&thread, NULL, iokit_limera1n_usb_submit_request, args); + THREAD_T thread; + thread_new(&thread, iokit_limera1n_usb_submit_request, args); usleep(5 * 1000); result = (*client->handle)->USBDeviceAbortPipeZero(client->handle); diff --git a/src/thread.c b/src/thread.c deleted file mode 100644 index 796ea0b..0000000 --- a/src/thread.c +++ /dev/null @@ -1,215 +0,0 @@ -/* - * thread.c - * - * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved. - * Copyright (c) 2012 Martin Szulecki, All Rights Reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include "thread.h" - -int thread_new(THREAD_T *thread, thread_func_t thread_func, void* data) -{ -#ifdef WIN32 - HANDLE th = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, data, 0, NULL); - if (th == NULL) { - return -1; - } - *thread = th; - return 0; -#else - int res = pthread_create(thread, NULL, thread_func, data); - return res; -#endif -} - -void thread_detach(THREAD_T thread) -{ -#ifdef WIN32 - CloseHandle(thread); -#else - pthread_detach(thread); -#endif -} - -void thread_free(THREAD_T thread) -{ -#ifdef WIN32 - CloseHandle(thread); -#endif -} - -int thread_join(THREAD_T thread) -{ - /* wait for thread to complete */ -#ifdef WIN32 - return (int)WaitForSingleObject(thread, INFINITE); -#else - return pthread_join(thread, NULL); -#endif -} - -int thread_alive(THREAD_T thread) -{ - if (!thread) - return 0; -#ifdef WIN32 - return WaitForSingleObject(thread, 0) == WAIT_TIMEOUT; -#else - return pthread_kill(thread, 0) == 0; -#endif -} - -int thread_cancel(THREAD_T thread) -{ -#ifdef WIN32 - return -1; -#else -#ifdef HAVE_PTHREAD_CANCEL - return pthread_cancel(thread); -#else - return -1; -#endif -#endif -} - -void mutex_init(mutex_t* mutex) -{ -#ifdef WIN32 - InitializeCriticalSection(mutex); -#else - pthread_mutex_init(mutex, NULL); -#endif -} - -void mutex_destroy(mutex_t* mutex) -{ -#ifdef WIN32 - DeleteCriticalSection(mutex); -#else - pthread_mutex_destroy(mutex); -#endif -} - -void mutex_lock(mutex_t* mutex) -{ -#ifdef WIN32 - EnterCriticalSection(mutex); -#else - pthread_mutex_lock(mutex); -#endif -} - -void mutex_unlock(mutex_t* mutex) -{ -#ifdef WIN32 - LeaveCriticalSection(mutex); -#else - pthread_mutex_unlock(mutex); -#endif -} - -void thread_once(thread_once_t *once_control, void (*init_routine)(void)) -{ -#ifdef WIN32 - while (InterlockedExchange(&(once_control->lock), 1) != 0) { - Sleep(1); - } - if (!once_control->state) { - once_control->state = 1; - init_routine(); - } - InterlockedExchange(&(once_control->lock), 0); -#else - pthread_once(once_control, init_routine); -#endif -} - -void cond_init(cond_t* cond) -{ -#ifdef WIN32 - cond->sem = CreateSemaphore(NULL, 0, 32767, NULL); -#else - pthread_cond_init(cond, NULL); -#endif -} - -void cond_destroy(cond_t* cond) -{ -#ifdef WIN32 - CloseHandle(cond->sem); -#else - pthread_cond_destroy(cond); -#endif -} - -int cond_signal(cond_t* cond) -{ -#ifdef WIN32 - int result = 0; - if (!ReleaseSemaphore(cond->sem, 1, NULL)) { - result = -1; - } - return result; -#else - return pthread_cond_signal(cond); -#endif -} - -int cond_wait(cond_t* cond, mutex_t* mutex) -{ -#ifdef WIN32 - mutex_unlock(mutex); - DWORD res = WaitForSingleObject(cond->sem, INFINITE); - switch (res) { - case WAIT_OBJECT_0: - return 0; - default: - return -1; - } -#else - return pthread_cond_wait(cond, mutex); -#endif -} - -int cond_wait_timeout(cond_t* cond, mutex_t* mutex, unsigned int timeout_ms) -{ -#ifdef WIN32 - mutex_unlock(mutex); - DWORD res = WaitForSingleObject(cond->sem, timeout_ms); - switch (res) { - case WAIT_OBJECT_0: - case WAIT_TIMEOUT: - return 0; - default: - return -1; - } -#else - struct timespec ts; - struct timeval now; - gettimeofday(&now, NULL); - - ts.tv_sec = now.tv_sec + timeout_ms / 1000; - ts.tv_nsec = now.tv_usec * 1000 + 1000 * 1000 * (timeout_ms % 1000); - ts.tv_sec += ts.tv_nsec / (1000 * 1000 * 1000); - ts.tv_nsec %= (1000 * 1000 * 1000); - - return pthread_cond_timedwait(cond, mutex, &ts); -#endif -} diff --git a/src/thread.h b/src/thread.h deleted file mode 100644 index 2aadc6e..0000000 --- a/src/thread.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * thread.h - * - * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved. - * Copyright (c) 2012 Martin Szulecki, All Rights Reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef __THREAD_H -#define __THREAD_H - -#include <stddef.h> - -#ifdef WIN32 -#include <windows.h> -typedef HANDLE THREAD_T; -typedef CRITICAL_SECTION mutex_t; -typedef struct { - HANDLE sem; -} cond_t; -typedef volatile struct { - LONG lock; - int state; -} thread_once_t; -#define THREAD_ONCE_INIT {0, 0} -#define THREAD_ID GetCurrentThreadId() -#define THREAD_T_NULL (THREAD_T)NULL -#else -#include <pthread.h> -#include <signal.h> -#include <sys/time.h> -typedef pthread_t THREAD_T; -typedef pthread_mutex_t mutex_t; -typedef pthread_cond_t cond_t; -typedef pthread_once_t thread_once_t; -#define THREAD_ONCE_INIT PTHREAD_ONCE_INIT -#define THREAD_ID pthread_self() -#define THREAD_T_NULL (THREAD_T)NULL -#endif - -typedef void* (*thread_func_t)(void* data); - -int thread_new(THREAD_T* thread, thread_func_t thread_func, void* data); -void thread_detach(THREAD_T thread); -void thread_free(THREAD_T thread); -int thread_join(THREAD_T thread); -int thread_alive(THREAD_T thread); - -int thread_cancel(THREAD_T thread); - -#ifdef WIN32 -#undef HAVE_THREAD_CLEANUP -#else -#ifdef HAVE_PTHREAD_CANCEL -#define HAVE_THREAD_CLEANUP 1 -#define thread_cleanup_push(routine, arg) pthread_cleanup_push(routine, arg) -#define thread_cleanup_pop(execute) pthread_cleanup_pop(execute) -#endif -#endif - -void mutex_init(mutex_t* mutex); -void mutex_destroy(mutex_t* mutex); -void mutex_lock(mutex_t* mutex); -void mutex_unlock(mutex_t* mutex); - -void thread_once(thread_once_t *once_control, void (*init_routine)(void)); - -void cond_init(cond_t* cond); -void cond_destroy(cond_t* cond); -int cond_signal(cond_t* cond); -int cond_wait(cond_t* cond, mutex_t* mutex); -int cond_wait_timeout(cond_t* cond, mutex_t* mutex, unsigned int timeout_ms); - -#endif diff --git a/src/utils.c b/src/utils.c deleted file mode 100644 index 826bfbe..0000000 --- a/src/utils.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * utils.c - * - * Copyright (C) 2009 Hector Martin <hector@marcansoft.com> - * Copyright (C) 2009 Nikias Bassen <nikias@gmx.li> - * Copyright (c) 2013 Federico Mena Quintero - * - * This library is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <errno.h> - -#include "utils.h" - -#define CAPACITY_STEP 8 - -void collection_init(struct collection *col) -{ - col->list = malloc(sizeof(void *) * CAPACITY_STEP); - memset(col->list, 0, sizeof(void *) * CAPACITY_STEP); - col->capacity = CAPACITY_STEP; -} - -void collection_free(struct collection *col) -{ - free(col->list); - col->list = NULL; - col->capacity = 0; -} - -void collection_add(struct collection *col, void *element) -{ - int i; - for(i=0; i<col->capacity; i++) { - if(!col->list[i]) { - col->list[i] = element; - return; - } - } - col->list = realloc(col->list, sizeof(void*) * (col->capacity + CAPACITY_STEP)); - memset(&col->list[col->capacity], 0, sizeof(void *) * CAPACITY_STEP); - col->list[col->capacity] = element; - col->capacity += CAPACITY_STEP; -} - -void collection_remove(struct collection *col, void *element) -{ - int i; - for(i=0; i<col->capacity; i++) { - if(col->list[i] == element) { - col->list[i] = NULL; - return; - } - } -} - -int collection_count(struct collection *col) -{ - int i, cnt = 0; - for(i=0; i<col->capacity; i++) { - if(col->list[i]) - cnt++; - } - return cnt; -} - -void collection_copy(struct collection *dest, struct collection *src) -{ - if (!dest || !src) return; - dest->capacity = src->capacity; - dest->list = malloc(sizeof(void*) * src->capacity); - memcpy(dest->list, src->list, sizeof(void*) * src->capacity); -} diff --git a/src/utils.h b/src/utils.h deleted file mode 100644 index ccb3a09..0000000 --- a/src/utils.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * utils.h - * - * Copyright (C) 2009 Hector Martin <hector@marcansoft.com> - * Copyright (C) 2009 Nikias Bassen <nikias@gmx.li> - * - * This library is free software; you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 2.1 of the - * License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef UTILS_H -#define UTILS_H - -struct collection { - void **list; - int capacity; -}; - -void collection_init(struct collection *col); -void collection_add(struct collection *col, void *element); -void collection_remove(struct collection *col, void *element); -int collection_count(struct collection *col); -void collection_free(struct collection *col); -void collection_copy(struct collection *dest, struct collection *src); - -#define MERGE_(a,b) a ## _ ## b -#define LABEL_(a,b) MERGE_(a, b) -#define UNIQUE_VAR(a) LABEL_(a, __LINE__) - -#define FOREACH(var, col) \ - do { \ - int UNIQUE_VAR(_iter); \ - for(UNIQUE_VAR(_iter)=0; UNIQUE_VAR(_iter)<(col)->capacity; UNIQUE_VAR(_iter)++) { \ - if(!(col)->list[UNIQUE_VAR(_iter)]) continue; \ - var = (col)->list[UNIQUE_VAR(_iter)]; - -#define ENDFOREACH \ - } \ - } while(0); - -#endif |