diff options
-rw-r--r-- | configure.ac | 7 | ||||
-rw-r--r-- | src/libirecovery.c | 80 |
2 files changed, 53 insertions, 34 deletions
diff --git a/configure.ac b/configure.ac index f4bbad3..07ebf77 100644 --- a/configure.ac +++ b/configure.ac @@ -87,9 +87,14 @@ case ${host_os} in esac AM_CONDITIONAL(WIN32, test x$win32 = xtrue) -AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith -Wwrite-strings -Wswitch-default -Wno-unused-parameter") +AS_COMPILER_FLAGS(GLOBAL_CFLAGS, "-Wall -Wextra -Wmissing-declarations -Wredundant-decls -Wshadow -Wpointer-arith -Wwrite-strings -Wswitch-default -Wno-unused-parameter -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_OUTPUT([ diff --git a/src/libirecovery.c b/src/libirecovery.c index f66eff7..b4e3e0c 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c @@ -18,6 +18,10 @@ * Lesser General Public License for more details. */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + #include <stdio.h> #include <stdint.h> #include <stdlib.h> @@ -41,6 +45,16 @@ #endif #endif +#ifdef WIN32 +#define IRECV_API __declspec( dllexport ) +#else +#ifdef HAVE_FVISIBILITY +#define IRECV_API __attribute__((visibility("default"))) +#else +#define IRECV_API +#endif +#endif + #include "libirecovery.h" struct irecv_client_private { @@ -625,13 +639,13 @@ static int check_context(irecv_client_t client) { return IRECV_E_SUCCESS; } -void irecv_init() { +IRECV_API void irecv_init() { #ifndef WIN32 libusb_init(&libirecovery_context); #endif } -void irecv_exit() { +IRECV_API void irecv_exit() { #ifndef WIN32 if (libirecovery_context != NULL) { libusb_exit(libirecovery_context); @@ -715,7 +729,7 @@ int irecv_usb_bulk_transfer(irecv_client_t client, return ret; } -irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, unsigned long long ecid) { +IRECV_API irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, unsigned long long ecid) { if(libirecovery_debug) { irecv_set_debug_level(libirecovery_debug); } @@ -851,7 +865,7 @@ irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, unsigned long long e #endif } -irecv_error_t irecv_usb_set_configuration(irecv_client_t client, int configuration) { +IRECV_API irecv_error_t irecv_usb_set_configuration(irecv_client_t client, int configuration) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -872,7 +886,7 @@ irecv_error_t irecv_usb_set_configuration(irecv_client_t client, int configurati return IRECV_E_SUCCESS; } -irecv_error_t irecv_usb_set_interface(irecv_client_t client, int usb_interface, int usb_alt_interface) { +IRECV_API irecv_error_t irecv_usb_set_interface(irecv_client_t client, int usb_interface, int usb_alt_interface) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -896,7 +910,7 @@ irecv_error_t irecv_usb_set_interface(irecv_client_t client, int usb_interface, return IRECV_E_SUCCESS; } -irecv_error_t irecv_reset(irecv_client_t client) { +IRECV_API irecv_error_t irecv_reset(irecv_client_t client) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -910,7 +924,7 @@ irecv_error_t irecv_reset(irecv_client_t client) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_open_with_ecid_and_attempts(irecv_client_t* pclient, unsigned long long ecid, int attempts) { +IRECV_API irecv_error_t irecv_open_with_ecid_and_attempts(irecv_client_t* pclient, unsigned long long ecid, int attempts) { int i; for (i = 0; i < attempts; i++) { @@ -929,7 +943,7 @@ irecv_error_t irecv_open_with_ecid_and_attempts(irecv_client_t* pclient, unsigne return IRECV_E_UNABLE_TO_CONNECT; } -irecv_error_t irecv_event_subscribe(irecv_client_t client, irecv_event_type type, irecv_event_cb_t callback, void* user_data) { +IRECV_API irecv_error_t irecv_event_subscribe(irecv_client_t client, irecv_event_type type, irecv_event_cb_t callback, void* user_data) { switch(type) { case IRECV_RECEIVED: client->received_callback = callback; @@ -959,7 +973,7 @@ irecv_error_t irecv_event_subscribe(irecv_client_t client, irecv_event_type type return IRECV_E_SUCCESS; } -irecv_error_t irecv_event_unsubscribe(irecv_client_t client, irecv_event_type type) { +IRECV_API irecv_error_t irecv_event_unsubscribe(irecv_client_t client, irecv_event_type type) { switch(type) { case IRECV_RECEIVED: client->received_callback = NULL; @@ -989,7 +1003,7 @@ irecv_error_t irecv_event_unsubscribe(irecv_client_t client, irecv_event_type ty return IRECV_E_SUCCESS; } -irecv_error_t irecv_close(irecv_client_t client) { +IRECV_API irecv_error_t irecv_close(irecv_client_t client) { if (client != NULL) { if(client->disconnected_callback != NULL) { irecv_event_t event; @@ -1037,7 +1051,7 @@ irecv_error_t irecv_close(irecv_client_t client) { return IRECV_E_SUCCESS; } -void irecv_set_debug_level(int level) { +IRECV_API void irecv_set_debug_level(int level) { libirecovery_debug = level; #ifndef WIN32 if(libirecovery_context) { @@ -1059,7 +1073,7 @@ static irecv_error_t irecv_send_command_raw(irecv_client_t client, const char* c return IRECV_E_SUCCESS; } -irecv_error_t irecv_send_command(irecv_client_t client, const char* command) { +IRECV_API irecv_error_t irecv_send_command(irecv_client_t client, const char* command) { irecv_error_t error = 0; if (check_context(client) != IRECV_E_SUCCESS) @@ -1099,7 +1113,7 @@ irecv_error_t irecv_send_command(irecv_client_t client, const char* command) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_send_file(irecv_client_t client, const char* filename, int dfu_notify_finished) { +IRECV_API irecv_error_t irecv_send_file(irecv_client_t client, const char* filename, int dfu_notify_finished) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -1150,7 +1164,7 @@ static irecv_error_t irecv_get_status(irecv_client_t client, unsigned int* statu return IRECV_E_SUCCESS; } -irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, unsigned long length, int dfu_notify_finished) { +IRECV_API irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, unsigned long length, int dfu_notify_finished) { irecv_error_t error = 0; int recovery_mode = ((client->mode != IRECV_K_DFU_MODE) && (client->mode != IRECV_K_WTF_MODE)); @@ -1287,7 +1301,7 @@ irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, un return IRECV_E_SUCCESS; } -irecv_error_t irecv_receive(irecv_client_t client) { +IRECV_API irecv_error_t irecv_receive(irecv_client_t client) { char buffer[BUFFER_SIZE]; memset(buffer, '\0', BUFFER_SIZE); @@ -1312,7 +1326,7 @@ irecv_error_t irecv_receive(irecv_client_t client) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_getenv(irecv_client_t client, const char* variable, char** value) { +IRECV_API irecv_error_t irecv_getenv(irecv_client_t client, const char* variable, char** value) { char command[256]; if (check_context(client) != IRECV_E_SUCCESS) @@ -1348,7 +1362,7 @@ irecv_error_t irecv_getenv(irecv_client_t client, const char* variable, char** v return IRECV_E_SUCCESS; } -irecv_error_t irecv_getret(irecv_client_t client, unsigned int* value) { +IRECV_API irecv_error_t irecv_getret(irecv_client_t client, unsigned int* value) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -1367,7 +1381,7 @@ irecv_error_t irecv_getret(irecv_client_t client, unsigned int* value) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_get_mode(irecv_client_t client, int* mode) { +IRECV_API irecv_error_t irecv_get_mode(irecv_client_t client, int* mode) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -1376,7 +1390,7 @@ irecv_error_t irecv_get_mode(irecv_client_t client, int* mode) { return IRECV_E_SUCCESS; } -const struct irecv_device_info* irecv_get_device_info(irecv_client_t client) +IRECV_API const struct irecv_device_info* irecv_get_device_info(irecv_client_t client) { if (check_context(client) != IRECV_E_SUCCESS) return NULL; @@ -1384,7 +1398,7 @@ const struct irecv_device_info* irecv_get_device_info(irecv_client_t client) return &client->device_info; } -irecv_error_t irecv_trigger_limera1n_exploit(irecv_client_t client) { +IRECV_API irecv_error_t irecv_trigger_limera1n_exploit(irecv_client_t client) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -1393,7 +1407,7 @@ irecv_error_t irecv_trigger_limera1n_exploit(irecv_client_t client) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_execute_script(irecv_client_t client, const char* script) { +IRECV_API irecv_error_t irecv_execute_script(irecv_client_t client, const char* script) { irecv_error_t error = IRECV_E_SUCCESS; if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -1422,7 +1436,7 @@ irecv_error_t irecv_execute_script(irecv_client_t client, const char* script) { return error; } -irecv_error_t irecv_saveenv(irecv_client_t client) { +IRECV_API irecv_error_t irecv_saveenv(irecv_client_t client) { irecv_error_t error = irecv_send_command_raw(client, "saveenv"); if(error != IRECV_E_SUCCESS) { return error; @@ -1431,7 +1445,7 @@ irecv_error_t irecv_saveenv(irecv_client_t client) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_setenv(irecv_client_t client, const char* variable, const char* value) { +IRECV_API irecv_error_t irecv_setenv(irecv_client_t client, const char* variable, const char* value) { char command[256]; if (check_context(client) != IRECV_E_SUCCESS) @@ -1451,7 +1465,7 @@ irecv_error_t irecv_setenv(irecv_client_t client, const char* variable, const ch return IRECV_E_SUCCESS; } -irecv_error_t irecv_reboot(irecv_client_t client) { +IRECV_API irecv_error_t irecv_reboot(irecv_client_t client) { irecv_error_t error = irecv_send_command_raw(client, "reboot"); if(error != IRECV_E_SUCCESS) { return error; @@ -1460,7 +1474,7 @@ irecv_error_t irecv_reboot(irecv_client_t client) { return IRECV_E_SUCCESS; } -const char* irecv_strerror(irecv_error_t error) { +IRECV_API const char* irecv_strerror(irecv_error_t error) { switch (error) { case IRECV_E_SUCCESS: return "Command completed successfully"; @@ -1505,7 +1519,7 @@ const char* irecv_strerror(irecv_error_t error) { return NULL; } -irecv_error_t irecv_reset_counters(irecv_client_t client) { +IRECV_API irecv_error_t irecv_reset_counters(irecv_client_t client) { if (check_context(client) != IRECV_E_SUCCESS) return IRECV_E_NO_DEVICE; @@ -1516,7 +1530,7 @@ irecv_error_t irecv_reset_counters(irecv_client_t client) { return IRECV_E_SUCCESS; } -irecv_error_t irecv_recv_buffer(irecv_client_t client, char* buffer, unsigned long length) { +IRECV_API irecv_error_t irecv_recv_buffer(irecv_client_t client, char* buffer, unsigned long length) { int recovery_mode = ((client->mode != IRECV_K_DFU_MODE) && (client->mode != IRECV_K_WTF_MODE)); if (check_context(client) != IRECV_E_SUCCESS) @@ -1558,7 +1572,7 @@ irecv_error_t irecv_recv_buffer(irecv_client_t client, char* buffer, unsigned lo return IRECV_E_SUCCESS; } -irecv_error_t irecv_finish_transfer(irecv_client_t client) { +IRECV_API irecv_error_t irecv_finish_transfer(irecv_client_t client) { int i = 0; unsigned int status = 0; @@ -1576,11 +1590,11 @@ irecv_error_t irecv_finish_transfer(irecv_client_t client) { return IRECV_E_SUCCESS; } -irecv_device_t irecv_devices_get_all() { +IRECV_API irecv_device_t irecv_devices_get_all() { return irecv_devices; } -irecv_error_t irecv_devices_get_device_by_client(irecv_client_t client, irecv_device_t* device) { +IRECV_API irecv_error_t irecv_devices_get_device_by_client(irecv_client_t client, irecv_device_t* device) { int i = 0; *device = NULL; @@ -1599,7 +1613,7 @@ irecv_error_t irecv_devices_get_device_by_client(irecv_client_t client, irecv_de return IRECV_E_NO_DEVICE; } -irecv_error_t irecv_devices_get_device_by_product_type(const char* product_type, irecv_device_t* device) { +IRECV_API irecv_error_t irecv_devices_get_device_by_product_type(const char* product_type, irecv_device_t* device) { int i = 0; *device = NULL; @@ -1614,7 +1628,7 @@ irecv_error_t irecv_devices_get_device_by_product_type(const char* product_type, return IRECV_E_NO_DEVICE; } -irecv_error_t irecv_devices_get_device_by_hardware_model(const char* hardware_model, irecv_device_t* device) { +IRECV_API irecv_error_t irecv_devices_get_device_by_hardware_model(const char* hardware_model, irecv_device_t* device) { int i = 0; *device = NULL; @@ -1635,7 +1649,7 @@ irecv_error_t irecv_devices_get_device_by_hardware_model(const char* hardware_mo return IRECV_E_NO_DEVICE; } -irecv_client_t irecv_reconnect(irecv_client_t client, int initial_pause) { +IRECV_API irecv_client_t irecv_reconnect(irecv_client_t client, int initial_pause) { irecv_error_t error = 0; irecv_client_t new_client = NULL; irecv_event_cb_t progress_callback = client->progress_callback; |