summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/FUNDING.yml3
-rw-r--r--.github/workflows/build.yml52
-rw-r--r--README.md10
-rw-r--r--configure.ac29
-rw-r--r--include/libideviceactivation.h70
-rw-r--r--src/activation.c174
-rw-r--r--tools/ideviceactivation.c27
7 files changed, 176 insertions, 189 deletions
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..e995b30
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+github: nikias
+patreon: nikias
+custom: ["https://www.paypal.me/NikiasBassen"]
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c5ecca4..2389b50 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -2,6 +2,7 @@ name: build
on:
push:
+ pull_request:
schedule:
- cron: '0 0 1 * *'
@@ -17,28 +18,28 @@ jobs:
run: |
echo "target_triplet=`gcc -dumpmachine`" >> $GITHUB_ENV
- name: fetch libplist
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libplist-latest_${{env.target_triplet}}
repo: libimobiledevice/libplist
- name: fetch libusbmuxd
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libusbmuxd-latest_${{env.target_triplet}}
repo: libimobiledevice/libusbmuxd
- name: fetch libimobiledevice-glue
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libimobiledevice-glue-latest_${{env.target_triplet}}
repo: libimobiledevice/libimobiledevice-glue
- name: fetch libimobiledevice
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
@@ -53,7 +54,7 @@ jobs:
rm -rf extract/lib
sudo cp -r extract/* /
sudo ldconfig
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
with:
fetch-depth: 0
- name: autogen
@@ -68,7 +69,7 @@ jobs:
DESTDIR=`pwd`/dest make install
tar -C dest -cf libideviceactivation.tar usr
- name: publish artifact
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v4
with:
name: libideviceactivation-latest_${{env.target_triplet}}
path: libideviceactivation.tar
@@ -84,28 +85,28 @@ jobs:
fi
shell: bash
- name: fetch libplist
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libplist-latest_macOS
repo: libimobiledevice/libplist
- name: fetch libusbmuxd
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libusbmuxd-latest_macOS
repo: libimobiledevice/libusbmuxd
- name: fetch libimobiledevice-glue
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libimobiledevice-glue-latest_macOS
repo: libimobiledevice/libimobiledevice-glue
- name: fetch libimobiledevice
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
@@ -118,7 +119,7 @@ jobs:
tar -C extract -xvf $I
done
sudo cp -r extract/* /
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: install additional requirements
run: |
SDKDIR=`xcrun --sdk macosx --show-sdk-path 2>/dev/null`
@@ -151,12 +152,12 @@ jobs:
DESTDIR=`pwd`/dest make install
tar -C dest -cf libideviceactivation.tar usr
- name: publish artifact
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v4
with:
name: libideviceactivation-latest_macOS
path: libideviceactivation.tar
build-windows:
- runs-on: windows-2019
+ runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
@@ -177,6 +178,9 @@ jobs:
base-devel
git
mingw-w64-${{ matrix.arch }}-gcc
+ mingw-w64-${{ matrix.arch }}-pkg-config
+ mingw-w64-${{ matrix.arch }}-openssl
+ mingw-w64-${{ matrix.arch }}-libxml2
make
libtool
autoconf
@@ -187,28 +191,28 @@ jobs:
echo "dest=$dest" >> $GITHUB_ENV
echo "target_triplet=`gcc -dumpmachine`" >> $GITHUB_ENV
- name: fetch libplist
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libplist-latest_${{ matrix.arch }}-${{ env.dest }}
repo: libimobiledevice/libplist
- name: fetch libusbmuxd
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libusbmuxd-latest_${{ matrix.arch }}-${{ env.dest }}
repo: libimobiledevice/libusbmuxd
- name: fetch libimobiledevice-glue
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
name: libimobiledevice-glue-latest_${{ matrix.arch }}-${{ env.dest }}
repo: libimobiledevice/libimobiledevice-glue
- name: fetch libimobiledevice
- uses: dawidd6/action-download-artifact@v2
+ uses: dawidd6/action-download-artifact@v6
with:
github_token: ${{secrets.GITHUB_TOKEN}}
workflow: build.yml
@@ -221,12 +225,18 @@ jobs:
tar -C extract -xvf $I
done
cp -r extract/* /
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: install additional requirements
run: |
- #
+ mkdir deps
+ FILENAME="libcurl-8.1.0-static.tar.bz2"
+ curl -o $FILENAME.b64 -Ls "https://gist.github.com/nikias/6c397a0a2f4f4eafd91b81cccd22b761/raw/85216e60af6787f3b351291165eb91bd585ff09a/libcurl-8.1.0-static-${{matrix.arch}}-${{env.dest}}.tar.bz2"
+ base64 -d < $FILENAME.b64 > $FILENAME
+ tar -C deps -xjf $FILENAME
+ echo "LIBCURL_CFLAGS=-I`pwd`/deps/include -DCURL_STATICLIB" >> $GITHUB_ENV
+ echo "LIBCURL_LIBS=-Xlinker `pwd`/deps/lib/libcurl.a -Xlinker /${{env.dest}}/lib/libzstd.a -Xlinker /${{env.dest}}/lib/libz.a -Xlinker -lws2_32 -Xlinker -lcrypt32 -Xlinker -lwldap32 -Xlinker -lbcrypt -Xlinker -lssl -Xlinker -lcrypto" >> $GITHUB_ENV
- name: autogen
- run: ./autogen.sh CC=gcc CXX=g++
+ run: ./autogen.sh libcurl_CFLAGS="${{env.LIBCURL_CFLAGS}}" libcurl_LIBS="${{env.LIBCURL_LIBS}}"
- name: make
run: make
- name: make install
@@ -237,7 +247,7 @@ jobs:
DESTDIR=`pwd`/dest make install
tar -C dest -cf libideviceactivation.tar ${{ env.dest }}
- name: publish artifact
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v4
with:
name: libideviceactivation-latest_${{ matrix.arch }}-${{ env.dest }}
path: libideviceactivation.tar
diff --git a/README.md b/README.md
index ca2946d..ee5e905 100644
--- a/README.md
+++ b/README.md
@@ -54,9 +54,9 @@ sudo make install
## Usage
-To query the activation status of a device use:
+To query the activation state of a device use:
```shell
-ideviceactivation status
+ideviceactivation state
```
To activate a device use:
@@ -93,8 +93,8 @@ We are still working on the guidelines so bear with us!
## Links
* Homepage: https://libimobiledevice.org/
-* Repository: https://git.libimobiledevice.org/libideviceactivation.git
-* Repository (Mirror): https://github.com/libimobiledevice/libideviceactivation.git
+* Repository: https://github.com/libimobiledevice/libideviceactivation.git
+* Repository (Mirror): https://git.libimobiledevice.org/libideviceactivation.git
* Issue Tracker: https://github.com/libimobiledevice/libideviceactivation/issues
* Mailing List: https://lists.libimobiledevice.org/mailman/listinfo/libimobiledevice-devel
* Twitter: https://twitter.com/libimobiledev
@@ -118,4 +118,4 @@ iPadOS, tvOS, watchOS, and macOS are trademarks of Apple Inc.
This project is an independent software library and has not been authorized,
sponsored, or otherwise approved by Apple Inc.
-README Updated on: 2022-04-04
+README Updated on: 2024-10-22
diff --git a/configure.ac b/configure.ac
index 2f93895..d4e1d79 100644
--- a/configure.ac
+++ b/configure.ac
@@ -61,44 +61,25 @@ case ${host_os} in
*mingw32*|*cygwin*)
AC_MSG_RESULT([${host_os}])
win32=true
+ deplibs_check_method='pass_all'
;;
darwin*|*android*)
AC_MSG_RESULT([${host_os}])
;;
*)
AC_MSG_RESULT([${host_os}])
- AX_PTHREAD([], [AC_MSG_ERROR([pthread is required to build ${PACKAGE}])])
- AC_CHECK_LIB(pthread, [pthread_once], [], [AC_MSG_ERROR([pthread with pthread_once required to build ${PACKAGE}])])
;;
esac
AM_CONDITIONAL(WIN32, test x$win32 = xtrue)
-# Check if the C compiler supports __attribute__((constructor))
-AC_CACHE_CHECK([wether the C compiler supports constructor/destructor attributes],
- ac_cv_attribute_constructor, [
- ac_cv_attribute_constructor=no
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
- [[
- static void __attribute__((constructor)) test_constructor(void) {
- }
- static void __attribute__((destructor)) test_destructor(void) {
- }
- ]], [])],
- [ac_cv_attribute_constructor=yes]
- )]
-)
-if test "$ac_cv_attribute_constructor" = "yes"; then
- AC_DEFINE(HAVE_ATTRIBUTE_CONSTRUCTOR, 1, [Define if the C compiler supports constructor/destructor attributes])
+AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith -Wwrite-strings -Wswitch-default -Wno-unused-parameter -fsigned-char -fvisibility=hidden")
+
+if test "x$enable_static" = "xyes" -a "x$enable_shared" = "xno"; then
+ GLOBAL_CFLAGS+=" -DIDEVICE_ACTIVATION_STATIC"
fi
-AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith -Wwrite-strings -Wswitch-default -Wno-unused-parameter -fsigned-char -fvisibility=hidden")
AC_SUBST(GLOBAL_CFLAGS)
-case "$GLOBAL_CFLAGS" in
- *-fvisibility=hidden*)
- AC_DEFINE([HAVE_FVISIBILITY], [1], [Define if compiled with -fvisibility=hidden])
-esac
-
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
AC_CONFIG_FILES([
diff --git a/include/libideviceactivation.h b/include/libideviceactivation.h
index 9b78c20..dbee85b 100644
--- a/include/libideviceactivation.h
+++ b/include/libideviceactivation.h
@@ -31,6 +31,16 @@ extern "C" {
#include <libimobiledevice/lockdown.h>
#include <plist/plist.h>
+#ifndef IDEVICE_ACTIVATION_API
+ #ifdef IDEVICE_ACTIVATION_STATIC
+ #define IDEVICE_ACTIVATION_API
+ #elif defined(_WIN32)
+ #define IDEVICE_ACTIVATION_API __declspec(dllimport)
+ #else
+ #define IDEVICE_ACTIVATION_API
+ #endif
+#endif
+
typedef enum {
IDEVICE_ACTIVATION_E_SUCCESS = 0,
IDEVICE_ACTIVATION_E_INCOMPLETE_INFO = -1,
@@ -55,44 +65,44 @@ typedef idevice_activation_response* idevice_activation_response_t;
/* Interface */
-void idevice_activation_set_debug_level(int level);
+IDEVICE_ACTIVATION_API void idevice_activation_set_debug_level(int level);
-idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t activation_type, idevice_activation_request_t* request);
-idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t activation_type, lockdownd_client_t lockdown, idevice_activation_request_t* request);
-idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request);
-void idevice_activation_request_free(idevice_activation_request_t request);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t activation_type, idevice_activation_request_t* request);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t activation_type, lockdownd_client_t lockdown, idevice_activation_request_t* request);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request);
+IDEVICE_ACTIVATION_API void idevice_activation_request_free(idevice_activation_request_t request);
-void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields);
-void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields);
-void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response);
-void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value);
-void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value);
+IDEVICE_ACTIVATION_API void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields);
+IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields);
+IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response);
+IDEVICE_ACTIVATION_API void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value);
+IDEVICE_ACTIVATION_API void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value);
-void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url);
-void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url);
+IDEVICE_ACTIVATION_API void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url);
+IDEVICE_ACTIVATION_API void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url);
-idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response);
-idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response);
-idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size);
-void idevice_activation_response_free(idevice_activation_response_t response);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size);
+IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_response_t response);
-void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value);
-void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields);
-void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value);
-void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char **value);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char **value);
-void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title);
-void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description);
-void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record);
-void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record);
+IDEVICE_ACTIVATION_API void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers);
-int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response);
-int idevice_activation_response_is_authentication_required(idevice_activation_response_t response);
-int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key);
-int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key);
-int idevice_activation_response_has_errors(idevice_activation_response_t response);
+IDEVICE_ACTIVATION_API int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response);
+IDEVICE_ACTIVATION_API int idevice_activation_response_is_authentication_required(idevice_activation_response_t response);
+IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key);
+IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key);
+IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activation_response_t response);
-idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response);
+IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response);
#ifdef __cplusplus
}
diff --git a/src/activation.c b/src/activation.c
index 4260c20..2b329ce 100644
--- a/src/activation.c
+++ b/src/activation.c
@@ -32,25 +32,52 @@
#include <libxml/HTMLtree.h>
#include <curl/curl.h>
-#ifdef WIN32
-#define IDEVICE_ACTIVATION_API __declspec( dllexport )
+#ifdef IDEVICE_ACTIVATION_STATIC
+ #define IDEVICE_ACTIVATION_API
+#elif defined(_WIN32)
+ #define IDEVICE_ACTIVATION_API __declspec( dllexport )
#else
-#ifdef HAVE_FVISIBILITY
-#define IDEVICE_ACTIVATION_API __attribute__((visibility("default")))
-#else
-#define IDEVICE_ACTIVATION_API
-#endif
+ #if __GNUC__ >= 4
+ #define IDEVICE_ACTIVATION_API __attribute__((visibility("default")))
+ #else
+ #define IDEVICE_ACTIVATION_API
+ #endif
#endif
-#ifdef WIN32
+#ifdef _WIN32
#include <windows.h>
#define strncasecmp _strnicmp
-#else
-#include <pthread.h>
#endif
#include <libideviceactivation.h>
+// Reference: https://stackoverflow.com/a/2390626/1806760
+// Initializer/finalizer sample for MSVC and GCC/Clang.
+// 2010-2016 Joe Lowe. Released into the public domain.
+
+#ifdef __cplusplus
+ #define INITIALIZER(f) \
+ static void f(void); \
+ struct f##_t_ { f##_t_(void) { f(); } }; static f##_t_ f##_; \
+ static void f(void)
+#elif defined(_MSC_VER)
+ #pragma section(".CRT$XCU",read)
+ #define INITIALIZER2_(f,p) \
+ static void f(void); \
+ __declspec(allocate(".CRT$XCU")) void (*f##_)(void) = f; \
+ __pragma(comment(linker,"/include:" p #f "_")) \
+ static void f(void)
+ #ifdef _WIN64
+ #define INITIALIZER(f) INITIALIZER2_(f,"")
+ #else
+ #define INITIALIZER(f) INITIALIZER2_(f,"_")
+ #endif
+#else
+ #define INITIALIZER(f) \
+ static void f(void) __attribute__((__constructor__)); \
+ static void f(void)
+#endif
+
#define IDEVICE_ACTIVATION_USER_AGENT_IOS "iOS Device Activator (MobileActivation-592.103.2)"
#define IDEVICE_ACTIVATION_USER_AGENT_ITUNES "iTunes/11.1.4 (Macintosh; OS X 10.9.1) AppleWebKit/537.73.11"
#define IDEVICE_ACTIVATION_DEFAULT_URL "https://albert.apple.com/deviceservices/deviceActivation"
@@ -90,81 +117,20 @@ struct idevice_activation_response_private {
int has_errors;
};
-
-static void internal_libideviceactivation_init(void)
-{
- curl_global_init(CURL_GLOBAL_ALL);
-}
-
static void internal_libideviceactivation_deinit(void)
{
curl_global_cleanup();
}
-#ifdef WIN32
-typedef volatile struct {
- LONG lock;
- int state;
-} thread_once_t;
-
-static thread_once_t init_once = {0, 0};
-static thread_once_t deinit_once = {0, 0};
-
-static void thread_once(thread_once_t *once_control, void (*init_routine)(void))
-{
- 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
-static pthread_once_t init_once = PTHREAD_ONCE_INIT;
-static pthread_once_t deinit_once = PTHREAD_ONCE_INIT;
-#define thread_once pthread_once
-#endif
-
-#ifndef HAVE_ATTRIBUTE_CONSTRUCTOR
- #if defined(__llvm__) || defined(__GNUC__)
- #define HAVE_ATTRIBUTE_CONSTRUCTOR
- #endif
-#endif
-
-#ifdef HAVE_ATTRIBUTE_CONSTRUCTOR
-static void __attribute__((constructor)) libideviceactivation_initialize(void)
+INITIALIZER(internal_libideviceactivation_init)
{
- thread_once(&init_once, internal_libideviceactivation_init);
-}
-
-static void __attribute__((destructor)) libideviceactivation_deinitialize(void)
-{
- thread_once(&deinit_once, internal_libideviceactivation_deinit);
-}
-#elif defined(WIN32)
-BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
-{
- switch (dwReason) {
- case DLL_PROCESS_ATTACH:
- thread_once(&init_once, internal_libideviceactivation_init);
- break;
- case DLL_PROCESS_DETACH:
- thread_once(&deinit_once, internal_libideviceactivation_deinit);
- break;
- default:
- break;
- }
- return 1;
+ curl_global_init(CURL_GLOBAL_ALL);
+ atexit(internal_libideviceactivation_deinit);
}
-#else
-#warning No compiler support for constructor/destructor attributes, some features might not be available.
-#endif
static int debug_level = 0;
-IDEVICE_ACTIVATION_API void idevice_activation_set_debug_level(int level) {
+void idevice_activation_set_debug_level(int level) {
debug_level = level;
}
@@ -721,7 +687,7 @@ static int idevice_activation_curl_debug_callback(CURL *handle, curl_infotype ty
return 0;
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request)
+idevice_activation_error_t idevice_activation_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request)
{
if (!request)
return IDEVICE_ACTIVATION_E_INTERNAL_ERROR;
@@ -741,7 +707,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new
return IDEVICE_ACTIVATION_E_SUCCESS;
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t client_type, lockdownd_client_t lockdown, idevice_activation_request** request)
+idevice_activation_error_t idevice_activation_request_new_from_lockdownd(idevice_activation_client_type_t client_type, lockdownd_client_t lockdown, idevice_activation_request** request)
{
if (!lockdown || !request) {
return IDEVICE_ACTIVATION_E_INTERNAL_ERROR;
@@ -864,7 +830,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_request_new
return IDEVICE_ACTIVATION_E_SUCCESS;
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request)
+idevice_activation_error_t idevice_activation_drm_handshake_request_new(idevice_activation_client_type_t client_type, idevice_activation_request_t* request)
{
if (!request)
return IDEVICE_ACTIVATION_E_INTERNAL_ERROR;
@@ -884,7 +850,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_drm_handsha
return IDEVICE_ACTIVATION_E_SUCCESS;
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_free(idevice_activation_request_t request)
+void idevice_activation_request_free(idevice_activation_request_t request)
{
if (!request)
return;
@@ -893,7 +859,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_free(idevice_activation_r
free(request);
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields)
+void idevice_activation_request_get_fields(idevice_activation_request_t request, plist_t* fields)
{
if (!request || !fields)
return;
@@ -901,7 +867,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_get_fields(idevice_activa
*fields = plist_copy(request->fields);
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields)
+void idevice_activation_request_set_fields(idevice_activation_request_t request, plist_t fields)
{
if (!request || !fields)
return;
@@ -923,7 +889,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields(idevice_activa
plist_dict_merge(&request->fields, fields);
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response)
+void idevice_activation_request_set_fields_from_response(idevice_activation_request_t request, const idevice_activation_response_t response)
{
if (!request || !response)
return;
@@ -936,7 +902,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_fields_from_response(
}
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value)
+void idevice_activation_request_set_field(idevice_activation_request_t request, const char* key, const char* value)
{
if (!request || !key || !value)
return;
@@ -944,7 +910,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_field(idevice_activat
plist_dict_set_item(request->fields, key, plist_new_string(value));
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value)
+void idevice_activation_request_get_field(idevice_activation_request_t request, const char* key, char** value)
{
if (!request || !key || !value)
return;
@@ -964,7 +930,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_get_field(idevice_activat
*value = tmp_value;
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url)
+void idevice_activation_request_get_url(idevice_activation_request_t request, const char** url)
{
if (!request || !url)
return;
@@ -972,7 +938,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_get_url(idevice_activatio
*url = request->url;
}
-IDEVICE_ACTIVATION_API void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url)
+void idevice_activation_request_set_url(idevice_activation_request_t request, const char* url)
{
if (!request || !url)
return;
@@ -981,7 +947,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_request_set_url(idevice_activatio
request->url = strdup(url);
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response)
+idevice_activation_error_t idevice_activation_response_new(idevice_activation_response_t* response)
{
if (!response)
return IDEVICE_ACTIVATION_E_INTERNAL_ERROR;
@@ -1012,7 +978,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_ne
return IDEVICE_ACTIVATION_E_SUCCESS;
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response)
+idevice_activation_error_t idevice_activation_response_new_from_html(const char* content, idevice_activation_response_t* response)
{
if (!content || !response)
return IDEVICE_ACTIVATION_E_INTERNAL_ERROR;
@@ -1050,7 +1016,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_ne
return result;
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size)
+idevice_activation_error_t idevice_activation_response_to_buffer(idevice_activation_response_t response, char** buffer, size_t* size)
{
if (!response || !buffer || !size)
return IDEVICE_ACTIVATION_E_INTERNAL_ERROR;
@@ -1068,7 +1034,7 @@ IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_response_to
return IDEVICE_ACTIVATION_E_SUCCESS;
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_response_t response)
+void idevice_activation_response_free(idevice_activation_response_t response)
{
if (!response)
return;
@@ -1086,7 +1052,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_free(idevice_activation_
free(response);
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value)
+void idevice_activation_response_get_field(idevice_activation_response_t response, const char* key, char** value)
{
if (!response || !key || !value)
return;
@@ -1099,14 +1065,14 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_field(idevice_activa
}
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields)
+void idevice_activation_response_get_fields(idevice_activation_response_t response, plist_t* fields)
{
if (response && response->fields && fields) {
*fields = plist_copy(response->fields);
}
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value)
+void idevice_activation_response_get_label(idevice_activation_response_t response, const char* key, char** value)
{
if (!response || !key || !value)
return;
@@ -1118,7 +1084,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_label(idevice_activa
}
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char** value)
+void idevice_activation_response_get_placeholder(idevice_activation_response_t response, const char* key, char** value)
{
if (!response || !key || !value)
return;
@@ -1130,7 +1096,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_placeholder(idevice_
}
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title)
+void idevice_activation_response_get_title(idevice_activation_response_t response, const char** title)
{
if (!response || !title)
return;
@@ -1138,7 +1104,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_title(idevice_activa
*title = response->title;
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description)
+void idevice_activation_response_get_description(idevice_activation_response_t response, const char** description)
{
if (!response || !description)
return;
@@ -1146,7 +1112,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_description(idevice_
*description = response->description;
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record)
+void idevice_activation_response_get_activation_record(idevice_activation_response_t response, plist_t* activation_record)
{
if (!response || !activation_record)
return;
@@ -1158,7 +1124,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_activation_record(id
}
}
-IDEVICE_ACTIVATION_API void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers)
+void idevice_activation_response_get_headers(idevice_activation_response_t response, plist_t* headers)
{
if (!response || !headers)
return;
@@ -1166,7 +1132,7 @@ IDEVICE_ACTIVATION_API void idevice_activation_response_get_headers(idevice_acti
*headers = plist_copy(response->headers);
}
-IDEVICE_ACTIVATION_API int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response)
+int idevice_activation_response_is_activation_acknowledged(idevice_activation_response_t response)
{
if (!response)
return 0;
@@ -1174,7 +1140,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_is_activation_acknowledge
return response->is_activation_ack;
}
-IDEVICE_ACTIVATION_API int idevice_activation_response_is_authentication_required(idevice_activation_response_t response)
+int idevice_activation_response_is_authentication_required(idevice_activation_response_t response)
{
if (!response)
return 0;
@@ -1182,7 +1148,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_is_authentication_require
return response->is_auth_required;
}
-IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key)
+int idevice_activation_response_field_requires_input(idevice_activation_response_t response, const char* key)
{
if (!response || !key)
return 0;
@@ -1190,7 +1156,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_field_requires_input(idev
return (plist_dict_get_item(response->fields_require_input, key) ? 1 : 0);
}
-IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key)
+int idevice_activation_response_field_secure_input(idevice_activation_response_t response, const char* key)
{
if (!response || !key)
return 0;
@@ -1198,7 +1164,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_field_secure_input(idevic
return (plist_dict_get_item(response->fields_secure_input, key) ? 1 : 0);
}
-IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activation_response_t response)
+int idevice_activation_response_has_errors(idevice_activation_response_t response)
{
if (!response)
return 0;
@@ -1206,7 +1172,7 @@ IDEVICE_ACTIVATION_API int idevice_activation_response_has_errors(idevice_activa
return response->has_errors;
}
-IDEVICE_ACTIVATION_API idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response)
+idevice_activation_error_t idevice_activation_send_request(idevice_activation_request_t request, idevice_activation_response_t* response)
{
idevice_activation_error_t result = IDEVICE_ACTIVATION_E_SUCCESS;
diff --git a/tools/ideviceactivation.c b/tools/ideviceactivation.c
index 757c54e..0ea3901 100644
--- a/tools/ideviceactivation.c
+++ b/tools/ideviceactivation.c
@@ -30,7 +30,7 @@
#include <string.h>
#include <unistd.h>
#include <ctype.h>
-#ifndef WIN32
+#ifndef _WIN32
#include <signal.h>
#endif
@@ -40,7 +40,7 @@
#include <libimobiledevice/mobileactivation.h>
#include <libideviceactivation.h>
-#ifdef WIN32
+#ifdef _WIN32
#include <windows.h>
#include <conio.h>
#else
@@ -60,6 +60,7 @@ static void print_usage(int argc, char **argv)
printf(" activate\t\tattempt to activate the device\n");
printf(" deactivate\t\tdeactivate the device\n");
printf(" state\t\t\tquery device about its activation state\n");
+ printf(" itunes\t\ttell the device that it has been connected to iTunes (useful for < iOS 4)\n");
printf("\n");
printf("The following OPTIONS are accepted:\n");
printf(" -d, --debug\t\tenable communication debugging\n");
@@ -74,7 +75,7 @@ static void print_usage(int argc, char **argv)
printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
}
-#ifdef WIN32
+#ifdef _WIN32
#define BS_CC '\b'
#define my_getch getch
#else
@@ -142,11 +143,11 @@ int main(int argc, char *argv[])
int use_network = 0;
typedef enum {
- OP_NONE = 0, OP_ACTIVATE, OP_DEACTIVATE, OP_GETSTATE
+ OP_NONE = 0, OP_ACTIVATE, OP_DEACTIVATE, OP_GETSTATE, OP_ITUNES
} op_t;
op_t op = OP_NONE;
-#ifndef WIN32
+#ifndef _WIN32
signal(SIGPIPE, SIG_IGN);
#endif
/* parse cmdline args */
@@ -202,6 +203,10 @@ int main(int argc, char *argv[])
op = OP_GETSTATE;
continue;
}
+ else if (!strcmp(argv[i], "itunes")) {
+ op = OP_ITUNES;
+ continue;
+ }
else {
print_usage(argc, argv);
return EXIT_SUCCESS;
@@ -602,6 +607,18 @@ int main(int argc, char *argv[])
}
}
break;
+
+ case OP_ITUNES: {
+ // set iTunesHasConnected if we succeeded
+ if (LOCKDOWN_E_SUCCESS != lockdownd_set_value(lockdown, NULL, "iTunesHasConnected", plist_new_bool(1))) {
+ fprintf(stderr, "Failed to set iTunesHasConnected on device.\n");
+ result = EXIT_FAILURE;
+ goto cleanup;
+ }
+ result = EXIT_SUCCESS;
+ printf("Successfully set 'iTunesHasConnected'.\n");
+ }
+ break;
}
cleanup: