From: MyoungWoon Roy Kim Date: Wed, 1 Dec 2010 12:09:05 +0000 (+0900) Subject: [SVN EFL Migration] ecore in SLP is merged into SVN r55079. X-Git-Tag: 2.0_alpha~268 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3dad4401376a31f2d7d45a00b04f9db49ff6091;p=framework%2Fuifw%2Fecore.git [SVN EFL Migration] ecore in SLP is merged into SVN r55079. --- diff --git a/AUTHORS b/AUTHORS index 7784236..2c8f468 100644 --- a/AUTHORS +++ b/AUTHORS @@ -29,7 +29,7 @@ Lars Munch Andre Dieb Mathieu Taillefumier Rui Miguel Silva Seabra -Saumsung Electronics +Samsung Electronics Samsung SAIT Nicolas Aguirre Brett Nash diff --git a/configure.ac b/configure.ac index ef73240..6f921b3 100644 --- a/configure.ac +++ b/configure.ac @@ -18,7 +18,7 @@ m4_define([lt_age], v_min) ##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## ##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--##--## -AC_INIT([ecore], [v_ver.beta], [enlightenment-devel@lists.sourceforge.net]) +AC_INIT([ecore], [v_ver.beta2], [enlightenment-devel@lists.sourceforge.net]) AC_PREREQ([2.52]) AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_MACRO_DIR([m4]) @@ -912,8 +912,7 @@ m4_ifdef([AC_PROG_OBJC], [ ]) AC_SUBST(cocoa_ldflags) -### commented out to avoid ERR<31094> - Failed to create epoll fd! / Failed to add poll on fd -#want_epoll=yes +want_epoll=yes AC_ARG_ENABLE(epoll, AC_HELP_STRING([--enable-epoll], [enable or disable epoll support]), [want_epoll=$enableval]) @@ -924,9 +923,21 @@ if test "x${want_epoll}" = "xyes" ; then fi -# basic pthread support +# thread support -EFL_CHECK_PTHREAD([no], [have_pthread="yes"], [have_pthread="no"]) +EFL_CHECK_THREADS( + [ + if test "x${_efl_have_posix_threads}" = "xyes" ; then + have_threads="POSIX" + else + if test "x${_efl_have_win32_threads}" = "xyes" ; then + have_threads="Win32" + else + have_threads="no" + fi + fi + ], + [have_threads="no"]) ### Checks for types AC_CHECK_SIZEOF(int, 4) @@ -1423,7 +1434,7 @@ echo echo " Core:" echo echo " Ecore........................: always" -echo " Thread support.............: $have_pthread" +echo " Thread support.............: $have_threads" echo " GLib support...............: $have_glib" echo " Always integrate GLib......: $want_glib_integration_always" echo " Use g_main_loop............: $want_g_main_loop" diff --git a/debian/changelog b/debian/changelog index cda9272..dca0c2e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,36 +1,3 @@ -ecore (1.0.0.001+svn.51480slp2+build28) unstable; urgency=low - - * [ecore_evas] Patch code for rotation. - * Git: 165.213.180.234:/git/slp/pkgs/ecore - * Tag: ecore_1.0.0.001+svn.51480slp2+build28 - - -- Doyoun Kang Mon, 29 Nov 2010 10:14:56 +0900 - -ecore (1.0.0.001+svn.51480slp2+build27) unstable; urgency=low - - * [ecore_evas.c] change FPS rate print it every 0.1 sec - * Git: 165.213.180.234:/git/slp/pkgs/ecore - * Tag: ecore_1.0.0.001+svn.51480slp2+build27 - - -- Seokjae Jeong Sat, 27 Nov 2010 15:06:21 +0900 - -ecore (1.0.0.001+svn.51480slp2+build26) unstable; urgency=low - - * [ecore_imf] remove unused typedefs - * Git: 165.213.180.234:/git/slp/pkgs/ecore - * Tag: ecore_1.0.0.001+svn.51480slp2+build26 - - -- Jihoon Kim Fri, 26 Nov 2010 17:56:05 +0900 - -ecore (1.0.0.001+svn.51480slp2+build25) unstable; urgency=low - - * [SVN 54830 Merge] - * Update to SVN Revision 54830. - * Git: 165.213.180.234:/git/slp/pkgs/ecore - * Tag: ecore_1.0.0.001+svn.51480slp2+build25 - - -- Juyung Seo Fri, 26 Nov 2010 15:31:53 +0900 - ecore (1.0.0.001+svn.51480slp2+build19) unstable; urgency=low * libcurl-dev -> libcurl4-openssl-dev diff --git a/examples/client_bench.c b/examples/client_bench.c new file mode 100644 index 0000000..93a0fb1 --- /dev/null +++ b/examples/client_bench.c @@ -0,0 +1,77 @@ +#include +#include +#include + +/* Ecore_Con client example + * 2010 Mike Blumenkrantz + */ + +#define NUM_CLIENTS 10000 + +static Eina_Counter *counter; +static int add = 0; +static int del = 0; + +Eina_Bool +_add(void *data, int type, Ecore_Con_Event_Server_Add *ev) +{ + ++add; + printf("Connection #%i!\n", add); + if (add == NUM_CLIENTS) + ecore_main_loop_quit(); + + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool +_del(void *data, int type, Ecore_Con_Event_Server_Add *ev) +{ + ++del; + printf("Connection lost! #%i!\n", del); + + return ECORE_CALLBACK_RENEW; +} + +static void +_spawn(void *data) +{ + int x; + + for (x = 0; x < NUM_CLIENTS; x++) + { +// printf("Creating connection %i\n", x); + if (!ecore_con_server_connect(ECORE_CON_REMOTE_NODELAY, "127.0.0.1", 8080, NULL)) + { + printf("CRITICAL ERROR!\n" + "Could not create connection #%i!\n", x); + exit(1); + } + } + printf("***Job done***\n"); +} + +int main(void) +{ + double done; + eina_init(); + ecore_init(); + ecore_con_init(); + + eina_log_domain_level_set("ecore_con", EINA_LOG_LEVEL_ERR); + eina_log_domain_level_set("eina", EINA_LOG_LEVEL_ERR); + counter = eina_counter_new("client"); + eina_counter_start(counter); + done = ecore_time_get(); + + ecore_job_add(_spawn, NULL); + +/* set event handler for server connect */ + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_add, NULL); + ecore_event_handler_add(ECORE_CON_EVENT_SERVER_ADD, (Ecore_Event_Handler_Cb)_del, NULL); + +/* start client */ + ecore_main_loop_begin(); + eina_counter_stop(counter, 1); + printf("\nTime elapsed for %i connections: %f seconds\n%s", NUM_CLIENTS, ecore_time_get() - done, eina_counter_dump(counter)); + return 0; +} diff --git a/examples/server_bench.c b/examples/server_bench.c new file mode 100644 index 0000000..db0020c --- /dev/null +++ b/examples/server_bench.c @@ -0,0 +1,62 @@ +#include +#include +#include + +/* Ecore_Con server example + * 2010 Mike Blumenkrantz + */ + +static Ecore_Con_Server *svr; +static int add; +static int del; + +Eina_Bool +_add(void *data, int type, Ecore_Con_Event_Client_Add *ev) +{ + ++add; +// printf ("%s ", ecore_con_client_ip_get(ev->client)); + printf("Client #%i!\n", add); + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool +_del(void *data, int type, Ecore_Con_Event_Client_Del *ev) +{ + ++del; + printf("Disconnected #%i!\n", del); + if (add == del) + ecore_main_loop_quit(); + return ECORE_CALLBACK_RENEW; +} + +int main(int argc, const char *argv[]) +{ + ecore_init(); + ecore_con_init(); + ecore_app_args_set(argc, argv); + eina_log_domain_level_set("ecore_con", EINA_LOG_LEVEL_ERR); + eina_log_domain_level_set("eina", EINA_LOG_LEVEL_ERR); + + +/* to use a PEM certificate with TLS and SSL3, uncomment the lines below */ +// if (!(svr = ecore_con_server_add(ECORE_CON_REMOTE_NODELAY | ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT, "127.0.0.1", 8080, NULL))) + +/* to use simple tcp with ssl/tls, use this line */ + svr = ecore_con_server_add(ECORE_CON_REMOTE_NODELAY , "127.0.0.1", 8080, NULL); + if (!svr) + exit(1); + + ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_ADD, (Ecore_Event_Handler_Cb)_add, NULL); + ecore_event_handler_add(ECORE_CON_EVENT_CLIENT_DEL, (Ecore_Event_Handler_Cb)_del, NULL); + +/* start server */ + ecore_main_loop_begin(); + if (add && del) + { + printf("Restarting server after %i connections\n", add); + add = del = 0; + ecore_con_server_del(svr); + ecore_app_restart(); + } + return 0; +} diff --git a/m4/efl_threads.m4 b/m4/efl_threads.m4 new file mode 100644 index 0000000..33d15a3 --- /dev/null +++ b/m4/efl_threads.m4 @@ -0,0 +1,206 @@ +dnl Copyright (C) 2010 Vincent Torri +dnl rwlock code added by Mike Blumenkrantz +dnl This code is public domain and can be freely used or copied. + +dnl Macro that check if POSIX or Win32 threads library is available or not. + +dnl Usage: EFL_CHECK_THREADS(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) +dnl Call AC_SUBST(EFL_PTHREAD_CFLAGS) +dnl Call AC_SUBST(EFL_PTHREAD_LIBS) +dnl Defines EFL_HAVE_POSIX_THREADS or EFL_HAVE_WIN32_THREADS, and EFL_HAVE_THREADS + +AC_DEFUN([EFL_CHECK_THREADS], +[ + +dnl configure option + +AC_ARG_ENABLE([posix-threads], + [AC_HELP_STRING([--disable-posix-threads], [enable POSIX threads code @<:@default=auto@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + _efl_enable_posix_threads="yes" + else + _efl_enable_posix_threads="no" + fi + ], + [_efl_enable_posix_threads="auto"]) + +AC_MSG_CHECKING([whether to build POSIX threads code]) +AC_MSG_RESULT([${_efl_enable_posix_threads}]) + +AC_ARG_ENABLE([win32-threads], + [AC_HELP_STRING([--disable-win32-threads], [enable Win32 threads code @<:@default=no@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + _efl_enable_win32_threads="yes" + else + _efl_enable_win32_threads="no" + fi + ], + [_efl_enable_win32_threads="no"]) + +AC_MSG_CHECKING([whether to build Windows threads code]) +AC_MSG_RESULT([${_efl_enable_win32_threads}]) + +dnl +dnl * no + no +dnl * yes + no : win32: error, other : pthread +dnl * yes + yes : win32 : wthread, other : pthread +dnl * no + yes : win32 : wthread, other : error + +if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_enable_win32_threads}" = "xyes" ; then + case "$host_os" in + mingw*) + _efl_enable_posix_threads=no + ;; + *) + _efl_enable_win32_threads=no + ;; + esac +fi + +if test "x${_efl_enable_win32_threads}" = "xyes" ; then + case "$host_os" in + mingw*) + ;; + *) + AC_MSG_ERROR([Win32 threads support requested but non Windows system found.]) + ;; + esac +fi + +if test "x${_efl_enable_posix_threads}" = "xyes" ; then + case "$host_os" in + mingw*) + AC_MSG_ERROR([POSIX threads support requested but Windows system found.]) + ;; + *) + ;; + esac +fi + +dnl check if the compiler supports POSIX threads + +case "$host_os" in + mingw*) + ;; + solaris*) + _efl_threads_cflags="-mt" + _efl_threads_libs="-mt" + ;; + *) + _efl_threads_cflags="-pthread" + _efl_threads_libs="-pthread" + ;; +esac + +_efl_have_posix_threads="no" +_efl_have_win32_threads="no" + +if test "x${_efl_enable_posix_threads}" = "xyes" || test "x${_efl_enable_posix_threads}" = "xauto" ; then + + SAVE_CFLAGS=${CFLAGS} + CFLAGS="${CFLAGS} ${_efl_threads_cflags}" + SAVE_LIBS=${LIBS} + LIBS="${LIBS} ${_efl_threads_libs}" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[ +#include + ]], + [[ +pthread_t id; +id = pthread_self(); + ]])], + [_efl_have_posix_threads="yes"], + [_efl_have_posix_threads="no"]) + CFLAGS=${SAVE_CFLAGS} + LIBS=${SAVE_LIBS} + +fi + +AC_MSG_CHECKING([whether system support POSIX threads]) +AC_MSG_RESULT([${_efl_have_posix_threads}]) +if test "$x{_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads}" = "xno"; then + AC_MSG_ERROR([POSIX threads support requested but not found.]) +fi + +EFL_PTHREAD_CFLAGS="" +EFL_PTHREAD_LIBS="" +if test "x${_efl_have_posix_threads}" = "xyes" ; then + EFL_PTHREAD_CFLAGS=${_efl_threads_cflags} + EFL_PTHREAD_LIBS=${_efl_threads_libs} +fi + +AC_SUBST(EFL_PTHREAD_CFLAGS) +AC_SUBST(EFL_PTHREAD_LIBS) + +_efl_enable_debug_threads="no" +AC_ARG_ENABLE([debug-threads], + [AC_HELP_STRING([--enable-debug-threads], [disable assert when you forgot to call eina_threads_init])], + [_efl_enable_debug_threads="${enableval}"]) + +have_debug_threads="no" +if test "x${_efl_have_posix_threads}" = "xyes" -a "x${_efl_enable_debug_threads}" = "xyes"; then + have_debug_threads="yes" + AC_DEFINE([EFL_DEBUG_THREADS], [1], [Assert when forgot to call eina_threads_init]) +fi + +if test "x${_efl_have_posix_threads}" = "xyes" ; then + AC_DEFINE([EFL_HAVE_POSIX_THREADS], [1], [Define to mention that POSIX threads are supported]) +fi + +if test "x${_efl_enable_win32_threads}" = "xyes" ; then + _efl_have_win32_threads="yes" + AC_DEFINE([EFL_HAVE_WIN32_THREADS], [1], [Define to mention that Win32 threads are supported]) +fi + +if test "x${_efl_have_posix_threads}" = "xyes" || test "x${_efl_have_win32_threads}" = "xyes" ; then + AC_DEFINE([EFL_HAVE_THREADS], [1], [Define to mention that POSIX or Win32 threads are supported]) +fi + +AS_IF([test "x$_efl_have_posix_threads" = "xyes" || test "x$_efl_have_win32_threads" = "xyes"], [$1], [$2]) +]) + +dnl Usage: EFL_CHECK_SPINLOCK(ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]) +dnl Defines EFL_HAVE_POSIX_THREADS_SPINLOCK +AC_DEFUN([EFL_CHECK_SPINLOCK], +[ + +dnl check if the compiler supports pthreads spinlock + +_efl_have_posix_threads_spinlock="no" + +if test "x${_efl_have_posix_threads}" = "xyes" ; then + + SAVE_CFLAGS=${CFLAGS} + CFLAGS="${CFLAGS} ${EFL_PTHREAD_CFLAGS}" + SAVE_LIBS=${LIBS} + LIBS="${LIBS} ${EFL_PTHREAD_LIBS}" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[ +#include + ]], + [[ +pthread_spinlock_t lock; +int res; +res = pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE); + ]])], + [_efl_have_posix_threads_spinlock="yes"], + [_efl_have_posix_threads_spinlock="no"]) + CFLAGS=${SAVE_CFLAGS} + LIBS=${SAVE_LIBS} + +fi + +AC_MSG_CHECKING([whether to build POSIX threads spinlock code]) +AC_MSG_RESULT([${_efl_have_posix_threads_spinlock}]) +if test "x${_efl_enable_posix_threads}" = "xyes" && test "x${_efl_have_posix_threads_spinlock}" = "xno" ; then + AC_MSG_WARN([POSIX threads support requested but spinlocks are not supported]) +fi + +if test "x${_efl_have_posix_threads_spinlock}" = "xyes" ; then + AC_DEFINE([EFL_HAVE_POSIX_THREADS_SPINLOCK], [1], [Define to mention that POSIX threads spinlocks are supported]) +fi +AS_IF([test "x$_efl_have_posix_threads_spinlock" = "xyes"], [$1], [$2]) +]) + diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 0c00c6a..e36b91d 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -1,20 +1,68 @@ ## Process this file with automake to produce Makefile.in MAINTAINERCLEANFILES = Makefile.in -SUBDIRS = \ -ecore \ -ecore_input \ -ecore_input_evas \ -ecore_fb \ -ecore_directfb \ -ecore_con \ -ecore_x \ -ecore_win32 \ -ecore_wince \ -ecore_sdl \ -ecore_cocoa \ -ecore_ipc \ -ecore_evas \ -ecore_config \ -ecore_file \ -ecore_imf \ -ecore_imf_evas +SUBDIRS = ecore + +if BUILD_ECORE_INPUT +SUBDIRS += ecore_input +endif + +if BUILD_ECORE_INPUT_EVAS + +SUBDIRS += ecore_input_evas +endif + +if BUILD_ECORE_FB +SUBDIRS += ecore_fb +endif + +if BUILD_ECORE_DIRECTFB +SUBDIRS += ecore_directfb +endif + +if BUILD_ECORE_CON +SUBDIRS += ecore_con +endif + +if BUILD_ECORE_X +SUBDIRS += ecore_x +endif + +if BUILD_ECORE_WIN32 +SUBDIRS += ecore_win32 +endif + +if BUILD_ECORE_WINCE +SUBDIRS += ecore_wince +endif + +if BUILD_ECORE_SDL +SUBDIRS += ecore_sdl +endif + +if BUILD_ECORE_COCOA +SUBDIRS += ecore_cocoa +endif + +if BUILD_ECORE_IPC +SUBDIRS += ecore_ipc +endif + +if BUILD_ECORE_EVAS +SUBDIRS += ecore_evas +endif + +if BUILD_ECORE_CONFIG +SUBDIRS += ecore_config +endif + +if BUILD_ECORE_FILE +SUBDIRS += ecore_file +endif + +if BUILD_ECORE_IMF +SUBDIRS += ecore_imf +endif + +if BUILD_ECORE_IMF_EVAS +SUBDIRS += ecore_imf_evas +endif diff --git a/src/lib/ecore/Ecore.h b/src/lib/ecore/Ecore.h index b786de6..d39e71f 100644 --- a/src/lib/ecore/Ecore.h +++ b/src/lib/ecore/Ecore.h @@ -205,15 +205,15 @@ extern "C" { */ typedef Eina_Bool (*Ecore_Event_Handler_Cb) (void *data, int type, void *event); /** - * @typedef Ecore_Thread_Heavy_Cb Ecore_Thread_Heavy_Cb - * A callback used to run cpu intensive or blocking I/O operations. + * @typedef Ecore_Thread_Cb Ecore_Thread_Cb + * A callback used by Ecore_Thread helper. */ - typedef void (*Ecore_Thread_Heavy_Cb) (Ecore_Thread *thread, void *data); + typedef void (*Ecore_Thread_Cb) (void *data, Ecore_Thread *thread); /** * @typedef Ecore_Thread_Notify_Cb Ecore_Thread_Notify_Cb * A callback used by the main loop to receive data sent by an @ref Ecore_Thread_Group. */ - typedef void (*Ecore_Thread_Notify_Cb) (Ecore_Thread *thread, void *msg_data, void *data); + typedef void (*Ecore_Thread_Notify_Cb) (void *data, Ecore_Thread *thread, void *msg_data); /** * @typedef Ecore_Task_Cb Ecore_Task_Cb * A callback run for a task (timer, idler, poller, animater, etc) @@ -361,6 +361,8 @@ extern "C" { EAPI void *ecore_event_handler_del(Ecore_Event_Handler *event_handler); EAPI Ecore_Event *ecore_event_add(int type, void *ev, Ecore_End_Cb func_free, void *data); EAPI void *ecore_event_del(Ecore_Event *event); + EAPI void *ecore_event_handler_data_get(Ecore_Event_Handler *eh); + EAPI void *ecore_event_handler_data_set(Ecore_Event_Handler *eh, void *data); EAPI int ecore_event_type_new(void); EAPI Ecore_Event_Filter *ecore_event_filter_add(Ecore_Data_Cb func_start, Ecore_Filter_Cb func_filter, Ecore_End_Cb func_end, const void *data); EAPI void *ecore_event_filter_del(Ecore_Event_Filter *ef); @@ -480,14 +482,14 @@ extern "C" { * @{ */ - EAPI Ecore_Thread *ecore_thread_run(Ecore_Thread_Heavy_Cb func_blocking, - Ecore_Cb func_end, - Ecore_Cb func_cancel, + EAPI Ecore_Thread *ecore_thread_run(Ecore_Thread_Cb func_blocking, + Ecore_Thread_Cb func_end, + Ecore_Thread_Cb func_cancel, const void *data); - EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Heavy_Cb func_heavy, + EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy, Ecore_Thread_Notify_Cb func_notify, - Ecore_Cb func_end, - Ecore_Cb func_cancel, + Ecore_Thread_Cb func_end, + Ecore_Thread_Cb func_cancel, const void *data, Eina_Bool try_no_queue); EAPI Eina_Bool ecore_thread_cancel(Ecore_Thread *thread); diff --git a/src/lib/ecore/Ecore_Getopt.h b/src/lib/ecore/Ecore_Getopt.h index 18a8459..a2dfd75 100644 --- a/src/lib/ecore/Ecore_Getopt.h +++ b/src/lib/ecore/Ecore_Getopt.h @@ -115,7 +115,7 @@ extern "C" { union { const char *strv; - unsigned char boolv; + Eina_Bool boolv; short shortv; int intv; long longv; @@ -128,7 +128,7 @@ extern "C" { struct _Ecore_Getopt_Desc_Callback { - unsigned char (*func)(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); + Eina_Bool (*func)(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); const void *data; Ecore_Getopt_Desc_Arg_Requirement arg_req; const char *def; @@ -161,7 +161,7 @@ extern "C" { const char *copyright; /**< if exists, --copyright will work */ const char *license; /**< if exists, --license will work */ const char *description; /**< long description, possible multiline */ - unsigned char strict : 1; /**< fail on errors */ + Eina_Bool strict : 1; /**< fail on errors */ const Ecore_Getopt_Desc descs[]; /* NULL terminated. */ }; @@ -387,14 +387,14 @@ extern "C" { EAPI void ecore_getopt_help(FILE *fp, const Ecore_Getopt *info); - EAPI unsigned char ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser); + EAPI Eina_Bool ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser); EAPI int ecore_getopt_parse(const Ecore_Getopt *parser, Ecore_Getopt_Value *values, int argc, char **argv); EAPI Eina_List *ecore_getopt_list_free(Eina_List *list); /* helper functions to be used with ECORE_GETOPT_CALLBACK_*() */ - EAPI unsigned char ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); - EAPI unsigned char ecore_getopt_callback_size_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); + EAPI Eina_Bool ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); + EAPI Eina_Bool ecore_getopt_callback_size_parse(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage); #ifdef __cplusplus diff --git a/src/lib/ecore/Makefile.am b/src/lib/ecore/Makefile.am index 37e7bda..df03673 100644 --- a/src/lib/ecore/Makefile.am +++ b/src/lib/ecore/Makefile.am @@ -46,6 +46,6 @@ endif endif libecore_la_LIBADD = @dlopen_libs@ @EINA_LIBS@ @EVIL_LIBS@ @GLIB_LIBS@ @WIN32_LIBS@ @LTLIBINTL@ @EFL_PTHREAD_LIBS@ @rt_libs@ -lm -libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ +libecore_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ @EFL_PTHREAD_LIBS@ EXTRA_DIST = ecore_private.h diff --git a/src/lib/ecore/ecore_events.c b/src/lib/ecore/ecore_events.c index 0c788cd..f9773be 100644 --- a/src/lib/ecore/ecore_events.c +++ b/src/lib/ecore/ecore_events.c @@ -57,6 +57,8 @@ static int event_handlers_num = 0; static int event_handlers_alloc_num = 0; static Eina_List *event_handlers_delete_list = NULL; +static Ecore_Event_Handler *event_handlers_add_list = NULL; + static Ecore_Event_Filter *event_filters = NULL; static Ecore_Event_Filter *event_filter_current = NULL; static Ecore_Event *event_filter_event_current = NULL; @@ -141,7 +143,10 @@ ecore_event_handler_add(int type, Ecore_Event_Handler_Cb func, const void *data) event_handlers[i] = NULL; } } - event_handlers[type] = (Ecore_Event_Handler *) eina_inlist_append(EINA_INLIST_GET(event_handlers[type]), EINA_INLIST_GET(eh)); + if (ecore_raw_event_type == type) + event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh)); + else + event_handlers[type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[type]), EINA_INLIST_GET(eh)); return eh; } @@ -170,6 +175,45 @@ ecore_event_handler_del(Ecore_Event_Handler *event_handler) return event_handler->data; } +/** + * @brief Get the data associated with an #Ecore_Event_Handler + * @param eh The event handler + * @return The data + * This function returns the data previously associated with @p eh. + */ +EAPI void * +ecore_event_handler_data_get(Ecore_Event_Handler *eh) +{ + if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER)) + { + ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_get"); + return NULL; + } + return eh->data; +} + +/** + * @brief Set the data associated with an #Ecore_Event_Handler + * @param eh The event handler + * @param data The data to associate + * @return The previous data + * This function sets @p data to @p eh and returns the old data pointer + * which was previously associated with @p eh. + */ +EAPI void * +ecore_event_handler_data_set(Ecore_Event_Handler *eh, void *data) +{ + void *old; + if (!ECORE_MAGIC_CHECK(eh, ECORE_MAGIC_EVENT_HANDLER)) + { + ECORE_MAGIC_FAIL(eh, ECORE_MAGIC_EVENT_HANDLER, "ecore_event_handler_data_set"); + return NULL; + } + old = eh->data; + eh->data = data; + return old; +} + static void _ecore_event_generic_free (void *data __UNUSED__, void *event) { @@ -586,7 +630,7 @@ _ecore_event_call(void) while ((event_handler_current) && (!e->delete_me)) { - Ecore_Event_Handler *eh = event_handler_current; + eh = event_handler_current; if (!eh->delete_me) { Eina_Bool ret; @@ -608,6 +652,12 @@ _ecore_event_call(void) event_handler_current = (Ecore_Event_Handler *)EINA_INLIST_GET(event_handler_current)->next; } } + while (event_handlers_add_list) + { + eh = event_handlers_add_list; + event_handlers_add_list = (Ecore_Event_Handler *)eina_inlist_remove(EINA_INLIST_GET(event_handlers_add_list), EINA_INLIST_GET(eh)); + event_handlers[eh->type] = (Ecore_Event_Handler *)eina_inlist_append(EINA_INLIST_GET(event_handlers[eh->type]), EINA_INLIST_GET(eh)); + } /* if no handlers were set for EXIT signal - then default is */ /* to quit the main loop */ if ((e->type == ECORE_EVENT_SIGNAL_EXIT) && (handle_count == 0)) diff --git a/src/lib/ecore/ecore_getopt.c b/src/lib/ecore/ecore_getopt.c index 5b1c7bf..83840af 100644 --- a/src/lib/ecore/ecore_getopt.c +++ b/src/lib/ecore/ecore_getopt.c @@ -584,7 +584,7 @@ _ecore_getopt_help_desc(FILE *fp, const Ecore_Getopt_Desc *desc) fputc('\n', fp); } -static unsigned char +static Eina_Bool _ecore_getopt_desc_is_sentinel(const Ecore_Getopt_Desc *desc) { return (desc->shortname == '\0') && (!desc->longname); @@ -797,8 +797,8 @@ _ecore_getopt_desc_print_error(const Ecore_Getopt_Desc *desc, const char *fmt, . va_end(ap); } -static unsigned char -_ecore_getopt_parse_bool(const char *str, unsigned char *v) +static Eina_Bool +_ecore_getopt_parse_bool(const char *str, Eina_Bool *v) { if ((strcmp(str, "0") == 0) || (strcasecmp(str, "f") == 0) || @@ -807,8 +807,8 @@ _ecore_getopt_parse_bool(const char *str, unsigned char *v) (strcasecmp(str, "off") == 0) ) { - *v = 0; - return 1; + *v = EINA_FALSE; + return EINA_TRUE; } else if ((strcmp(str, "1") == 0) || (strcasecmp(str, "t") == 0) || @@ -817,14 +817,14 @@ _ecore_getopt_parse_bool(const char *str, unsigned char *v) (strcasecmp(str, "on") == 0) ) { - *v = 1; - return 1; + *v = EINA_TRUE; + return EINA_TRUE; } - return 0; + return EINA_FALSE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_long(const char *str, long int *v) { char *endptr = NULL; @@ -832,7 +832,7 @@ _ecore_getopt_parse_long(const char *str, long int *v) return endptr > str; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_double(const char *str, double *v) { char *endptr = NULL; @@ -840,18 +840,18 @@ _ecore_getopt_parse_double(const char *str, double *v) return endptr > str; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_store(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *value, const char *arg_val) { const Ecore_Getopt_Desc_Store *store = &desc->action_param.store; long int v; double d; - unsigned char b; + Eina_Bool b; if (!value->ptrp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } switch (store->arg_req) @@ -869,49 +869,49 @@ _ecore_getopt_parse_store(const Ecore_Getopt *parser __UNUSED__, const Ecore_Get { case ECORE_GETOPT_TYPE_STR: *value->strp = (char *)arg_val; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_BOOL: if (_ecore_getopt_parse_bool(arg_val, &b)) { *value->boolp = b; - return 1; + return EINA_TRUE; } else { _ecore_getopt_desc_print_error (desc, _("unknown boolean value %s.\n"), arg_val); - return 0; + return EINA_FALSE; } case ECORE_GETOPT_TYPE_SHORT: if (!_ecore_getopt_parse_long(arg_val, &v)) goto error; *value->shortp = v; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_INT: if (!_ecore_getopt_parse_long(arg_val, &v)) goto error; *value->intp = v; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_LONG: if (!_ecore_getopt_parse_long(arg_val, &v)) goto error; *value->longp = v; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_USHORT: if (!_ecore_getopt_parse_long(arg_val, &v)) goto error; *value->ushortp = v; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_UINT: if (!_ecore_getopt_parse_long(arg_val, &v)) goto error; *value->uintp = v; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_ULONG: if (!_ecore_getopt_parse_long(arg_val, &v)) goto error; *value->ulongp = v; - return 1; + return EINA_TRUE; case ECORE_GETOPT_TYPE_DOUBLE: if (!_ecore_getopt_parse_double(arg_val, &d)) goto error; @@ -919,12 +919,12 @@ _ecore_getopt_parse_store(const Ecore_Getopt *parser __UNUSED__, const Ecore_Get break; } - return 1; + return EINA_TRUE; error: _ecore_getopt_desc_print_error (desc, _("invalid number format %s\n"), arg_val); - return 0; + return EINA_FALSE; use_optional: switch (store->type) @@ -958,47 +958,47 @@ _ecore_getopt_parse_store(const Ecore_Getopt *parser __UNUSED__, const Ecore_Get break; } - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_store_const(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (!val->ptrp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } *val->ptrp = (void *)desc->action_param.store_const; - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_store_true(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (!val->boolp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } - *val->boolp = 1; - return 1; + *val->boolp = EINA_TRUE; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_store_false(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (!val->boolp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } - *val->boolp = 0; - return 1; + *val->boolp = EINA_FALSE; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_choice(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val) { const char * const *pchoice; @@ -1006,7 +1006,7 @@ _ecore_getopt_parse_choice(const Ecore_Getopt *parser __UNUSED__, const Ecore_Ge if (!val->strp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } pchoice = desc->action_param.choices; @@ -1014,7 +1014,7 @@ _ecore_getopt_parse_choice(const Ecore_Getopt *parser __UNUSED__, const Ecore_Ge if (strcmp(*pchoice, arg_val) == 0) { *val->strp = (char *)*pchoice; - return 1; + return EINA_TRUE; } _ecore_getopt_desc_print_error @@ -1029,28 +1029,28 @@ _ecore_getopt_parse_choice(const Ecore_Getopt *parser __UNUSED__, const Ecore_Ge } fputs(".\n", stderr); - return 0; + return EINA_FALSE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_append(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val) { void *data; long int v; double d; - unsigned char b; + Eina_Bool b; if (!arg_val) { _ecore_getopt_desc_print_error (desc, _("missing parameter to append.\n")); - return 0; + return EINA_FALSE; } if (!val->listp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } switch (desc->action_param.append_type) @@ -1062,15 +1062,14 @@ _ecore_getopt_parse_append(const Ecore_Getopt *parser __UNUSED__, const Ecore_Ge { if (_ecore_getopt_parse_bool(arg_val, &b)) { - data = malloc(sizeof(unsigned char)); + data = malloc(sizeof(Eina_Bool)); if (data) - *(unsigned char *)data = b; + *(Eina_Bool *)data = b; } else { - _ecore_getopt_desc_print_error - (desc, _("unknown boolean value %s.\n"), arg_val); - return 0; + _ecore_getopt_desc_print_error(desc, _("unknown boolean value %s.\n"), arg_val); + return EINA_FALSE; } } break; @@ -1140,33 +1139,33 @@ _ecore_getopt_parse_append(const Ecore_Getopt *parser __UNUSED__, const Ecore_Ge default: { _ecore_getopt_desc_print_error(desc, _("could not parse value.\n")); - return 0; + return EINA_FALSE; } } *val->listp = eina_list_append(*val->listp, data); - return 1; + return EINA_TRUE; error: _ecore_getopt_desc_print_error (desc, _("invalid number format %s\n"), arg_val); - return 0; + return EINA_FALSE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_count(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (!val->intp) { _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); - return 0; + return EINA_FALSE; } (*val->intp)++; - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_callback(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val) { const Ecore_Getopt_Desc_Callback *cb = &desc->action_param.callback; @@ -1189,78 +1188,77 @@ _ecore_getopt_parse_callback(const Ecore_Getopt *parser, const Ecore_Getopt_Desc if ((!arg_val) || (arg_val[0] == '\0')) { _ecore_getopt_desc_print_error(desc, _("missing parameter.\n")); - return 0; + return EINA_FALSE; } if (!val->ptrp) { - _ecore_getopt_desc_print_error - (desc, _("value has no pointer set.\n")); - return 0; + _ecore_getopt_desc_print_error(desc, _("value has no pointer set.\n")); + return EINA_FALSE; } } if (!cb->func) { _ecore_getopt_desc_print_error(desc, _("missing callback function!\n")); - return 0; + return EINA_FALSE; } return cb->func(parser, desc, arg_val, (void *)cb->data, val); } -static unsigned char +static Eina_Bool _ecore_getopt_parse_help(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc __UNUSED__, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (val->boolp) - (*val->boolp) = 1; + (*val->boolp) = EINA_TRUE; ecore_getopt_help(stdout, parser); - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_version(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (val->boolp) - (*val->boolp) = 1; + (*val->boolp) = EINA_TRUE; if (!parser->version) { _ecore_getopt_desc_print_error(desc, _("no version was defined.\n")); - return 0; + return EINA_FALSE; } _ecore_getopt_version(stdout, parser); - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_copyright(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (val->boolp) - (*val->boolp) = 1; + (*val->boolp) = EINA_TRUE; if (!parser->copyright) { _ecore_getopt_desc_print_error(desc, _("no copyright was defined.\n")); - return 0; + return EINA_FALSE; } _ecore_getopt_copyright(stdout, parser); - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_license(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *val, const char *arg_val __UNUSED__) { if (val->boolp) - (*val->boolp) = 1; + (*val->boolp) = EINA_TRUE; if (!parser->license) { _ecore_getopt_desc_print_error(desc, _("no license was defined.\n")); - return 0; + return EINA_FALSE; } _ecore_getopt_license(stdout, parser); - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_desc_handle(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, Ecore_Getopt_Value *value, const char *arg_val) { switch (desc->action) @@ -1290,11 +1288,11 @@ _ecore_getopt_desc_handle(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *d case ECORE_GETOPT_ACTION_LICENSE: return _ecore_getopt_parse_license(parser, desc, value, arg_val); default: - return 0; + return EINA_FALSE; } } -static unsigned char +static Eina_Bool _ecore_getopt_parse_arg_long(const Ecore_Getopt *parser, Ecore_Getopt_Value *values, int argc __UNUSED__, char **argv, int *idx, int *nonargs, const char *arg) { const Ecore_Getopt_Desc *desc; @@ -1302,17 +1300,17 @@ _ecore_getopt_parse_arg_long(const Ecore_Getopt *parser, Ecore_Getopt_Value *val const char *arg_val; int desc_idx; Ecore_Getopt_Value *value; - unsigned char ret; + Eina_Bool ret; desc = _ecore_getopt_parse_find_long(parser, arg); if (!desc) { fprintf(stderr, _("ERROR: unknown option --%s, ignored.\n"), arg); if (parser->strict) - return 0; + return EINA_FALSE; (*idx)++; - return 1; + return EINA_TRUE; } (*idx)++; @@ -1342,8 +1340,8 @@ _ecore_getopt_parse_arg_long(const Ecore_Getopt *parser, Ecore_Getopt_Value *val fprintf (stderr, _("ERROR: option --%s requires an argument!\n"), arg); if (parser->strict) - return 0; - return 1; + return EINA_FALSE; + return EINA_TRUE; } } else @@ -1353,12 +1351,12 @@ _ecore_getopt_parse_arg_long(const Ecore_Getopt *parser, Ecore_Getopt_Value *val value = values + desc_idx; ret = _ecore_getopt_desc_handle(parser, desc, value, arg_val); if ((!ret) && parser->strict) - return 0; + return EINA_FALSE; - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_arg_short(const Ecore_Getopt *parser, Ecore_Getopt_Value *values, int argc __UNUSED__, char **argv, int *idx, int *nonargs, const char *arg) { int run = 1; @@ -1370,7 +1368,7 @@ _ecore_getopt_parse_arg_short(const Ecore_Getopt *parser, Ecore_Getopt_Value *va const char *arg_val; int desc_idx; Ecore_Getopt_Value *value; - unsigned char ret; + Eina_Bool ret; desc = _ecore_getopt_parse_find_short(parser, arg[0]); if (!desc) @@ -1378,7 +1376,7 @@ _ecore_getopt_parse_arg_short(const Ecore_Getopt *parser, Ecore_Getopt_Value *va fprintf (stderr, _("ERROR: unknown option -%c, ignored.\n"), arg[0]); if (parser->strict) - return 0; + return EINA_FALSE; arg++; continue; @@ -1417,8 +1415,8 @@ _ecore_getopt_parse_arg_short(const Ecore_Getopt *parser, Ecore_Getopt_Value *va (stderr, _("ERROR: option -%c requires an argument!\n"), opt); if (parser->strict) - return 0; - return 1; + return EINA_FALSE; + return EINA_TRUE; } } else @@ -1428,16 +1426,16 @@ _ecore_getopt_parse_arg_short(const Ecore_Getopt *parser, Ecore_Getopt_Value *va value = values + desc_idx; ret = _ecore_getopt_desc_handle(parser, desc, value, arg_val); if ((!ret) && parser->strict) - return 0; + return EINA_FALSE; } if (run) (*idx)++; - return 1; + return EINA_TRUE; } -static unsigned char +static Eina_Bool _ecore_getopt_parse_arg(const Ecore_Getopt *parser, Ecore_Getopt_Value *values, int argc, char **argv, int *idx, int *nonargs) { char *arg = argv[*idx]; @@ -1455,15 +1453,13 @@ _ecore_getopt_parse_arg(const Ecore_Getopt *parser, Ecore_Getopt_Value *values, *dst = arg; (*nonargs)--; - return 1; + return EINA_TRUE; } if (arg[1] == '-') - return _ecore_getopt_parse_arg_long - (parser, values, argc, argv, idx, nonargs, arg + 2); + return _ecore_getopt_parse_arg_long(parser, values, argc, argv, idx, nonargs, arg + 2); else - return _ecore_getopt_parse_arg_short - (parser, values, argc, argv, idx, nonargs, arg + 1); + return _ecore_getopt_parse_arg_short(parser, values, argc, argv, idx, nonargs, arg + 1); } static const Ecore_Getopt_Desc * @@ -1505,9 +1501,9 @@ _ecore_getopt_parse_find_long_other(const Ecore_Getopt *parser, const Ecore_Geto /** * Check parser for duplicate entries, print them out. * - * @return 1 if there are duplicates, 0 otherwise. + * @return EINA_TRUE if there are duplicates, EINA_FALSE otherwise. */ -unsigned char +Eina_Bool ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser) { const Ecore_Getopt_Desc *desc = parser->descs; @@ -1519,14 +1515,13 @@ ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser) other = _ecore_getopt_parse_find_short_other(parser, desc); if (other) { - _ecore_getopt_desc_print_error - (desc, "short name -%c already exists.", desc->shortname); + _ecore_getopt_desc_print_error(desc, "short name -%c already exists.", desc->shortname); if (other->longname) fprintf(stderr, " Other is --%s.\n", other->longname); else fputc('\n', stderr); - return 1; + return EINA_TRUE; } } @@ -1536,18 +1531,17 @@ ecore_getopt_parser_has_duplicates(const Ecore_Getopt *parser) other = _ecore_getopt_parse_find_long_other(parser, desc); if (other) { - _ecore_getopt_desc_print_error - (desc, "long name --%s already exists.", desc->longname); + _ecore_getopt_desc_print_error(desc, "long name --%s already exists.", desc->longname); if (other->shortname) fprintf(stderr, " Other is -%c.\n", other->shortname); else fputc('\n', stderr); - return 1; + return EINA_TRUE; } } } - return 0; + return EINA_FALSE; } static const Ecore_Getopt_Desc * @@ -1695,7 +1689,7 @@ ecore_getopt_list_free(Eina_List *list) * * @c callback_data value is ignored, you can safely use @c NULL. */ -unsigned char +Eina_Bool ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc __UNUSED__, const char *str, void *data __UNUSED__, Ecore_Getopt_Value *storage) { Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp; @@ -1703,10 +1697,10 @@ ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser __UNUSED__, cons if (sscanf(str, "%d:%d:%d:%d", &v->x, &v->y, &v->w, &v->h) != 4) { fprintf(stderr, _("ERROR: incorrect geometry value '%s'\n"), str); - return 0; + return EINA_FALSE; } - return 1; + return EINA_TRUE; } /** @@ -1718,7 +1712,7 @@ ecore_getopt_callback_geometry_parse(const Ecore_Getopt *parser __UNUSED__, cons * * @c callback_data value is ignored, you can safely use @c NULL. */ -unsigned char +Eina_Bool ecore_getopt_callback_size_parse(const Ecore_Getopt *parser __UNUSED__, const Ecore_Getopt_Desc *desc __UNUSED__, const char *str, void *data __UNUSED__, Ecore_Getopt_Value *storage) { Eina_Rectangle *v = (Eina_Rectangle *)storage->ptrp; @@ -1726,10 +1720,10 @@ ecore_getopt_callback_size_parse(const Ecore_Getopt *parser __UNUSED__, const Ec if (sscanf(str, "%dx%d", &v->w, &v->h) != 2) { fprintf(stderr, _("ERROR: incorrect size value '%s'\n"), str); - return 0; + return EINA_FALSE; } v->x = 0; v->y = 0; - return 1; + return EINA_TRUE; } diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index 9435cce..d6f7666 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -115,7 +115,10 @@ static int in_main_loop = 0; static int do_quit = 0; static Ecore_Fd_Handler *fd_handlers = NULL; static Ecore_Fd_Handler *fd_handler_current = NULL; -static int fd_handlers_delete_me = 0; +static Eina_List *fd_handlers_with_prep = NULL; +static Eina_List *fd_handlers_with_buffer = NULL; +static Eina_List *fd_handlers_to_delete = NULL; + #ifdef _WIN32 static Ecore_Win32_Handler *win32_handlers = NULL; static Ecore_Win32_Handler *win32_handler_current = NULL; @@ -326,9 +329,9 @@ static inline int _ecore_main_fdh_poll_mark_active(void) ERR("deleted fd in epoll"); continue; } - if (ev->events & EPOLLIN) fdh->read_active = 1; - if (ev->events & EPOLLOUT) fdh->write_active = 1; - if (ev->events & EPOLLERR) fdh->error_active = 1; + if (ev[i].events & EPOLLIN) fdh->read_active = 1; + if (ev[i].events & EPOLLOUT) fdh->write_active = 1; + if (ev[i].events & EPOLLERR) fdh->error_active = 1; } return ret; @@ -399,7 +402,8 @@ _ecore_main_gsource_prepare(GSource *source, gint *next_time) else *next_time = 0; - _ecore_main_prepare_handlers(); + if (fd_handlers_with_prep) + _ecore_main_prepare_handlers(); } in_main_loop--; @@ -478,7 +482,8 @@ _ecore_main_gsource_dispatch(GSource *source, GSourceFunc callback, gpointer use { INF("work"); _ecore_main_fd_handlers_call(); - _ecore_main_fd_handlers_buf_call(); + if (fd_handlers_with_buffer) + _ecore_main_fd_handlers_buf_call(); while (_ecore_signal_count_get()) _ecore_signal_call(); _ecore_event_call(); _ecore_main_fd_handlers_cleanup(); @@ -743,6 +748,8 @@ ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func fdh->func = func; fdh->data = (void *)data; fdh->buf_func = buf_func; + if (buf_func) + fd_handlers_with_buffer = eina_list_append(fd_handlers_with_buffer, fdh); fdh->buf_data = (void *)buf_data; fd_handlers = (Ecore_Fd_Handler *) eina_inlist_append(EINA_INLIST_GET(fd_handlers), @@ -800,9 +807,17 @@ ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler) "ecore_main_fd_handler_del"); return NULL; } + if (fd_handler->delete_me) + /* FIXME: should this return NULL instead? */ + return fd_handler->data; + fd_handler->delete_me = 1; - fd_handlers_delete_me = 1; _ecore_main_fdh_poll_del(fd_handler); + fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fd_handler); + if (fd_handler->prep_func && fd_handlers_with_prep) + fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fd_handler); + if (fd_handler->buf_func && fd_handlers_with_buffer) + fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fd_handler); return fd_handler->data; } @@ -828,6 +843,13 @@ ecore_main_win32_handler_del(Ecore_Win32_Handler *win32_handler __UNUSED__) } #endif +/** + * @brief Set the prepare callback with data for a given #Ecore_Fd_Handler + * @param fd_handler The fd handler + * @param func The prep function + * @param data The data to pass to the prep function + * This function will be called prior to the the fd handler's callback function. + */ EAPI void ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Prep_Cb func, const void *data) { @@ -839,6 +861,9 @@ ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, Ecore_F } fd_handler->prep_func = func; fd_handler->prep_data = (void *)data; + if (fd_handlers_with_prep && (!eina_list_data_find(fd_handlers_with_prep, fd_handler))) + /* FIXME: THIS WILL NOT SCALE WITH LOTS OF PREP FUNCTIONS!!! */ + fd_handlers_with_prep = eina_list_append(fd_handlers_with_prep, fd_handler); } /** @@ -935,7 +960,15 @@ _ecore_main_shutdown(void) ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE); free(fdh); } - fd_handlers_delete_me = 0; + if (fd_handlers_with_buffer) + eina_list_free(fd_handlers_with_buffer); + fd_handlers_with_buffer = NULL; + if (fd_handlers_with_prep) + eina_list_free(fd_handlers_with_prep); + fd_handlers_with_prep = NULL; + if (fd_handlers_to_delete) + eina_list_free(fd_handlers_to_delete); + fd_handlers_to_delete = NULL; fd_handler_current = NULL; #ifdef _WIN32 @@ -958,16 +991,20 @@ static void _ecore_main_prepare_handlers(void) { Ecore_Fd_Handler *fdh; + Eina_List *l, *l2; - /* call the prepare callback for all handlers */ - EINA_INLIST_FOREACH(fd_handlers, fdh) + /* call the prepare callback for all handlers with prep functions */ + EINA_LIST_FOREACH_SAFE(fd_handlers_with_prep, l, l2, fdh) { + if (!fdh) fd_handlers_with_prep = eina_list_remove_list(l, fd_handlers_with_prep); if (!fdh->delete_me && fdh->prep_func) { fdh->references++; - fdh->prep_func (fdh->prep_data, fdh); + fdh->prep_func(fdh->prep_data, fdh); fdh->references--; } + else + fd_handlers_with_prep = eina_list_remove_list(fd_handlers_with_prep, l); } } @@ -1008,7 +1045,8 @@ _ecore_main_select(double timeout) FD_ZERO(&exfds); /* call the prepare callback for all handlers */ - _ecore_main_prepare_handlers(); + if (fd_handlers_with_prep) + _ecore_main_prepare_handlers(); #ifndef HAVE_EPOLL Ecore_Fd_Handler *fdh; @@ -1105,8 +1143,11 @@ _ecore_main_fd_handlers_bads_rem(void) if (!fdh->func(fdh->data, fdh)) { ERR("Fd function err returned 0, remove it"); - fdh->delete_me = 1; - fd_handlers_delete_me = 1; + if (!fdh->delete_me) + { + fdh->delete_me = 1; + fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh); + } found++; } fdh->references--; @@ -1114,8 +1155,12 @@ _ecore_main_fd_handlers_bads_rem(void) else { ERR("Problematic fd found at %d! setting it for delete", fdh->fd); - fdh->delete_me = 1; - fd_handlers_delete_me = 1; + if (!fdh->delete_me) + { + fdh->delete_me = 1; + fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh); + } + found++; } } @@ -1136,31 +1181,25 @@ static void _ecore_main_fd_handlers_cleanup(void) { Ecore_Fd_Handler *fdh; - Eina_Inlist *l; - int deleted_in_use = 0; + Eina_List *l, *l2; - if (!fd_handlers_delete_me) return; - for (l = EINA_INLIST_GET(fd_handlers); l; ) + if (!fd_handlers_to_delete) return; + EINA_LIST_FOREACH_SAFE(fd_handlers_to_delete, l, l2, fdh) { - fdh = (Ecore_Fd_Handler *) l; - - l = l->next; - if (fdh->delete_me) - { - if (fdh->references) - { - deleted_in_use++; - continue; - } - - fd_handlers = (Ecore_Fd_Handler *) - eina_inlist_remove(EINA_INLIST_GET(fd_handlers), - EINA_INLIST_GET(fdh)); - ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE); - free(fdh); - } + if (!fdh) fd_handlers_to_delete = eina_list_remove_list(l, fd_handlers_to_delete); + /* fdh->delete_me should be set for all fdhs at the start of the list */ + if (fdh->references) + continue; + if (fdh->buf_func && fd_handlers_with_buffer) + fd_handlers_with_buffer = eina_list_remove(fd_handlers_with_buffer, fdh); + if (fdh->prep_func && fd_handlers_with_prep) + fd_handlers_with_prep = eina_list_remove(fd_handlers_with_prep, fdh); + fd_handlers = (Ecore_Fd_Handler *) + eina_inlist_remove(EINA_INLIST_GET(fd_handlers), EINA_INLIST_GET(fdh)); + ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE); + free(fdh); + fd_handlers_to_delete = eina_list_remove_list(fd_handlers_to_delete, l); } - if (!deleted_in_use) fd_handlers_delete_me = 0; } #ifdef _WIN32 @@ -1223,8 +1262,12 @@ _ecore_main_fd_handlers_call(void) fdh->references++; if (!fdh->func(fdh->data, fdh)) { - fdh->delete_me = 1; - fd_handlers_delete_me = 1; + if (!fdh->delete_me) + { + fdh->delete_me = 1; + fd_handlers_to_delete = eina_list_append(fd_handlers_to_delete, fdh); + } + } fdh->references--; @@ -1243,24 +1286,25 @@ static int _ecore_main_fd_handlers_buf_call(void) { Ecore_Fd_Handler *fdh; + Eina_List *l, *l2; int ret; ret = 0; - EINA_INLIST_FOREACH(fd_handlers, fdh) + EINA_LIST_FOREACH_SAFE(fd_handlers_with_buffer, l, l2, fdh) { - if (!fdh->delete_me) + if (!fdh) fd_handlers_with_buffer = eina_list_remove_list(l, fd_handlers_with_buffer); + if ((!fdh->delete_me) && fdh->buf_func) { - if (fdh->buf_func) + fdh->references++; + if (fdh->buf_func(fdh->buf_data, fdh)) { - fdh->references++; - if (fdh->buf_func(fdh->buf_data, fdh)) - { - ret |= fdh->func(fdh->data, fdh); - fdh->read_active = 1; - } - fdh->references--; + ret |= fdh->func(fdh->data, fdh); + fdh->read_active = 1; } + fdh->references--; } + else + fd_handlers_with_buffer = eina_list_remove_list(fd_handlers_with_buffer, l); } return ret; } @@ -1306,7 +1350,8 @@ _ecore_main_loop_iterate_internal(int once_only) } /* if these calls caused any buffered events to appear - deal with them */ - _ecore_main_fd_handlers_buf_call(); + if (fd_handlers_with_buffer) + _ecore_main_fd_handlers_buf_call(); /* if there are any - jump to processing them */ if (_ecore_event_exist()) @@ -1404,7 +1449,8 @@ _ecore_main_loop_iterate_internal(int once_only) /* post events onto the ecore event pipe if necessary */ process_events: _ecore_main_fd_handlers_call(); - _ecore_main_fd_handlers_buf_call(); + if (fd_handlers_with_buffer) + _ecore_main_fd_handlers_buf_call(); /* process signals into events .... */ while (_ecore_signal_count_get()) _ecore_signal_call(); /* handle events ... */ diff --git a/src/lib/ecore/ecore_thread.c b/src/lib/ecore/ecore_thread.c index 6793d17..27f6252 100644 --- a/src/lib/ecore/ecore_thread.c +++ b/src/lib/ecore/ecore_thread.c @@ -2,25 +2,304 @@ # include #endif +#include + #ifdef HAVE_EVIL # include #endif -#ifdef EFL_HAVE_PTHREAD -# include -# ifdef __linux__ -# include -# include -# include -# include -# include -# include -# endif -#endif - #include "Ecore.h" #include "ecore_private.h" +#ifdef EFL_HAVE_THREADS + +# ifdef EFL_HAVE_POSIX_THREADS +# include +# ifdef __linux__ +# include +# include +# include +# include +# include +# endif + +# define PH(x) pthread_t x +# define PHE(x, y) pthread_equal(x, y) +# define PHS() pthread_self() +# define PHC(x, f, d) pthread_create(&(x), NULL, (void*) f, d) +# define PHJ(x, p) pthread_join(x, (void**)(&(p))) +# define PHA(x) pthread_cancel(x) + +# define CD(x) pthread_cond_t x +# define CDI(x) pthread_cond_init(&(x), NULL); +# define CDD(x) pthread_cond_destroy(&(x)); +# define CDB(x) pthread_cond_broadcast(&(x)); +# define CDW(x, y, t) pthread_cond_timedwait(&(x), &(y), t); + +# define LK(x) pthread_mutex_t x +# define LKI(x) pthread_mutex_init(&(x), NULL); +# define LKD(x) pthread_mutex_destroy(&(x)); +# define LKL(x) pthread_mutex_lock(&(x)); +# define LKU(x) pthread_mutex_unlock(&(x)); + +# define LRWK(x) pthread_rwlock_t x +# define LRWKI(x) pthread_rwlock_init(&(x), NULL); +# define LRWKD(x) pthread_rwlock_destroy(&(x)); +# define LRWKWL(x) pthread_rwlock_wrlock(&(x)); +# define LRWKRL(x) pthread_rwlock_rdlock(&(x)); +# define LRWKU(x) pthread_rwlock_unlock(&(x)); + +# else /* EFL_HAVE_WIN32_THREADS */ + +# define WIN32_LEAN_AND_MEAN +# include +# undef WIN32_LEAN_AND_MEAN + +typedef struct +{ + HANDLE thread; + void *val; +} win32_thread; + +# define PH(x) win32_thread *x +# define PHE(x, y) ((x) == (y)) +# define PHS() (HANDLE)GetCurrentThreadId() + +int _ecore_thread_win32_create(win32_thread **x, LPTHREAD_START_ROUTINE f, void *d) +{ + win32_thread *t; + t = (win32_thread *)calloc(1, sizeof(win32_thread)); + if (!t) + return -1; + + (t)->thread = CreateThread(NULL, 0, f, d, 0, NULL); + if (!t->thread) + { + free(t); + return -1; + } + t->val = d; + *x = t; + + return 0; +} +# define PHC(x, f, d) _ecore_thread_win32_create(&(x), (LPTHREAD_START_ROUTINE)f, d) + +int _ecore_thread_win32_join(win32_thread *x, void **res) +{ + if (!PHE(x, PHS())) + { + WaitForSingleObject(x->thread, INFINITE); + CloseHandle(x->thread); + } + if (res) *res = x->val; + + return 0; +} + +# define PHJ(x, p) _ecore_thread_win32_join(x, (void**)(&(p))) +# define PHA(x) TerminateThread(x->thread, 0) + +# define LK(x) HANDLE x +# define LKI(x) x = CreateMutex(NULL, FALSE, NULL) +# define LKD(x) CloseHandle(x) +# define LKL(x) WaitForSingleObject(x, INFINITE) +# define LKU(x) ReleaseMutex(x) + +typedef struct +{ + HANDLE semaphore; + LONG threads_count; + CRITICAL_SECTION threads_count_lock; +} win32_cond; + +# define CD(x) win32_cond *x + +# define CDI(x) \ + do { \ + x = (win32_cond *)calloc(1, sizeof(win32_cond)); \ + if (x) \ + { \ + x->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); \ + if (x->semaphore) \ + InitializeCriticalSection(&x->threads_count_lock); \ + else \ + { \ + free(x); \ + x = NULL; \ + } \ + } \ + } while (0) + +# define CDD(x) \ + do { \ + CloseHandle(x->semaphore); \ + free(x); \ + x = NULL; \ + } while (0) + +# define CDB(x) \ +do { \ + EnterCriticalSection(&x->threads_count_lock); \ + if (x->threads_count > 0) \ + ReleaseSemaphore(x->semaphore, x->threads_count, NULL); \ + LeaveCriticalSection (&x->threads_count_lock); \ + } while (0) + +int _ecore_thread_win32_cond_timedwait(win32_cond *c, HANDLE *external_mutex, struct timeval *t) +{ + DWORD res; + DWORD val = t->tv_sec * 1000 + (t->tv_usec / 1000); + LKL(external_mutex); + EnterCriticalSection (&c->threads_count_lock); + c->threads_count++; + LeaveCriticalSection (&c->threads_count_lock); + LKU(external_mutex); + res = WaitForSingleObject(c->semaphore, val); + if (res == WAIT_OBJECT_0) + return 0; + else + return -1; +} +# define CDW(x, y, t) _ecore_thread_win32_cond_timedwait(x, y, t) + +typedef struct +{ + LONG readers_count; + LONG writers_count; + int readers; + int writers; + LK(mutex); + CD(cond_read); + CD(cond_write); +} win32_rwl; + +# define LRWK(x) win32_rwl *x +# define LRWKI(x) \ + do { \ + x = (win32_rwl *)calloc(1, sizeof(win32_rwl)); \ + if (x) \ + { \ + LKI(x->mutex); \ + if (x->mutex) \ + { \ + CDI(x->cond_read); \ + if (x->cond_read) \ + { \ + CDI(x->cond_write); \ + if (!x->cond_write) \ + { \ + CDD(x->cond_read); \ + LKD(x->mutex); \ + free(x); \ + x = NULL; \ + } \ + } \ + else \ + { \ + LKD(x->mutex); \ + free(x); \ + x = NULL; \ + } \ + } \ + else \ + { \ + free(x); \ + x = NULL; \ + } \ + } \ + } while (0) + +# define LRWKD(x) \ + do { \ + LKU(x->mutex); \ + LKD(x->mutex); \ + CDD(x->cond_write); \ + CDD(x->cond_read); \ + free(x); \ + } while (0) +# define LRWKWL(x) \ + do { \ + DWORD res; \ + LKU(x->mutex); \ + if (x->writers || x->readers > 0) \ + { \ + x->writers_count++; \ + while (x->writers || x->readers > 0) \ + { \ + EnterCriticalSection(&x->cond_write->threads_count_lock); \ + x->cond_read->threads_count++; \ + LeaveCriticalSection(&x->cond_write->threads_count_lock); \ + res = WaitForSingleObject(x->cond_write->semaphore, INFINITE); \ + if (res != WAIT_OBJECT_0) break; \ + } \ + x->writers_count--; \ + } \ + if (res == 0) x->writers_count = 1; \ + LKU(x->mutex); \ + } while (0) +# define LRWKRL(x) \ + do { \ + DWORD res; \ + LKL(x->mutex); \ + if (x->writers) \ + { \ + x->readers_count++; \ + while (x->writers) \ + { \ + EnterCriticalSection(&x->cond_write->threads_count_lock); \ + x->cond_read->threads_count++; \ + LeaveCriticalSection(&x->cond_write->threads_count_lock); \ + res = WaitForSingleObject(x->cond_write->semaphore, INFINITE); \ + if (res != WAIT_OBJECT_0) break; \ + } \ + x->readers_count--; \ + } \ + if (res == 0) \ + x->readers++; \ + LKU(x->mutex); \ + } while (0) +# define LRWKU(x) \ + do { \ + LKL(x->mutex); \ + if (x->writers) \ + { \ + x->writers = 0; \ + if (x->readers_count == 1) \ + { \ + EnterCriticalSection(&x->cond_read->threads_count_lock); \ + if (x->cond_read->threads_count > 0) \ + ReleaseSemaphore(x->cond_read->semaphore, 1, 0); \ + LeaveCriticalSection(&x->cond_read->threads_count_lock); \ + } \ + else if (x->readers_count > 0) \ + CDB(x->cond_read); \ + else if (x->writers_count > 0) \ + { \ + EnterCriticalSection (&x->cond_write->threads_count_lock); \ + if (x->cond_write->threads_count > 0) \ + ReleaseSemaphore(x->cond_write->semaphore, 1, 0); \ + LeaveCriticalSection (&x->cond_write->threads_count_lock); \ + } \ + } \ + else if (x->readers > 0) \ + { \ + x->readers--; \ + if (x->readers == 0 && x->writers_count > 0) \ + { \ + EnterCriticalSection (&x->cond_write->threads_count_lock); \ + if (x->cond_write->threads_count > 0) \ + ReleaseSemaphore(x->cond_write->semaphore, 1, 0); \ + LeaveCriticalSection (&x->cond_write->threads_count_lock); \ + } \ + } \ + LKU(x->mutex); \ + } while (0) + +# endif + +#endif + typedef struct _Ecore_Pthread_Worker Ecore_Pthread_Worker; typedef struct _Ecore_Pthread Ecore_Pthread; typedef struct _Ecore_Thread_Data Ecore_Thread_Data; @@ -35,25 +314,28 @@ struct _Ecore_Pthread_Worker { union { struct { - Ecore_Thread_Heavy_Cb func_blocking; + Ecore_Thread_Cb func_blocking; } short_run; struct { - Ecore_Thread_Heavy_Cb func_heavy; + Ecore_Thread_Cb func_heavy; Ecore_Thread_Notify_Cb func_notify; Ecore_Pipe *notify; + Ecore_Pipe *direct_pipe; + Ecore_Pthread_Worker *direct_worker; + int send; int received; } feedback_run; } u; - Ecore_Cb func_cancel; - Ecore_Cb func_end; -#ifdef EFL_HAVE_PTHREAD - pthread_t self; + Ecore_Thread_Cb func_cancel; + Ecore_Thread_Cb func_end; +#ifdef EFL_HAVE_THREADS + PH(self); Eina_Hash *hash; - pthread_cond_t cond; - pthread_mutex_t mutex; + CD(cond); + LK(mutex); #endif const void *data; @@ -63,36 +345,65 @@ struct _Ecore_Pthread_Worker Eina_Bool kill : 1; }; -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS typedef struct _Ecore_Pthread_Data Ecore_Pthread_Data; struct _Ecore_Pthread_Data { + Ecore_Pthread_Worker *death_job; Ecore_Pipe *p; void *data; - pthread_t thread; + PH(thread); }; #endif +static void _ecore_thread_handler(void *data __UNUSED__, void *buffer, unsigned int nbyte); + static int _ecore_thread_count_max = 0; static int ECORE_THREAD_PIPE_DEL = 0; +static Eina_Array *_ecore_thread_pipe = NULL; -#ifdef EFL_HAVE_PTHREAD +static Ecore_Pipe* +_ecore_thread_pipe_get(void) +{ + if (eina_array_count_get(_ecore_thread_pipe) > 0) + return eina_array_pop(_ecore_thread_pipe); + + return ecore_pipe_add(_ecore_thread_handler, NULL); +} + +#ifdef EFL_HAVE_THREADS static int _ecore_thread_count = 0; +static Ecore_Event_Handler *del_handler = NULL; static Eina_List *_ecore_active_job_threads = NULL; static Eina_List *_ecore_pending_job_threads = NULL; static Eina_List *_ecore_pending_job_threads_feedback = NULL; -static Ecore_Event_Handler *del_handler = NULL; -static pthread_mutex_t _ecore_pending_job_threads_mutex = PTHREAD_MUTEX_INITIALIZER; +static LK(_ecore_pending_job_threads_mutex); static Eina_Hash *_ecore_thread_global_hash = NULL; -static pthread_rwlock_t _ecore_thread_global_hash_lock = PTHREAD_RWLOCK_INITIALIZER; -static pthread_mutex_t _ecore_thread_global_hash_mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t _ecore_thread_global_hash_cond = PTHREAD_COND_INITIALIZER; -static pthread_t main_loop_thread; +static LRWK(_ecore_thread_global_hash_lock); +static LK(_ecore_thread_global_hash_mutex); +static CD(_ecore_thread_global_hash_cond); + +static PH(main_loop_thread); static Eina_Bool have_main_loop_thread = 0; +static Eina_Trash *_ecore_thread_worker_trash = NULL; +static int _ecore_thread_worker_count = 0; + +static void +_ecore_thread_worker_free(Ecore_Pthread_Worker *worker) +{ + if (_ecore_thread_worker_count > (_ecore_thread_count_max + 1) * 16) + { + free(worker); + return ; + } + + eina_trash_push(&_ecore_thread_worker_trash, worker); +} + static void _ecore_thread_data_free(void *data) { @@ -107,7 +418,7 @@ _ecore_thread_pipe_free(void *data __UNUSED__, void *event) { Ecore_Pipe *p = event; - ecore_pipe_del(p); + eina_array_push(_ecore_thread_pipe, p); eina_threads_shutdown(); } @@ -119,11 +430,11 @@ _ecore_thread_pipe_del(void *data __UNUSED__, int type __UNUSED__, void *event _ } static void -_ecore_thread_end(Ecore_Pthread_Data *pth) +_ecore_thread_end(Ecore_Pthread_Data *pth, __UNUSED__ Ecore_Thread *work) { Ecore_Pipe *p; - if (pthread_join(pth->thread, (void **) &p) != 0) + if (PHJ(pth->thread, p) != 0) return ; _ecore_active_job_threads = eina_list_remove(_ecore_active_job_threads, pth); @@ -138,18 +449,25 @@ _ecore_thread_kill(Ecore_Pthread_Worker *work) if (work->cancel) { if (work->func_cancel) - work->func_cancel((void *) work->data); + work->func_cancel((void *) work->data, (Ecore_Thread *) work); } else { if (work->func_end) - work->func_end((void *) work->data); + work->func_end((void *) work->data, (Ecore_Thread *) work); } if (work->feedback_run) - ecore_pipe_del(work->u.feedback_run.notify); - pthread_cond_destroy(&work->cond); - pthread_mutex_destroy(&work->mutex); + { + ecore_pipe_del(work->u.feedback_run.notify); + + if (work->u.feedback_run.direct_pipe) + eina_array_push(_ecore_thread_pipe, work->u.feedback_run.direct_pipe); + if (work->u.feedback_run.direct_worker) + _ecore_thread_worker_free(work->u.feedback_run.direct_worker); + } + CDD(work->cond); + LKD(work->mutex); if (work->hash) eina_hash_free(work->hash); free(work); @@ -188,7 +506,7 @@ _ecore_notify_handler(void *data, void *buffer, unsigned int nbyte) work->u.feedback_run.received++; if (work->u.feedback_run.func_notify) - work->u.feedback_run.func_notify((Ecore_Thread *) work, user_data, (void *) work->data); + work->u.feedback_run.func_notify((void *) work->data, (Ecore_Thread *) work, user_data); /* Force reading all notify event before killing the thread */ if (work->kill && work->u.feedback_run.send == work->u.feedback_run.received) @@ -204,11 +522,11 @@ _ecore_short_job(Ecore_Pipe *end_pipe) while (_ecore_pending_job_threads) { - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); if (!_ecore_pending_job_threads) { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); break; } @@ -216,27 +534,27 @@ _ecore_short_job(Ecore_Pipe *end_pipe) _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads, _ecore_pending_job_threads); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); if (!work->cancel) - work->u.short_run.func_blocking((Ecore_Thread*) work, (void *) work->data); + work->u.short_run.func_blocking((void *) work->data, (Ecore_Thread*) work); ecore_pipe_write(end_pipe, &work, sizeof (Ecore_Pthread_Worker *)); } } static void -_ecore_feedback_job(Ecore_Pipe *end_pipe, pthread_t thread) +_ecore_feedback_job(Ecore_Pipe *end_pipe, PH(thread)) { Ecore_Pthread_Worker *work; while (_ecore_pending_job_threads_feedback) { - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); if (!_ecore_pending_job_threads_feedback) { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); break; } @@ -244,11 +562,11 @@ _ecore_feedback_job(Ecore_Pipe *end_pipe, pthread_t thread) _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback, _ecore_pending_job_threads_feedback); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); work->self = thread; if (!work->cancel) - work->u.feedback_run.func_heavy((Ecore_Thread *) work, (void *) work->data); + work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work); ecore_pipe_write(end_pipe, &work, sizeof (Ecore_Pthread_Worker *)); } @@ -259,30 +577,32 @@ _ecore_direct_worker(Ecore_Pthread_Worker *work) { Ecore_Pthread_Data *pth; +#ifdef EFL_POSIX_THREADS pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif + eina_sched_prio_drop(); pth = malloc(sizeof (Ecore_Pthread_Data)); if (!pth) return NULL; - pth->p = ecore_pipe_add(_ecore_thread_handler, NULL); + pth->p = work->u.feedback_run.direct_pipe; if (!pth->p) { free(pth); return NULL; } - pth->thread = pthread_self(); + pth->thread = PHS(); work->self = pth->thread; - work->u.feedback_run.func_heavy((Ecore_Thread *) work, (void *) work->data); + work->u.feedback_run.func_heavy((void *) work->data, (Ecore_Thread *) work); ecore_pipe_write(pth->p, &work, sizeof (Ecore_Pthread_Worker *)); - work = malloc(sizeof (Ecore_Pthread_Worker)); + work = work->u.feedback_run.direct_worker; if (!work) { - ecore_pipe_del(pth->p); free(pth); return NULL; } @@ -295,8 +615,8 @@ _ecore_direct_worker(Ecore_Pthread_Worker *work) work->feedback_run = EINA_FALSE; work->kill = EINA_FALSE; work->hash = NULL; - pthread_cond_init(&work->cond, NULL); - pthread_mutex_init(&work->mutex, NULL); + CDI(work->cond); + LKI(work->mutex); ecore_pipe_write(pth->p, &work, sizeof (Ecore_Pthread_Worker *)); @@ -308,13 +628,16 @@ _ecore_thread_worker(Ecore_Pthread_Data *pth) { Ecore_Pthread_Worker *work; +#ifdef EFL_POSIX_THREADS pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif + eina_sched_prio_drop(); - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); _ecore_thread_count++; - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); restart: if (_ecore_pending_job_threads) _ecore_short_job(pth->p); @@ -322,37 +645,27 @@ _ecore_thread_worker(Ecore_Pthread_Data *pth) /* FIXME: Check if there is feedback running task todo, and switch to feedback run handler. */ - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); - if (_ecore_pending_job_threads) + LKL(_ecore_pending_job_threads_mutex); + if (_ecore_pending_job_threads || _ecore_pending_job_threads_feedback) { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); goto restart; } - if (_ecore_pending_job_threads_feedback) - { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); - goto restart; - } - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); /* Sleep a little to prevent premature death */ usleep(200); - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); - if (_ecore_pending_job_threads) - { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); - goto restart; - } - if (_ecore_pending_job_threads_feedback) + LKL(_ecore_pending_job_threads_mutex); + if (_ecore_pending_job_threads || _ecore_pending_job_threads_feedback) { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); goto restart; } _ecore_thread_count--; - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); - work = malloc(sizeof (Ecore_Pthread_Worker)); + work = pth->death_job; if (!work) return NULL; work->data = pth; @@ -363,8 +676,8 @@ _ecore_thread_worker(Ecore_Pthread_Data *pth) work->feedback_run = EINA_FALSE; work->kill = EINA_FALSE; work->hash = NULL; - pthread_cond_init(&work->cond, NULL); - pthread_mutex_init(&work->mutex, NULL); + CDI(work->cond); + LKI(work->mutex); ecore_pipe_write(pth->p, &work, sizeof (Ecore_Pthread_Worker *)); @@ -373,6 +686,23 @@ _ecore_thread_worker(Ecore_Pthread_Data *pth) #endif +static Ecore_Pthread_Worker * +_ecore_thread_worker_new(void) +{ + Ecore_Pthread_Worker *result; + +#ifdef EFL_HAVE_THREADS + result = eina_trash_pop(&_ecore_thread_worker_trash); + + if (!result) result = malloc(sizeof (Ecore_Pthread_Worker)); + else _ecore_thread_worker_count--; + + return result; +#else + return malloc(sizeof (Ecore_Pthread_Worker)); +#endif +} + void _ecore_thread_init(void) { @@ -381,10 +711,17 @@ _ecore_thread_init(void) _ecore_thread_count_max = 1; ECORE_THREAD_PIPE_DEL = ecore_event_type_new(); -#ifdef EFL_HAVE_PTHREAD + _ecore_thread_pipe = eina_array_new(8); + +#ifdef EFL_HAVE_THREADS del_handler = ecore_event_handler_add(ECORE_THREAD_PIPE_DEL, _ecore_thread_pipe_del, NULL); - main_loop_thread = pthread_self(); + main_loop_thread = PHS(); have_main_loop_thread = 1; + + LKI(_ecore_pending_job_threads_mutex); + LRWKI(_ecore_thread_global_hash_lock); + LKI(_ecore_thread_global_hash_mutex); + CDI(_ecore_thread_global_hash_cond); #endif } @@ -392,34 +729,39 @@ void _ecore_thread_shutdown(void) { /* FIXME: If function are still running in the background, should we kill them ? */ -#ifdef EFL_HAVE_PTHREAD + Ecore_Pipe *p; + Eina_Array_Iterator it; + unsigned int i; + +#ifdef EFL_HAVE_THREADS Ecore_Pthread_Worker *work; Ecore_Pthread_Data *pth; - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); EINA_LIST_FREE(_ecore_pending_job_threads, work) { if (work->func_cancel) - work->func_cancel((void *)work->data); + work->func_cancel((void *)work->data, (Ecore_Thread *) work); free(work); } EINA_LIST_FREE(_ecore_pending_job_threads_feedback, work) { if (work->func_cancel) - work->func_cancel((void *)work->data); + work->func_cancel((void *)work->data, (Ecore_Thread *) work); free(work); } - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); + /* Improve emergency shutdown */ EINA_LIST_FREE(_ecore_active_job_threads, pth) { Ecore_Pipe *p; - pthread_cancel(pth->thread); - pthread_join(pth->thread, (void **) &p); + PHA(pth->thread); + PHJ(pth->thread, p); ecore_pipe_del(pth->p); } @@ -428,7 +770,18 @@ _ecore_thread_shutdown(void) ecore_event_handler_del(del_handler); have_main_loop_thread = 0; del_handler = NULL; + + LKD(_ecore_pending_job_threads_mutex); + LRWKD(_ecore_thread_global_hash_lock); + LKD(_ecore_thread_global_hash_mutex); + CDD(_ecore_thread_global_hash_cond); #endif + + EINA_ARRAY_ITER_NEXT(_ecore_thread_pipe, i, p, it) + ecore_pipe_del(p); + + eina_array_free(_ecore_thread_pipe); + _ecore_thread_pipe = NULL; } /** @@ -466,23 +819,23 @@ _ecore_thread_shutdown(void) * host CPU can handle. */ EAPI Ecore_Thread * -ecore_thread_run(Ecore_Thread_Heavy_Cb func_blocking, - Ecore_Cb func_end, - Ecore_Cb func_cancel, +ecore_thread_run(Ecore_Thread_Cb func_blocking, + Ecore_Thread_Cb func_end, + Ecore_Thread_Cb func_cancel, const void *data) { Ecore_Pthread_Worker *work; -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS Ecore_Pthread_Data *pth = NULL; #endif if (!func_blocking) return NULL; - work = malloc(sizeof (Ecore_Pthread_Worker)); + work = _ecore_thread_worker_new(); if (!work) { if (func_cancel) - func_cancel((void *) data); + func_cancel((void *) data, NULL); return NULL; } @@ -494,32 +847,33 @@ ecore_thread_run(Ecore_Thread_Heavy_Cb func_blocking, work->kill = EINA_FALSE; work->data = data; -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS work->hash = NULL; - pthread_cond_init(&work->cond, NULL); - pthread_mutex_init(&work->mutex, NULL); + CDI(work->cond); + LKI(work->mutex); - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); _ecore_pending_job_threads = eina_list_append(_ecore_pending_job_threads, work); if (_ecore_thread_count == _ecore_thread_count_max) { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); return (Ecore_Thread *) work; } - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); /* One more thread could be created. */ pth = malloc(sizeof (Ecore_Pthread_Data)); if (!pth) goto on_error; - pth->p = ecore_pipe_add(_ecore_thread_handler, NULL); - if (!pth->p) goto on_error; + pth->p = _ecore_thread_pipe_get(); + pth->death_job = _ecore_thread_worker_new(); + if (!pth->p || !pth->death_job) goto on_error; eina_threads_init(); - if (pthread_create(&pth->thread, NULL, (void *) _ecore_thread_worker, pth) == 0) + if (PHC(pth->thread, _ecore_thread_worker, pth) == 0) return (Ecore_Thread *) work; eina_threads_shutdown(); @@ -527,19 +881,19 @@ ecore_thread_run(Ecore_Thread_Heavy_Cb func_blocking, on_error: if (pth) { - if (pth->p) ecore_pipe_del(pth->p); - pth->p = NULL; + if (pth->p) eina_array_push(_ecore_thread_pipe, pth->p); + if (pth->death_job) _ecore_thread_worker_free(pth->death_job); free(pth); } if (_ecore_thread_count == 0) { - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); _ecore_pending_job_threads = eina_list_remove(_ecore_pending_job_threads, work); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); if (work->func_cancel) - work->func_cancel((void *) work->data); + work->func_cancel((void *) work->data, (Ecore_Thread *) work); free(work); work = NULL; } @@ -549,8 +903,11 @@ ecore_thread_run(Ecore_Thread_Heavy_Cb func_blocking, If no thread and as we don't want to break app that rely on this facility, we will lock the interface until we are done. */ - func_blocking((Ecore_Thread *) work, (void *)data); - func_end((void *)data); + func_blocking((void *)data, (Ecore_Thread *) work); + if (work->cancel == EINA_FALSE) func_end((void *)data, (Ecore_Thread *) work); + else func_end((void *)data, (Ecore_Thread *) work); + + free(work); return NULL; #endif @@ -576,7 +933,7 @@ ecore_thread_run(Ecore_Thread_Heavy_Cb func_blocking, EAPI Eina_Bool ecore_thread_cancel(Ecore_Thread *thread) { -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS Ecore_Pthread_Worker *work = (Ecore_Pthread_Worker *)thread; Eina_List *l; @@ -593,10 +950,10 @@ ecore_thread_cancel(Ecore_Thread *thread) goto on_exit; } - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); if ((have_main_loop_thread) && - (pthread_equal(main_loop_thread, pthread_self()))) + (PHE(main_loop_thread, PHS()))) { if (!work->feedback_run) EINA_LIST_FOREACH(_ecore_pending_job_threads, l, work) @@ -605,10 +962,10 @@ ecore_thread_cancel(Ecore_Thread *thread) { _ecore_pending_job_threads = eina_list_remove_list(_ecore_pending_job_threads, l); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); if (work->func_cancel) - work->func_cancel((void *) work->data); + work->func_cancel((void *) work->data, (Ecore_Thread *) work); free(work); return EINA_TRUE; @@ -621,10 +978,10 @@ ecore_thread_cancel(Ecore_Thread *thread) { _ecore_pending_job_threads_feedback = eina_list_remove_list(_ecore_pending_job_threads_feedback, l); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); if (work->func_cancel) - work->func_cancel((void *) work->data); + work->func_cancel((void *) work->data, (Ecore_Thread *) work); free(work); return EINA_TRUE; @@ -632,7 +989,7 @@ ecore_thread_cancel(Ecore_Thread *thread) } } - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); /* Delay the destruction */ on_exit: @@ -688,28 +1045,28 @@ ecore_thread_check(Ecore_Thread *thread) * the CPU down, so be careful with that. Of course if it can't start a new thread, it will * try to use one from the pool. */ -EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Heavy_Cb func_heavy, +EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Cb func_heavy, Ecore_Thread_Notify_Cb func_notify, - Ecore_Cb func_end, - Ecore_Cb func_cancel, + Ecore_Thread_Cb func_end, + Ecore_Thread_Cb func_cancel, const void *data, Eina_Bool try_no_queue) { -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS Ecore_Pthread_Worker *worker; Ecore_Pthread_Data *pth = NULL; if (!func_heavy) return NULL; - worker = malloc(sizeof (Ecore_Pthread_Worker)); + worker = _ecore_thread_worker_new(); if (!worker) goto on_error; worker->u.feedback_run.func_heavy = func_heavy; worker->u.feedback_run.func_notify = func_notify; worker->hash = NULL; - pthread_cond_init(&worker->cond, NULL); - pthread_mutex_init(&worker->mutex, NULL); + CDI(worker->cond); + LKI(worker->mutex); worker->func_cancel = func_cancel; worker->func_end = func_end; worker->data = data; @@ -720,36 +1077,42 @@ EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Heavy_Cb func_heavy, worker->u.feedback_run.received = 0; worker->u.feedback_run.notify = ecore_pipe_add(_ecore_notify_handler, worker); + worker->u.feedback_run.direct_pipe = NULL; + worker->u.feedback_run.direct_worker = NULL; if (!try_no_queue) { - pthread_t t; + PH(t); + + worker->u.feedback_run.direct_pipe = _ecore_thread_pipe_get(); + worker->u.feedback_run.direct_worker = _ecore_thread_worker_new(); - if (pthread_create(&t, NULL, (void *) _ecore_direct_worker, worker) == 0) + if (PHC(t, _ecore_direct_worker, worker) == 0) return (Ecore_Thread *) worker; } - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); _ecore_pending_job_threads_feedback = eina_list_append(_ecore_pending_job_threads_feedback, worker); if (_ecore_thread_count == _ecore_thread_count_max) { - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); return (Ecore_Thread *) worker; } - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); /* One more thread could be created. */ pth = malloc(sizeof (Ecore_Pthread_Data)); if (!pth) goto on_error; - pth->p = ecore_pipe_add(_ecore_thread_handler, NULL); - if (!pth->p) goto on_error; + pth->p = _ecore_thread_pipe_get(); + pth->death_job = _ecore_thread_worker_new(); + if (!pth->p || !pth->death_job) goto on_error; eina_threads_init(); - if (pthread_create(&pth->thread, NULL, (void *) _ecore_thread_worker, pth) == 0) + if (PHC(pth->thread, _ecore_thread_worker, pth) == 0) return (Ecore_Thread *) worker; eina_threads_shutdown(); @@ -757,18 +1120,19 @@ EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Heavy_Cb func_heavy, on_error: if (pth) { - if (pth->p) ecore_pipe_del(pth->p); + if (pth->p) eina_array_push(_ecore_thread_pipe, pth->p); + if (pth->death_job) _ecore_thread_worker_free(pth->death_job); free(pth); } if (_ecore_thread_count == 0) { - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); + LKL(_ecore_pending_job_threads_mutex); _ecore_pending_job_threads_feedback = eina_list_remove(_ecore_pending_job_threads_feedback, worker); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); - if (func_cancel) func_cancel((void *) data); + if (func_cancel) func_cancel((void *) data, NULL); if (worker) { @@ -800,10 +1164,10 @@ EAPI Ecore_Thread *ecore_thread_feedback_run(Ecore_Thread_Heavy_Cb func_heavy, worker.feedback_run = EINA_TRUE; worker.kill = EINA_FALSE; - func_heavy((Ecore_Thread *) &worker, (void *)data); + func_heavy((void *)data, (Ecore_Thread *) &worker); - if (worker.func_cancel) func_cancel((void *)data); - else func_end((void *)data); + if (worker.cancel) func_cancel((void *)data, (Ecore_Thread *) &worker); + else func_end((void *)data, (Ecore_Thread *) &worker); return NULL; #endif @@ -829,15 +1193,15 @@ ecore_thread_feedback(Ecore_Thread *thread, const void *data) if (!worker) return EINA_FALSE; if (!worker->feedback_run) return EINA_FALSE; -#ifdef EFL_HAVE_PTHREAD - if (!pthread_equal(worker->self, pthread_self())) return EINA_FALSE; +#ifdef EFL_HAVE_THREADS + if (!PHE(worker->self, PHS())) return EINA_FALSE; worker->u.feedback_run.send++; ecore_pipe_write(worker->u.feedback_run.notify, &data, sizeof (void *)); return EINA_TRUE; #else - worker->u.feedback_run.func_notify(thread, (void*) data, (void*) worker->data); + worker->u.feedback_run.func_notify((void*) worker->data, thread, (void*) data); return EINA_TRUE; #endif @@ -852,7 +1216,7 @@ ecore_thread_feedback(Ecore_Thread *thread, const void *data) EAPI int ecore_thread_active_get(void) { -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS return _ecore_thread_count; #else return 0; @@ -869,10 +1233,10 @@ EAPI int ecore_thread_pending_get(void) { int ret; -#ifdef EFL_HAVE_PTHREAD - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); +#ifdef EFL_HAVE_THREADS + LKL(_ecore_pending_job_threads_mutex); ret = eina_list_count(_ecore_pending_job_threads); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); return ret; #else return 0; @@ -889,10 +1253,10 @@ EAPI int ecore_thread_pending_feedback_get(void) { int ret; -#ifdef EFL_HAVE_PTHREAD - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); +#ifdef EFL_HAVE_THREADS + LKL(_ecore_pending_job_threads_mutex); ret = eina_list_count(_ecore_pending_job_threads_feedback); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); return ret; #else return 0; @@ -909,10 +1273,10 @@ EAPI int ecore_thread_pending_total_get(void) { int ret; -#ifdef EFL_HAVE_PTHREAD - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); +#ifdef EFL_HAVE_THREADS + LKL(_ecore_pending_job_threads_mutex); ret = eina_list_count(_ecore_pending_job_threads) + eina_list_count(_ecore_pending_job_threads_feedback); - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); return ret; #else return 0; @@ -969,10 +1333,10 @@ EAPI int ecore_thread_available_get(void) { int ret; -#ifdef EFL_HAVE_PTHREAD - pthread_mutex_lock(&_ecore_pending_job_threads_mutex); +#ifdef EFL_HAVE_THREADS + LKL(_ecore_pending_job_threads_mutex); ret = _ecore_thread_count_max - _ecore_thread_count; - pthread_mutex_unlock(&_ecore_pending_job_threads_mutex); + LKU(_ecore_pending_job_threads_mutex); return ret; #else return 0; @@ -1003,8 +1367,8 @@ ecore_thread_local_data_add(Ecore_Thread *thread, const char *key, void *value, if ((!thread) || (!key) || (!value)) return EINA_FALSE; -#ifdef EFL_HAVE_PTHREAD - if (!pthread_equal(worker->self, pthread_self())) return EINA_FALSE; +#ifdef EFL_HAVE_THREADS + if (!PHE(worker->self, PHS())) return EINA_FALSE; if (!worker->hash) worker->hash = eina_hash_string_small_new(_ecore_thread_data_free); @@ -1022,7 +1386,7 @@ ecore_thread_local_data_add(Ecore_Thread *thread, const char *key, void *value, ret = eina_hash_direct_add(worker->hash, key, d); else ret = eina_hash_add(worker->hash, key, d); - pthread_cond_broadcast(&worker->cond); + CDB(worker->cond); return ret; #else return EINA_TRUE; @@ -1050,8 +1414,8 @@ ecore_thread_local_data_set(Ecore_Thread *thread, const char *key, void *value, void *ret; if ((!thread) || (!key) || (!value)) return NULL; -#ifdef EFL_HAVE_PTHREAD - if (!pthread_equal(worker->self, pthread_self())) return NULL; +#ifdef EFL_HAVE_THREADS + if (!PHE(worker->self, PHS())) return NULL; if (!worker->hash) worker->hash = eina_hash_string_small_new(_ecore_thread_data_free); @@ -1066,7 +1430,7 @@ ecore_thread_local_data_set(Ecore_Thread *thread, const char *key, void *value, d->cb = cb; r = eina_hash_set(worker->hash, key, d); - pthread_cond_broadcast(&worker->cond); + CDB(worker->cond); ret = r->data; free(r); return ret; @@ -1093,8 +1457,8 @@ ecore_thread_local_data_find(Ecore_Thread *thread, const char *key) if ((!thread) || (!key)) return NULL; -#ifdef EFL_HAVE_PTHREAD - if (!pthread_equal(worker->self, pthread_self())) return NULL; +#ifdef EFL_HAVE_THREADS + if (!PHE(worker->self, PHS())) return NULL; if (!worker->hash) return NULL; @@ -1122,8 +1486,8 @@ ecore_thread_local_data_del(Ecore_Thread *thread, const char *key) Ecore_Thread_Data *d; if ((!thread) || (!key)) return EINA_FALSE; -#ifdef EFL_HAVE_PTHREAD - if (!pthread_equal(worker->self, pthread_self())) return EINA_FALSE; +#ifdef EFL_HAVE_THREADS + if (!PHE(worker->self, PHS())) return EINA_FALSE; if (!worker->hash) return EINA_FALSE; @@ -1155,11 +1519,11 @@ ecore_thread_global_data_add(const char *key, void *value, Eina_Free_Cb cb, Eina if ((!key) || (!value)) return EINA_FALSE; -#ifdef EFL_HAVE_PTHREAD - pthread_rwlock_wrlock(&_ecore_thread_global_hash_lock); +#ifdef EFL_HAVE_THREADS + LRWKWL(_ecore_thread_global_hash_lock); if (!_ecore_thread_global_hash) _ecore_thread_global_hash = eina_hash_string_small_new(_ecore_thread_data_free); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); + LRWKU(_ecore_thread_global_hash_lock); if (!(d = malloc(sizeof(Ecore_Thread_Data)))) return EINA_FALSE; @@ -1169,13 +1533,13 @@ ecore_thread_global_data_add(const char *key, void *value, Eina_Free_Cb cb, Eina if (!_ecore_thread_global_hash) return EINA_FALSE; - pthread_rwlock_wrlock(&_ecore_thread_global_hash_lock); + LRWKWL(_ecore_thread_global_hash_lock); if (direct) ret = eina_hash_direct_add(_ecore_thread_global_hash, key, d); else ret = eina_hash_add(_ecore_thread_global_hash, key, d); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); - pthread_cond_broadcast(&_ecore_thread_global_hash_cond); + LRWKU(_ecore_thread_global_hash_lock); + CDB(_ecore_thread_global_hash_cond); return ret; #else return EINA_TRUE; @@ -1203,11 +1567,11 @@ ecore_thread_global_data_set(const char *key, void *value, Eina_Free_Cb cb) if ((!key) || (!value)) return NULL; -#ifdef EFL_HAVE_PTHREAD - pthread_rwlock_wrlock(&_ecore_thread_global_hash_lock); +#ifdef EFL_HAVE_THREADS + LRWKWL(_ecore_thread_global_hash_lock); if (!_ecore_thread_global_hash) _ecore_thread_global_hash = eina_hash_string_small_new(_ecore_thread_data_free); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); + LRWKU(_ecore_thread_global_hash_lock); if (!_ecore_thread_global_hash) return NULL; @@ -1218,10 +1582,10 @@ ecore_thread_global_data_set(const char *key, void *value, Eina_Free_Cb cb) d->data = value; d->cb = cb; - pthread_rwlock_wrlock(&_ecore_thread_global_hash_lock); + LRWKWL(_ecore_thread_global_hash_lock); r = eina_hash_set(_ecore_thread_global_hash, key, d); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); - pthread_cond_broadcast(&_ecore_thread_global_hash_cond); + LRWKU(_ecore_thread_global_hash_lock); + CDB(_ecore_thread_global_hash_cond); ret = r->data; free(r); @@ -1250,12 +1614,12 @@ ecore_thread_global_data_find(const char *key) Ecore_Thread_Data *ret; if (!key) return NULL; -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS if (!_ecore_thread_global_hash) return NULL; - pthread_rwlock_rdlock(&_ecore_thread_global_hash_lock); + LRWKRL(_ecore_thread_global_hash_lock); ret = eina_hash_find(_ecore_thread_global_hash, key); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); + LRWKU(_ecore_thread_global_hash_lock); return ret->data; #else return NULL; @@ -1278,15 +1642,15 @@ ecore_thread_global_data_del(const char *key) if (!key) return EINA_FALSE; -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS if (!_ecore_thread_global_hash) return EINA_FALSE; - pthread_rwlock_wrlock(&_ecore_thread_global_hash_lock); + LRWKWL(_ecore_thread_global_hash_lock); if ((d = eina_hash_find(_ecore_thread_global_hash, key))) _ecore_thread_data_free(d); ret = eina_hash_del_by_key(_ecore_thread_global_hash, key); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); + LRWKU(_ecore_thread_global_hash_lock); return ret; #else return EINA_TRUE; @@ -1312,7 +1676,7 @@ ecore_thread_global_data_wait(const char *key, double seconds) Ecore_Thread_Data *ret = NULL; if (!key) return NULL; -#ifdef EFL_HAVE_PTHREAD +#ifdef EFL_HAVE_THREADS if (!_ecore_thread_global_hash) return NULL; if (seconds > 0) @@ -1320,18 +1684,25 @@ ecore_thread_global_data_wait(const char *key, double seconds) while (1) { +#ifndef _WIN32 struct timespec t = { 0, 0 }; t.tv_sec = (long int)time; t.tv_nsec = (long int)((time - (double)t.tv_sec) * 1000000000); - pthread_rwlock_rdlock(&_ecore_thread_global_hash_lock); +#else + struct timeval t = { 0, 0 }; + + t.tv_sec = (long int)time; + t.tv_usec = (long int)((time - (double)t.tv_sec) * 1000000); +#endif + LRWKRL(_ecore_thread_global_hash_lock); ret = eina_hash_find(_ecore_thread_global_hash, key); - pthread_rwlock_unlock(&_ecore_thread_global_hash_lock); + LRWKU(_ecore_thread_global_hash_lock); if ((ret) || (!seconds) || ((seconds > 0) && (time <= ecore_time_get()))) break; - pthread_mutex_lock(&_ecore_thread_global_hash_mutex); - pthread_cond_timedwait(&_ecore_thread_global_hash_cond, &_ecore_thread_global_hash_mutex, &t); - pthread_mutex_unlock(&_ecore_thread_global_hash_mutex); + LKL(_ecore_thread_global_hash_mutex); + CDW(_ecore_thread_global_hash_cond, _ecore_thread_global_hash_mutex, &t); + LKU(_ecore_thread_global_hash_mutex); } if (ret) return ret->data; return NULL; diff --git a/src/lib/ecore_cocoa/Makefile.am b/src/lib/ecore_cocoa/Makefile.am index ba9c8fd..4ac7b11 100644 --- a/src/lib/ecore_cocoa/Makefile.am +++ b/src/lib/ecore_cocoa/Makefile.am @@ -8,8 +8,6 @@ AM_CPPFLAGS = \ @EVAS_CFLAGS@ \ @EINA_CFLAGS@ -if BUILD_ECORE_COCOA - lib_LTLIBRARIES = libecore_cocoa.la includes_HEADERS = \ Ecore_Cocoa.h \ @@ -28,6 +26,4 @@ $(top_builddir)/src/lib/ecore_input/libecore_input.la \ libecore_cocoa_la_LDFLAGS = @cocoa_ldflags@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_cocoa_private.h diff --git a/src/lib/ecore_con/Ecore_Con.h b/src/lib/ecore_con/Ecore_Con.h index d5fc0df..b311785 100644 --- a/src/lib/ecore_con/Ecore_Con.h +++ b/src/lib/ecore_con/Ecore_Con.h @@ -448,6 +448,7 @@ EAPI void ecore_con_client_flush(Ecore_Con_Client *cl); EAPI double ecore_con_client_uptime_get(Ecore_Con_Client *cl); EAPI double ecore_con_client_timeout_get(Ecore_Con_Client *cl); EAPI void ecore_con_client_timeout_set(Ecore_Con_Client *cl, double timeout); +EAPI Eina_Bool ecore_con_client_connected_get(Ecore_Con_Client *cl); /** * @} diff --git a/src/lib/ecore_con/Makefile.am b/src/lib/ecore_con/Makefile.am index bd9a083..e2969bd 100644 --- a/src/lib/ecore_con/Makefile.am +++ b/src/lib/ecore_con/Makefile.am @@ -12,8 +12,6 @@ AM_CPPFLAGS = \ @CARES_CFLAGS@ \ @WIN32_CPPFLAGS@ -if BUILD_ECORE_CON - lib_LTLIBRARIES = libecore_con.la includes_HEADERS = Ecore_Con.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -37,6 +35,4 @@ $(top_builddir)/src/lib/ecore/libecore.la \ libecore_con_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_con_private.h diff --git a/src/lib/ecore_con/ecore_con.c b/src/lib/ecore_con/ecore_con.c index 3095fd6..137a3b7 100644 --- a/src/lib/ecore_con/ecore_con.c +++ b/src/lib/ecore_con/ecore_con.c @@ -46,33 +46,53 @@ static Eina_Bool _ecore_con_client_timer(Ecore_Con_Client *cl); static void _ecore_con_cl_timer_update(Ecore_Con_Client *cl); -static void _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *info); -static void _ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *info); -static void _ecore_con_cb_tcp_listen(void *data, Ecore_Con_Info *info); -static void _ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *info); +static void _ecore_con_cb_tcp_connect(void *data, + Ecore_Con_Info *info); +static void _ecore_con_cb_udp_connect(void *data, + Ecore_Con_Info *info); +static void _ecore_con_cb_tcp_listen(void *data, + Ecore_Con_Info *info); +static void _ecore_con_cb_udp_listen(void *data, + Ecore_Con_Info *info); static void _ecore_con_server_free(Ecore_Con_Server *svr); static void _ecore_con_client_free(Ecore_Con_Client *cl); -static Eina_Bool _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler); -static Eina_Bool _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler); -static Eina_Bool _ecore_con_cl_udp_handler(void *data, Ecore_Fd_Handler *fd_handler); -static Eina_Bool _ecore_con_svr_udp_handler(void *data, Ecore_Fd_Handler *fd_handler); +static Eina_Bool _ecore_con_svr_tcp_handler(void *data, + Ecore_Fd_Handler *fd_handler); +static Eina_Bool _ecore_con_cl_handler(void *data, + Ecore_Fd_Handler *fd_handler); +static Eina_Bool _ecore_con_cl_udp_handler(void *data, + Ecore_Fd_Handler *fd_handler); +static Eina_Bool _ecore_con_svr_udp_handler(void *data, + Ecore_Fd_Handler *fd_handler); static void _ecore_con_svr_cl_read(Ecore_Con_Client *cl); -static Eina_Bool _ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler); - -static void _ecore_con_server_flush(Ecore_Con_Server *svr); -static void _ecore_con_client_flush(Ecore_Con_Client *cl); - -static void _ecore_con_event_client_add_free(void *data, void *ev); -static void _ecore_con_event_client_del_free(void *data, void *ev); -static void _ecore_con_event_client_data_free(void *data, void *ev); -static void _ecore_con_event_server_add_free(void *data, void *ev); -static void _ecore_con_event_server_del_free(void *data, void *ev); -static void _ecore_con_event_server_data_free(void *data, void *ev); - -static void _ecore_con_lookup_done(void *data, Ecore_Con_Info *infos); +static Eina_Bool _ecore_con_svr_cl_handler(void *data, + Ecore_Fd_Handler *fd_handler); + +static void _ecore_con_server_flush(Ecore_Con_Server *svr); +static void _ecore_con_client_flush(Ecore_Con_Client *cl); + +static void _ecore_con_event_client_add_free(void *data, + void *ev); +static void _ecore_con_event_client_del_free(void *data, + void *ev); +static void _ecore_con_event_client_data_free(void *data, + void *ev); +static void _ecore_con_event_server_add_free(void *data, + void *ev); +static void _ecore_con_event_server_del_free(void *data, + void *ev); +static void _ecore_con_event_server_data_free(void *data, + void *ev); + +static void _ecore_con_lookup_done(void *data, + Ecore_Con_Info *infos); + +static const char * +_ecore_con_pretty_ip(struct sockaddr *client_addr, + socklen_t size); EAPI int ECORE_CON_EVENT_CLIENT_ADD = 0; EAPI int ECORE_CON_EVENT_CLIENT_DEL = 0; @@ -102,20 +122,20 @@ EAPI int ecore_con_init(void) { if (++_ecore_con_init_count != 1) - return _ecore_con_init_count; + return _ecore_con_init_count; #ifdef HAVE_EVIL if (!evil_init()) - return --_ecore_con_init_count; + return --_ecore_con_init_count; #endif if (!ecore_init()) - return --_ecore_con_init_count; + return --_ecore_con_init_count; _ecore_con_log_dom = eina_log_domain_register - ("ecore_con", ECORE_CON_DEFAULT_LOG_COLOR); - if(_ecore_con_log_dom < 0) + ("ecore_con", ECORE_CON_DEFAULT_LOG_COLOR); + if (_ecore_con_log_dom < 0) { EINA_LOG_ERR("Impossible to create a log domain for Ecore Con."); ecore_shutdown(); @@ -129,6 +149,11 @@ ecore_con_init(void) ECORE_CON_EVENT_CLIENT_DATA = ecore_event_type_new(); ECORE_CON_EVENT_SERVER_DATA = ecore_event_type_new(); + + eina_magic_string_set(ECORE_MAGIC_CON_SERVER, "Ecore_Con_Server"); + eina_magic_string_set(ECORE_MAGIC_CON_CLIENT, "Ecore_Con_Server"); + eina_magic_string_set(ECORE_MAGIC_CON_URL, "Ecore_Con_Url"); + /* TODO Remember return value, if it fails, use gethostbyname() */ ecore_con_ssl_init(); ecore_con_info_init(); @@ -144,11 +169,14 @@ ecore_con_init(void) EAPI int ecore_con_shutdown(void) { + Eina_List *l, *l2; + Ecore_Con_Server *svr; + if (--_ecore_con_init_count != 0) - return _ecore_con_init_count; + return _ecore_con_init_count; - while (servers) - _ecore_con_server_free(eina_list_data_get(servers)); + EINA_LIST_FOREACH_SAFE(servers, l, l2, svr) + _ecore_con_server_free(svr); ecore_con_info_shutdown(); ecore_con_ssl_shutdown(); @@ -174,18 +202,20 @@ ecore_con_shutdown(void) * @return EINA_TRUE if the request did not fail to be set up, EINA_FALSE if it failed. */ EAPI Eina_Bool -ecore_con_lookup(const char *name, Ecore_Con_Dns_Cb done_cb, const void *data) +ecore_con_lookup(const char *name, + Ecore_Con_Dns_Cb done_cb, + const void *data) { Ecore_Con_Server *svr; Ecore_Con_Lookup *lk; struct addrinfo hints; if (!name || !done_cb) - return EINA_FALSE; + return EINA_FALSE; svr = calloc(1, sizeof(Ecore_Con_Server)); if (!svr) - return EINA_FALSE; + return EINA_FALSE; lk = malloc(sizeof (Ecore_Con_Lookup)); if (!lk) @@ -199,7 +229,7 @@ ecore_con_lookup(const char *name, Ecore_Con_Dns_Cb done_cb, const void *data) svr->name = strdup(name); if (!svr->name) - goto on_error; + goto on_error; svr->type = ECORE_CON_REMOTE_TCP; svr->port = 1025; @@ -221,7 +251,7 @@ ecore_con_lookup(const char *name, Ecore_Con_Dns_Cb done_cb, const void *data) if (ecore_con_info_get(svr, _ecore_con_lookup_done, svr, &hints)) - return EINA_TRUE; + return EINA_TRUE; free(svr->name); on_error: @@ -234,7 +264,6 @@ on_error: * @} */ - /** * @addtogroup Ecore_Con_Server_Group Ecore Connection Server Functions * @@ -246,7 +275,7 @@ on_error: /** * @example ecore_con_server_example.c * Shows how to write a simple server using the Ecore_Con library. -*/ + */ /** * Creates a server to listen for connections. @@ -274,25 +303,25 @@ on_error: */ EAPI Ecore_Con_Server * ecore_con_server_add(Ecore_Con_Type compl_type, - const char *name, - int port, - const void *data) + const char *name, + int port, + const void *data) { Ecore_Con_Server *svr; Ecore_Con_Type type; if (port < 0 || !name) - return NULL; /* local user socket: FILE: ~/.ecore/[name]/[port] */ + return NULL; /* local user socket: FILE: ~/.ecore/[name]/[port] */ /* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */ /* remote system socket: TCP/IP: [name]:[port] */ svr = calloc(1, sizeof(Ecore_Con_Server)); if (!svr) - return NULL; + return NULL; svr->name = strdup(name); if (!svr->name) - goto error; + goto error; svr->type = compl_type; svr->port = port; @@ -312,24 +341,24 @@ ecore_con_server_add(Ecore_Con_Type compl_type, if ((type == ECORE_CON_LOCAL_USER) || (type == ECORE_CON_LOCAL_SYSTEM) || (type == ECORE_CON_LOCAL_ABSTRACT)) - /* Local */ - if (!ecore_con_local_listen(svr, _ecore_con_svr_tcp_handler, svr)) - goto error; + /* Local */ + if (!ecore_con_local_listen(svr, _ecore_con_svr_tcp_handler, svr)) + goto error; if ((type == ECORE_CON_REMOTE_TCP) || (type == ECORE_CON_REMOTE_NODELAY)) { /* TCP */ - if (!ecore_con_info_tcp_listen(svr, _ecore_con_cb_tcp_listen, - svr)) + if (!ecore_con_info_tcp_listen(svr, _ecore_con_cb_tcp_listen, + svr)) goto error; } else if ((type == ECORE_CON_REMOTE_MCAST) || (type == ECORE_CON_REMOTE_UDP)) - /* UDP and MCAST */ - if (!ecore_con_info_udp_listen(svr, _ecore_con_cb_udp_listen, - svr)) - goto error; + /* UDP and MCAST */ + if (!ecore_con_info_udp_listen(svr, _ecore_con_cb_udp_listen, + svr)) + goto error; servers = eina_list_append(servers, svr); ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER); @@ -338,26 +367,26 @@ ecore_con_server_add(Ecore_Con_Type compl_type, error: if (svr->name) - free(svr->name); + free(svr->name); if (svr->path) - free(svr->path); + free(svr->path); #ifndef _WIN32 if (svr->fd >= 0) - close(svr->fd); + close(svr->fd); if (svr->fd_handler) - ecore_main_fd_handler_del(svr->fd_handler); + ecore_main_fd_handler_del(svr->fd_handler); if (svr->write_buf) - free(svr->write_buf); + free(svr->write_buf); if (svr->ip) - free(svr->ip); + eina_stringshare_del(svr->ip); #endif - ecore_con_ssl_server_shutdown(svr); + ecore_con_ssl_server_shutdown(svr); free(svr); return NULL; } @@ -389,25 +418,25 @@ error: */ EAPI Ecore_Con_Server * ecore_con_server_connect(Ecore_Con_Type compl_type, - const char *name, - int port, - const void *data) + const char *name, + int port, + const void *data) { Ecore_Con_Server *svr; Ecore_Con_Type type; if (!name) - return NULL; + return NULL; /* local user socket: FILE: ~/.ecore/[name]/[port] */ /* local system socket: FILE: /tmp/.ecore_service|[name]|[port] */ /* remote system socket: TCP/IP: [name]:[port] */ svr = calloc(1, sizeof(Ecore_Con_Server)); if (!svr) - return NULL; + return NULL; svr->name = strdup(name); if (!svr->name) - goto error; + goto error; svr->type = compl_type; svr->port = port; @@ -427,31 +456,31 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, (type == ECORE_CON_REMOTE_UDP) || (type == ECORE_CON_REMOTE_BROADCAST)) && (port < 0)) - goto error; + goto error; if ((type == ECORE_CON_LOCAL_USER) || (type == ECORE_CON_LOCAL_SYSTEM) || (type == ECORE_CON_LOCAL_ABSTRACT)) - /* Local */ - if (!ecore_con_local_connect(svr, _ecore_con_cl_handler, svr, - _ecore_con_event_server_add_free)) - goto - error; + /* Local */ + if (!ecore_con_local_connect(svr, _ecore_con_cl_handler, svr, + _ecore_con_event_server_add_free)) + goto + error; if ((type == ECORE_CON_REMOTE_TCP) || (type == ECORE_CON_REMOTE_NODELAY)) { /* TCP */ - if (!ecore_con_info_tcp_connect(svr, _ecore_con_cb_tcp_connect, - svr)) + if (!ecore_con_info_tcp_connect(svr, _ecore_con_cb_tcp_connect, + svr)) goto error; } else if ((type == ECORE_CON_REMOTE_UDP) || (type == ECORE_CON_REMOTE_BROADCAST)) - /* UDP and MCAST */ - if (!ecore_con_info_udp_connect(svr, _ecore_con_cb_udp_connect, - svr)) - goto error; + /* UDP and MCAST */ + if (!ecore_con_info_udp_connect(svr, _ecore_con_cb_udp_connect, + svr)) + goto error; servers = eina_list_append(servers, svr); ECORE_MAGIC_SET(svr, ECORE_MAGIC_CON_SERVER); @@ -460,16 +489,16 @@ ecore_con_server_connect(Ecore_Con_Type compl_type, error: if (svr->name) - free(svr->name); + free(svr->name); if (svr->path) - free(svr->path); + free(svr->path); if (svr->fd >= 0) - close(svr->fd); + close(svr->fd); if (svr->fd_handler) - ecore_main_fd_handler_del(svr->fd_handler); + ecore_main_fd_handler_del(svr->fd_handler); ecore_con_ssl_server_shutdown(svr); free(svr); @@ -484,7 +513,8 @@ error: * disables the idle timeout. */ EAPI void -ecore_con_server_timeout_set(Ecore_Con_Server *svr, double timeout) +ecore_con_server_timeout_set(Ecore_Con_Server *svr, + double timeout) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -532,10 +562,9 @@ ecore_con_server_del(Ecore_Con_Server *svr) } if (svr->delete_me) - return NULL; + return NULL; data = svr->data; - svr->data = NULL; svr->delete_me = EINA_TRUE; if (svr->event_count > 0) { @@ -546,7 +575,7 @@ ecore_con_server_del(Ecore_Con_Server *svr) } } else - _ecore_con_server_free(svr); + _ecore_con_server_free(svr); return data; } @@ -577,7 +606,8 @@ ecore_con_server_data_get(Ecore_Con_Server *svr) * @return The previously associated data, if any. */ EAPI void * -ecore_con_server_data_set(Ecore_Con_Server *svr, void *data) +ecore_con_server_data_set(Ecore_Con_Server *svr, + void *data) { void *ret = NULL; @@ -610,7 +640,7 @@ ecore_con_server_connected_get(Ecore_Con_Server *svr) } if (svr->connecting) - return EINA_FALSE; + return EINA_FALSE; return EINA_TRUE; } @@ -678,8 +708,8 @@ ecore_con_server_port_get(Ecore_Con_Server *svr) */ EAPI int ecore_con_server_send(Ecore_Con_Server *svr, - const void *data, - int size) + const void *data, + int size) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -687,36 +717,30 @@ ecore_con_server_send(Ecore_Con_Server *svr, return 0; } - if (svr->dead) - return 0; + EINA_SAFETY_ON_TRUE_RETURN_VAL(svr->dead, 0); - if (!data) - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); - if (size < 1) - return 0; + EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0); if (svr->fd_handler) - ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); if (svr->write_buf) { unsigned char *newbuf; newbuf = realloc(svr->write_buf, svr->write_buf_size + size); - if (newbuf) - svr->write_buf = newbuf; - else - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(newbuf, 0); + svr->write_buf = newbuf; memcpy(svr->write_buf + svr->write_buf_size, data, size); svr->write_buf_size += size; } else { svr->write_buf = malloc(size); - if (!svr->write_buf) - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(svr->write_buf, 0); svr->write_buf_size = size; memcpy(svr->write_buf, data, size); @@ -748,8 +772,8 @@ ecore_con_server_send(Ecore_Con_Server *svr, */ EAPI void ecore_con_server_client_limit_set(Ecore_Con_Server *svr, - int client_limit, - char reject_excess_clients) + int client_limit, + char reject_excess_clients) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -783,7 +807,6 @@ ecore_con_server_ip_get(Ecore_Con_Server *svr) return svr->ip; } - /** * @brief Check how long a server has been connected * @param svr The server to check @@ -801,6 +824,7 @@ ecore_con_server_uptime_get(Ecore_Con_Server *svr) return ecore_time_get() - svr->start_time; } + /** * Flushes all pending data to the given server. Will return when done. * @@ -818,7 +842,6 @@ ecore_con_server_flush(Ecore_Con_Server *svr) _ecore_con_server_flush(svr); } - /** * @} */ @@ -834,7 +857,7 @@ ecore_con_server_flush(Ecore_Con_Server *svr) /** * @example ecore_con_client_example.c * Shows how to write a simple client that connects to the example server. -*/ + */ /** * Sends the given data to the given client. @@ -846,8 +869,8 @@ ecore_con_server_flush(Ecore_Con_Server *svr) */ EAPI int ecore_con_client_send(Ecore_Con_Client *cl, - const void *data, - int size) + const void *data, + int size) { if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT)) { @@ -855,31 +878,26 @@ ecore_con_client_send(Ecore_Con_Client *cl, return 0; } - if (cl->dead) - return 0; + EINA_SAFETY_ON_TRUE_RETURN_VAL(cl->dead, 0); - if (!data) - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); - if (size < 1) - return 0; + EINA_SAFETY_ON_TRUE_RETURN_VAL(size < 1, 0); if (cl->fd_handler) - ecore_main_fd_handler_active_set( - cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ | ECORE_FD_WRITE); - if(cl->host_server && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP)) - sendto(cl->host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr, - cl->client_addr_len); + if (cl->host_server && ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP)) + sendto(cl->host_server->fd, data, size, 0, (struct sockaddr *)cl->client_addr, + cl->client_addr_len); else if (cl->buf) { unsigned char *newbuf; newbuf = realloc(cl->buf, cl->buf_size + size); - if (newbuf) - cl->buf = newbuf; - else - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(newbuf, 0); + + cl->buf = newbuf; memcpy(cl->buf + cl->buf_size, data, size); cl->buf_size += size; @@ -887,8 +905,7 @@ ecore_con_client_send(Ecore_Con_Client *cl, else { cl->buf = malloc(size); - if (!cl->buf) - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(cl->buf, 0); cl->buf_size = size; memcpy(cl->buf, data, size); @@ -917,6 +934,24 @@ ecore_con_client_server_get(Ecore_Con_Client *cl) } /** + * Returns whether the client is still connected + * @param cl The given client. + * @return #EINA_TRUE if connected, else EINA_FALSE + */ +EAPI Eina_Bool +ecore_con_client_connected_get(Ecore_Con_Client *cl) +{ + if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT)) + { + ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, + "ecore_con_client_connected_get"); + return EINA_FALSE; + } + + return !cl->dead; +} + +/** * Set the time after which the client will be disconnected when inactive * @param cl The client object * @param timeout The timeout, in seconds, to disconnect after @@ -924,7 +959,8 @@ ecore_con_client_server_get(Ecore_Con_Client *cl) * disables the idle timeout. */ EAPI void -ecore_con_client_timeout_set(Ecore_Con_Client *cl, double timeout) +ecore_con_client_timeout_set(Ecore_Con_Client *cl, + double timeout) { if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT)) { @@ -973,14 +1009,11 @@ ecore_con_client_del(Ecore_Con_Client *cl) return NULL; } - if (cl->client_addr && cl->host_server && - (((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP) || - ((cl->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST))) - free(cl->client_addr); + if (cl->client_addr) + free(cl->client_addr); + cl->client_addr = NULL; data = cl->data; - - cl->data = NULL; cl->delete_me = EINA_TRUE; if (cl->event_count > 0) { @@ -1010,7 +1043,8 @@ ecore_con_client_del(Ecore_Con_Client *cl) * @param data What to set the data to. */ EAPI void -ecore_con_client_data_set(Ecore_Con_Client *cl, const void *data) +ecore_con_client_data_set(Ecore_Con_Client *cl, + const void *data) { if (!ECORE_MAGIC_CHECK(cl, ECORE_MAGIC_CON_CLIENT)) { @@ -1059,6 +1093,8 @@ ecore_con_client_ip_get(Ecore_Con_Client *cl) ECORE_MAGIC_FAIL(cl, ECORE_MAGIC_CON_CLIENT, "ecore_con_client_ip_get"); return NULL; } + if (!cl->ip) + cl->ip = _ecore_con_pretty_ip(cl->client_addr, cl->client_addr_len); return cl->ip; } @@ -1108,6 +1144,25 @@ _ecore_con_server_free(Ecore_Con_Server *svr) Ecore_Con_Client *cl; double t_start, t; + if ((!svr->write_buf) && svr->delete_me && (!svr->dead) && (svr->event_count < 1)) + { + /* this is a catch-all for cases when a server is not properly killed. */ + + Ecore_Con_Event_Server_Del *e; + + svr->dead = EINA_TRUE; + e = calloc(1, sizeof(Ecore_Con_Event_Server_Del)); + EINA_SAFETY_ON_NULL_RETURN(e); + + svr->event_count++; + e->server = svr; + ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, + _ecore_con_event_server_del_free, NULL); + return; + } + + if (svr->event_count > 0) + return; ECORE_MAGIC_SET(svr, ECORE_MAGIC_NONE); t_start = ecore_time_get(); while ((svr->write_buf) && (!svr->dead)) @@ -1125,30 +1180,31 @@ _ecore_con_server_free(Ecore_Con_Server *svr) } if (svr->write_buf) - free(svr->write_buf); + free(svr->write_buf); EINA_LIST_FREE(svr->clients, cl) _ecore_con_client_free(cl); if ((svr->created) && (svr->path) && (svr->ppid == getpid())) - unlink(svr->path); + unlink(svr->path); ecore_con_ssl_server_shutdown(svr); if (svr->fd >= 0) - close(svr->fd); + close(svr->fd); if (svr->name) - free(svr->name); + free(svr->name); if (svr->path) - free(svr->path); + free(svr->path); if (svr->ip) - free(svr->ip); + eina_stringshare_del(svr->ip); if (svr->fd_handler) - ecore_main_fd_handler_del(svr->fd_handler); + ecore_main_fd_handler_del(svr->fd_handler); servers = eina_list_remove(servers, svr); + svr->data = NULL; free(svr); } @@ -1159,27 +1215,25 @@ _ecore_con_client_free(Ecore_Con_Client *cl) if ((!cl->buf) && cl->delete_me && (!cl->dead) && (cl->event_count < 1)) { - /* this is a catch-all for cases when a client is not properly killed. - * the only example case I've found so far is if a client ssl handshakes - * and then immediately disconnects without sending any further data. - */ + /* this is a catch-all for cases when a client is not properly killed. */ - /* we lost our client! */ - Ecore_Con_Event_Client_Del *e; + /* we lost our client! */ + Ecore_Con_Event_Client_Del *e; - cl->dead = EINA_TRUE; - e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); - if (e) - { - cl->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, - _ecore_con_event_client_del_free, NULL); - return; - } + cl->dead = EINA_TRUE; + e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); + EINA_SAFETY_ON_NULL_RETURN(e); + + cl->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, + _ecore_con_event_client_del_free, NULL); + return; } + if (cl->event_count > 0) + return; ECORE_MAGIC_SET(cl, ECORE_MAGIC_NONE); t_start = ecore_time_get(); while ((cl->buf) && (!cl->dead)) @@ -1196,21 +1250,21 @@ _ecore_con_client_free(Ecore_Con_Client *cl) } } if (cl->buf) - free(cl->buf); + free(cl->buf); if (cl->host_server->type & ECORE_CON_SSL) ecore_con_ssl_client_shutdown(cl); if (cl->fd >= 0) - close(cl->fd); + close(cl->fd); if (cl->fd_handler) - ecore_main_fd_handler_del(cl->fd_handler); + ecore_main_fd_handler_del(cl->fd_handler); if (cl->ip) - free(cl->ip); - - free(cl); + eina_stringshare_del(cl->ip); + cl->data = NULL; + free(cl); return; } @@ -1222,18 +1276,17 @@ _ecore_con_server_kill(Ecore_Con_Server *svr) Ecore_Con_Event_Server_Del *e; e = calloc(1, sizeof(Ecore_Con_Event_Server_Del)); - if (e) - { - svr->event_count++; - e->server = svr; - ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, - _ecore_con_event_server_del_free, NULL); - } + EINA_SAFETY_ON_NULL_RETURN(e); + + svr->event_count++; + e->server = svr; + ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, + _ecore_con_event_server_del_free, NULL); } svr->dead = EINA_TRUE; if (svr->fd_handler) - ecore_main_fd_handler_del(svr->fd_handler); + ecore_main_fd_handler_del(svr->fd_handler); svr->fd_handler = NULL; } @@ -1282,32 +1335,33 @@ _ecore_con_cl_timer_update(Ecore_Con_Client *cl) } static void -_ecore_con_cb_tcp_listen(void *data, Ecore_Con_Info *net_info) +_ecore_con_cb_tcp_listen(void *data, + Ecore_Con_Info *net_info) { Ecore_Con_Server *svr; struct linger lin; svr = data; - if(!net_info) - goto error; + if (!net_info) + goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); if (svr->fd < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - goto error; + goto error; lin.l_onoff = 1; lin.l_linger = 0; if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin, sizeof(struct linger)) < 0) - goto error; + goto error; if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY) { @@ -1315,20 +1369,20 @@ _ecore_con_cb_tcp_listen(void *data, Ecore_Con_Info *net_info) if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0) - goto error; + goto error; } if (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0) - goto error; + goto error; if (listen(svr->fd, 4096) < 0) - goto error; + goto error; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - _ecore_con_svr_tcp_handler, svr, NULL, NULL); + _ecore_con_svr_tcp_handler, svr, NULL, NULL); if (!svr->fd_handler) - goto error; + goto error; return; @@ -1338,7 +1392,8 @@ error: } static void -_ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *net_info) +_ecore_con_cb_udp_listen(void *data, + Ecore_Con_Info *net_info) { Ecore_Con_Server *svr; Ecore_Con_Type type; @@ -1351,12 +1406,12 @@ _ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *net_info) type &= ECORE_CON_TYPE; if (!net_info) - goto error; + goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); - if(svr->fd < 0) - goto error; + if (svr->fd < 0) + goto error; if (type == ECORE_CON_REMOTE_MCAST) { @@ -1364,47 +1419,47 @@ _ecore_con_cb_udp_listen(void *data, Ecore_Con_Info *net_info) { if (!inet_pton(net_info->info.ai_family, net_info->ip, &mreq.imr_multiaddr)) - goto error; + goto error; mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, - (const void *)&mreq,sizeof(mreq)) != 0) - goto error; + (const void *)&mreq, sizeof(mreq)) != 0) + goto error; } else if (net_info->info.ai_family == AF_INET6) { if (!inet_pton(net_info->info.ai_family, net_info->ip, &mreq6.ipv6mr_multiaddr)) - goto error; + goto error; mreq6.ipv6mr_interface = htonl(INADDR_ANY); if (setsockopt(svr->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, - (const void *)&mreq6,sizeof(mreq6)) != 0) - goto error; + (const void *)&mreq6, sizeof(mreq6)) != 0) + goto error; } if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&on, sizeof(on)) != 0) - goto error; + goto error; } if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - goto error; + goto error; if (bind(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0) - goto error; + goto error; svr->fd_handler = - ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - _ecore_con_svr_udp_handler, svr, NULL, NULL); + ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, + _ecore_con_svr_udp_handler, svr, NULL, NULL); if (!svr->fd_handler) - goto error; + goto error; - svr->ip = strdup(net_info->ip); + svr->ip = eina_stringshare_add(net_info->ip); return; @@ -1414,7 +1469,8 @@ error: } static void -_ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info) +_ecore_con_cb_tcp_connect(void *data, + Ecore_Con_Info *net_info) { Ecore_Con_Server *svr; int res; @@ -1423,22 +1479,22 @@ _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info) svr = data; if (!net_info) - goto error; + goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); if (svr->fd < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - goto error; + goto error; if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0) - goto error; + goto error; if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_NODELAY) { @@ -1446,7 +1502,7 @@ _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info) if (setsockopt(svr->fd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0) - goto error; + goto error; } res = connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen); @@ -1454,23 +1510,23 @@ _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info) if (res == SOCKET_ERROR) { if (WSAGetLastError() != WSAEINPROGRESS) - goto error; + goto error; #else if (res < 0) { if (errno != EINPROGRESS) - goto error; + goto error; #endif svr->connecting = EINA_TRUE; svr->fd_handler = - ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE, - _ecore_con_cl_handler, svr, NULL, NULL); + ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE, + _ecore_con_cl_handler, svr, NULL, NULL); } else - svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - _ecore_con_cl_handler, svr, NULL, NULL); + svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, + _ecore_con_cl_handler, svr, NULL, NULL); if (svr->type & ECORE_CON_SSL) { @@ -1482,9 +1538,9 @@ _ecore_con_cb_tcp_connect(void *data, Ecore_Con_Info *net_info) } if (!svr->fd_handler) - goto error; + goto error; - svr->ip = strdup(net_info->ip); + svr->ip = eina_stringshare_add(net_info->ip); return; @@ -1494,7 +1550,8 @@ error: } static void -_ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *net_info) +_ecore_con_cb_udp_connect(void *data, + Ecore_Con_Info *net_info) { Ecore_Con_Server *svr; int curstate = 0; @@ -1502,40 +1559,40 @@ _ecore_con_cb_udp_connect(void *data, Ecore_Con_Info *net_info) svr = data; if (!net_info) - goto error; + goto error; svr->fd = socket(net_info->info.ai_family, net_info->info.ai_socktype, net_info->info.ai_protocol); if (svr->fd < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - goto error; + goto error; if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - goto error; + goto error; if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_BROADCAST) { if (setsockopt(svr->fd, SOL_SOCKET, SO_BROADCAST, (const void *)&broadcast, sizeof(broadcast)) < 0) - goto error; + goto error; } else if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0) - goto error; + goto error; if (connect(svr->fd, net_info->info.ai_addr, net_info->info.ai_addrlen) < 0) - goto error; + goto error; svr->fd_handler = ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ | ECORE_FD_WRITE, - _ecore_con_cl_udp_handler, svr, NULL, NULL); + _ecore_con_cl_udp_handler, svr, NULL, NULL); if (!svr->fd_handler) - goto error; + goto error; - svr->ip = strdup(net_info->ip); + svr->ip = eina_stringshare_add(net_info->ip); return; @@ -1551,26 +1608,28 @@ svr_try_connect_plain(Ecore_Con_Server *svr) int so_err = 0; unsigned int size = sizeof(int); + errno = 0; res = getsockopt(svr->fd, SOL_SOCKET, SO_ERROR, (void *)&so_err, &size); #ifdef _WIN32 if (res == SOCKET_ERROR) - so_err = -1; + so_err = WSAGetLastError(); - if (so_err == WSAEINPROGRESS && !svr->dead) - return ECORE_CON_INPROGRESS; + if ((so_err == WSAEINPROGRESS) && !svr->dead) + return ECORE_CON_INPROGRESS; #else if (res < 0) - so_err = -1; + so_err = errno; - if (so_err == EINPROGRESS && !svr->dead) - return ECORE_CON_INPROGRESS; + if ((so_err == EINPROGRESS) && !svr->dead) + return ECORE_CON_INPROGRESS; #endif - if (so_err != 0) + if (so_err) { /* we lost our server! */ + ERR("Connection lost: %s", strerror(so_err)); _ecore_con_server_kill(svr); return ECORE_CON_DISCONNECTED; } @@ -1578,31 +1637,31 @@ svr_try_connect_plain(Ecore_Con_Server *svr) if ((!svr->delete_me) && (!svr->handshaking) && svr->connecting) { /* we got our server! */ - Ecore_Con_Event_Server_Add *e; + Ecore_Con_Event_Server_Add *e; - svr->connecting = EINA_FALSE; - e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); - if (e) - { - svr->event_count++; - svr->start_time = ecore_time_get(); - e->server = svr; - ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, - _ecore_con_event_server_add_free, NULL); - } + svr->connecting = EINA_FALSE; + e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CON_CONNECTED); + + svr->event_count++; + svr->start_time = ecore_time_get(); + e->server = svr; + ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, + _ecore_con_event_server_add_free, NULL); } if (svr->fd_handler && (!svr->write_buf)) - ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); if (!svr->dead) - return ECORE_CON_CONNECTED; + return ECORE_CON_CONNECTED; else - return ECORE_CON_DISCONNECTED; + return ECORE_CON_DISCONNECTED; } -static char * -_ecore_con_pretty_ip(struct sockaddr *client_addr, socklen_t size) +static const char * +_ecore_con_pretty_ip(struct sockaddr *client_addr, + socklen_t size) { char ipbuf[INET6_ADDRSTRLEN + 1]; @@ -1619,45 +1678,41 @@ _ecore_con_pretty_ip(struct sockaddr *client_addr, socklen_t size) sa6->sin6_addr.s6_addr[13], sa6->sin6_addr.s6_addr[14], sa6->sin6_addr.s6_addr[15]); - return strdup(ipbuf); + return eina_stringshare_add(ipbuf); } } - if (getnameinfo(client_addr, size, - ipbuf, sizeof (ipbuf), NULL, 0, - NI_NUMERICHOST)) - return strdup("0.0.0.0"); + if (getnameinfo(client_addr, size, ipbuf, sizeof (ipbuf), NULL, 0, NI_NUMERICHOST)) + return eina_stringshare_add("0.0.0.0"); ipbuf[sizeof (ipbuf) - 1] = 0; - return strdup(ipbuf); + return eina_stringshare_add(ipbuf); } static Eina_Bool -_ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) +_ecore_con_svr_tcp_handler(void *data, + Ecore_Fd_Handler *fd_handler __UNUSED__) { Ecore_Con_Server *svr; Ecore_Con_Client *cl = NULL; + unsigned char client_addr[256]; + unsigned int client_addr_len = sizeof(client_addr); int new_fd; - unsigned char incoming[256]; - size_t size_in; svr = data; if (svr->dead) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; if (svr->delete_me) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; if ((svr->client_limit >= 0) && (!svr->reject_excess_clients) && (svr->client_count >= (unsigned int)svr->client_limit)) return ECORE_CALLBACK_RENEW; /* a new client */ - - size_in = sizeof(incoming); - - memset(&incoming, 0, size_in); - new_fd = accept(svr->fd, (struct sockaddr *)&incoming, (socklen_t *)&size_in); + memset(&client_addr, 0, client_addr_len); + new_fd = accept(svr->fd, (struct sockaddr *)&client_addr, (socklen_t *)&client_addr_len); if (new_fd < 0) /* error! */ return ECORE_CALLBACK_RENEW; @@ -1676,10 +1731,9 @@ _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) cl->host_server = svr; cl->fd_handler = ecore_main_fd_handler_add(cl->fd, ECORE_FD_READ, - _ecore_con_svr_cl_handler, cl, NULL, NULL); + _ecore_con_svr_cl_handler, cl, NULL, NULL); ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); - if (svr->type & ECORE_CON_SSL) { cl->handshaking = EINA_TRUE; @@ -1688,24 +1742,28 @@ _ecore_con_svr_tcp_handler(void *data, Ecore_Fd_Handler *fd_handler __UNUSED__) goto error; } + cl->client_addr = malloc(client_addr_len); + if (!cl->client_addr) + goto error; + cl->client_addr_len = client_addr_len; + memcpy(cl->client_addr, &client_addr, client_addr_len); + svr->clients = eina_list_append(svr->clients, cl); svr->client_count++; - if (!svr->path) - cl->ip = _ecore_con_pretty_ip((struct sockaddr *)&incoming, size_in); - + if ((!cl->delete_me) && (!cl->handshaking)) { Ecore_Con_Event_Client_Add *e; e = calloc(1, sizeof(Ecore_Con_Event_Client_Add)); - if (e) - { - cl->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e, - _ecore_con_event_client_add_free, NULL); - } + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + + cl->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e, + _ecore_con_event_client_add_free, NULL); + } return ECORE_CALLBACK_RENEW; @@ -1717,92 +1775,80 @@ error: return ECORE_CALLBACK_RENEW; } - static void _ecore_con_cl_read(Ecore_Con_Server *svr) { - unsigned char *inbuf = NULL; - int inbuf_num = 0; - int tries; + DBG("svr=%p", svr); + int num = 0; + Eina_Bool lost_server = EINA_TRUE; + unsigned char buf[READBUFSIZ]; /* only possible with non-ssl connections */ if (svr->connecting && (svr_try_connect_plain(svr) != ECORE_CON_CONNECTED)) - return; + return; - for (tries = 0; tries < 16; tries++) + if (svr->handshaking) { - int num = 0; - Eina_Bool lost_server = EINA_TRUE; - unsigned char buf[READBUFSIZ]; - - if (svr->handshaking) - { - DBG("Continuing ssl handshake"); - if (!ecore_con_ssl_server_init(svr)) - lost_server = EINA_FALSE; - } + DBG("Continuing ssl handshake"); + if (!ecore_con_ssl_server_init(svr)) + lost_server = EINA_FALSE; + } - if (!(svr->type & ECORE_CON_SSL)) - { - num = read(svr->fd, buf, READBUFSIZ); - if ((num < 0) && (errno == EAGAIN)) - lost_server = EINA_FALSE; - } - else if (!(num = ecore_con_ssl_server_read(svr, buf, READBUFSIZ))) + if (!(svr->type & ECORE_CON_SSL)) + { + errno = 0; + num = read(svr->fd, buf, sizeof(buf)); + if ((num > 0) || (errno == EAGAIN)) + lost_server = EINA_FALSE; + } + else + { + num = ecore_con_ssl_server_read(svr, buf, sizeof(buf)); + if (num > 0) lost_server = EINA_FALSE; + } - if (num < 1) - { - if (inbuf && (!svr->delete_me)) - { - Ecore_Con_Event_Server_Data *e; - - e = malloc(sizeof(Ecore_Con_Event_Server_Data)); - if (e) - { - svr->event_count++; - e->server = svr; - e->data = inbuf; - e->size = inbuf_num; - ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e, - _ecore_con_event_server_data_free, NULL); - } - } - - if (lost_server) - _ecore_con_server_kill(svr); + if (lost_server) + _ecore_con_server_kill(svr); - break; - } + if ((num > 0) && (!svr->delete_me)) + { + Ecore_Con_Event_Server_Data *e; + + e = malloc(sizeof(Ecore_Con_Event_Server_Data)); + EINA_SAFETY_ON_NULL_RETURN(e); + + svr->event_count++; + e->server = svr; + e->data = malloc(num); + if (!e->data) + { + ERR("alloc!"); + free(e); + return; + } + memcpy(e->data, buf, num); + e->size = num; + ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e, + _ecore_con_event_server_data_free, NULL); + } - inbuf = realloc(inbuf, inbuf_num + num); - memcpy(inbuf + inbuf_num, buf, num); - inbuf_num += num; - } -/* #if USE_OPENSSL */ -/* if (svr->fd_handler) */ -/* { */ -/* if (svr->ssl && ssl_err == SSL_ERROR_WANT_READ) */ -/* ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); */ -/* else if (svr->ssl && ssl_err == SSL_ERROR_WANT_WRITE) */ -/* ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); */ -/* } */ -/* #endif */ } static Eina_Bool -_ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) +_ecore_con_cl_handler(void *data, + Ecore_Fd_Handler *fd_handler) { Ecore_Con_Server *svr; Eina_Bool want_read, want_write; svr = data; if (svr->dead) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; if (svr->delete_me) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ); want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE); @@ -1810,54 +1856,51 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) if (svr->handshaking && (want_read || want_write)) { DBG("Continuing ssl handshake: preparing to %s...", want_read ? "read" : "write"); -#ifdef PRINT_LOTS_OF_DEBUG - if (want_read) - { - char buf[32768]; - ssize_t len; - len = recv(svr->fd, buf, sizeof(buf), MSG_DONTWAIT | MSG_PEEK); - DBG("%zu bytes in buffer", len); - } +#ifdef ISCOMFITOR + if (want_read) + { + char buf[READBUFSIZ]; + ssize_t len; + len = recv(svr->fd, buf, sizeof(buf), MSG_DONTWAIT | MSG_PEEK); + DBG("%zu bytes in buffer", len); + } #endif if (ecore_con_ssl_server_init(svr)) { ERR("ssl handshaking failed!"); + svr->handshaking = EINA_FALSE; Ecore_Con_Event_Server_Del *e; e = calloc(1, sizeof(Ecore_Con_Event_Server_Del)); - if (e) - { - svr->event_count++; - e->server = svr; - ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, - _ecore_con_event_server_del_free, NULL); - } + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + + svr->event_count++; + e->server = svr; + ecore_event_add(ECORE_CON_EVENT_SERVER_DEL, e, + _ecore_con_event_server_del_free, NULL); } else if (!svr->ssl_state) { /* we got our server! */ - Ecore_Con_Event_Server_Add *e; - - svr->connecting = EINA_FALSE; - e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); - if (e) - { - svr->event_count++; - svr->start_time = ecore_time_get(); - e->server = svr; - ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, - _ecore_con_event_server_add_free, NULL); - } - } + Ecore_Con_Event_Server_Add *e; - } + svr->connecting = EINA_FALSE; + e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + svr->event_count++; + svr->start_time = ecore_time_get(); + e->server = svr; + ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, + _ecore_con_event_server_add_free, NULL); + } + } else if (want_read) _ecore_con_cl_read(svr); - else if (want_write) - { /* only possible with non-ssl connections */ + else if (want_write) /* only possible with non-ssl connections */ + { if (svr->connecting && (!svr_try_connect_plain(svr))) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; _ecore_con_server_flush(svr); } @@ -1866,199 +1909,174 @@ _ecore_con_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) } static Eina_Bool -_ecore_con_cl_udp_handler(void *data, Ecore_Fd_Handler *fd_handler) +_ecore_con_cl_udp_handler(void *data, + Ecore_Fd_Handler *fd_handler) { + Ecore_Con_Event_Server_Data *e; + unsigned char *inbuf; + unsigned char buf[READBUFSIZ]; + int num; Ecore_Con_Server *svr; + Eina_Bool want_read, want_write; - svr = data; - if (svr->dead) - return ECORE_CALLBACK_RENEW; + want_read = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ); + want_write = ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE); - if (svr->delete_me) - return ECORE_CALLBACK_RENEW; + svr = data; + if (svr->dead || svr->delete_me || ((!want_read) && (!want_write))) + return ECORE_CALLBACK_RENEW; - if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) + if (want_write) { - unsigned char buf[65536]; - int num; - - errno = 0; - num = read(svr->fd, buf, 65536); - if (num > 0) - { - if (!svr->delete_me) - { - Ecore_Con_Event_Server_Data *e; - unsigned char *inbuf; - - inbuf = malloc(num); - if(!inbuf) - return 1; - - memcpy(inbuf, buf, num); - - e = calloc(1, sizeof(Ecore_Con_Event_Server_Data)); - if (e) - { - svr->event_count++; - e->server = svr; - e->data = inbuf; - e->size = num; - ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e, - _ecore_con_event_server_data_free, - NULL); - } - } - } - else if ((errno == EIO) || (errno == EBADF) || - (errno == EPIPE) || (errno == EINVAL) || - (errno == ENOSPC) || (errno == ECONNREFUSED)) - _ecore_con_server_kill(svr); + _ecore_con_server_flush(svr); + return ECORE_CALLBACK_RENEW; } - else if (ecore_main_fd_handler_active_get(fd_handler, - ECORE_FD_WRITE)) - _ecore_con_server_flush(svr); + + errno = 0; + num = read(svr->fd, buf, READBUFSIZ); + + if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) || (errno == EINVAL) || + (errno == ENOSPC) || (errno == ECONNREFUSED)) + _ecore_con_server_kill(svr); + + if ((num < 1) || (svr->delete_me)) + return ECORE_CALLBACK_RENEW; + + inbuf = malloc(num); + if (!inbuf) + return ECORE_CALLBACK_RENEW; + + memcpy(inbuf, buf, num); + + e = calloc(1, sizeof(Ecore_Con_Event_Server_Data)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + + svr->event_count++; + e->server = svr; + e->data = inbuf; + e->size = num; + ecore_event_add(ECORE_CON_EVENT_SERVER_DATA, e, + _ecore_con_event_server_data_free, NULL); return ECORE_CALLBACK_RENEW; } static Eina_Bool -_ecore_con_svr_udp_handler(void *data, Ecore_Fd_Handler *fd_handler) +_ecore_con_svr_udp_handler(void *data, + Ecore_Fd_Handler *fd_handler) { + unsigned char buf[READBUFSIZ]; + unsigned char client_addr[256]; + unsigned int client_addr_len = sizeof(client_addr); + int num; Ecore_Con_Server *svr; Ecore_Con_Client *cl = NULL; svr = data; - if (svr->dead) - return ECORE_CALLBACK_RENEW; - if (svr->delete_me) - return ECORE_CALLBACK_RENEW; + if (svr->delete_me || svr->dead) + return ECORE_CALLBACK_RENEW; - if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) + if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_WRITE)) { - unsigned char buf[READBUFSIZ]; - unsigned char client_addr[256]; - unsigned int client_addr_len = sizeof(client_addr); - int num; + _ecore_con_client_flush(cl); + return ECORE_CALLBACK_RENEW; + } - errno = 0; + if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) + return ECORE_CALLBACK_RENEW; + + errno = 0; #ifdef _WIN32 - num = fcntl(svr->fd, F_SETFL, O_NONBLOCK); - if (num >= 0) - num = - recvfrom(svr->fd, buf, sizeof(buf), 0, - (struct sockaddr *)&client_addr, - &client_addr_len); + num = fcntl(svr->fd, F_SETFL, O_NONBLOCK); + if (num >= 0) + num = recvfrom(svr->fd, buf, sizeof(buf), 0, + (struct sockaddr *)&client_addr, + &client_addr_len); #else - num = - recvfrom(svr->fd, buf, sizeof(buf), MSG_DONTWAIT, - (struct sockaddr *)&client_addr, - &client_addr_len); + num = recvfrom(svr->fd, buf, sizeof(buf), MSG_DONTWAIT, + (struct sockaddr *)&client_addr, + &client_addr_len); #endif - if (num > 0) - { - if (!svr->delete_me) - { - Ecore_Con_Event_Client_Data *e; - unsigned char *inbuf; - - /* Create a new client for use in the client data event */ - cl = calloc(1, sizeof(Ecore_Con_Client)); - if(!cl) - return ECORE_CALLBACK_RENEW; - - cl->buf = NULL; - cl->fd = 0; - cl->fd_handler = NULL; - cl->host_server = svr; - cl->client_addr = calloc(1, client_addr_len); - cl->client_addr_len = client_addr_len; - if(!cl->client_addr) - { - free(cl); - return ECORE_CALLBACK_RENEW; - } - - memcpy(cl->client_addr, &client_addr, client_addr_len); - ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); - svr->clients = eina_list_append(svr->clients, cl); - svr->client_count++; - - cl->ip = _ecore_con_pretty_ip(cl->client_addr, - cl->client_addr_len); - - inbuf = malloc(num); - if(!inbuf) - { - free(cl->client_addr); - free(cl); - return ECORE_CALLBACK_RENEW; - } - - memcpy(inbuf, buf, num); - - e = calloc(1, sizeof(Ecore_Con_Event_Client_Data)); - if (e) - { - svr->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - e->data = inbuf; - e->size = num; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e, - _ecore_con_event_client_data_free, - NULL); - } - - if (!cl->delete_me) - { - Ecore_Con_Event_Client_Add *add; - - add = calloc(1, sizeof(Ecore_Con_Event_Client_Add)); - if(add) - { -/*cl->event_count++;*/ - add->client = cl; - _ecore_con_cl_timer_update(cl); - ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, add, - _ecore_con_event_client_add_free, NULL); - } - } - } - } - else if ((errno == EIO) || (errno == EBADF) || - (errno == EPIPE) || (errno == EINVAL) || - (errno == ENOSPC) || (errno == ECONNREFUSED)) + if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) || + (errno == EINVAL) || (errno == ENOSPC) || (errno == ECONNREFUSED)) + { + if (!svr->delete_me) { - if (!svr->delete_me) - { - /* we lost our client! */ - Ecore_Con_Event_Client_Del *e; - - e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); - if (e) - { - svr->event_count++; - /* be explicit here */ - e->client = NULL; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, - _ecore_con_event_client_del_free, NULL); - } - } - - svr->dead = EINA_TRUE; - if (svr->fd_handler) - ecore_main_fd_handler_del(svr->fd_handler); +/* we lost our client! */ + Ecore_Con_Event_Client_Del *e; - svr->fd_handler = NULL; + e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + + svr->event_count++; + /* be explicit here */ + e->client = NULL; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, + _ecore_con_event_client_del_free, NULL); } + + svr->dead = EINA_TRUE; + svr->fd_handler = NULL; + return ECORE_CALLBACK_CANCEL; } - else if (ecore_main_fd_handler_active_get(fd_handler, - ECORE_FD_WRITE)) - _ecore_con_client_flush(cl); + + +/* Create a new client for use in the client data event */ + cl = calloc(1, sizeof(Ecore_Con_Client)); + EINA_SAFETY_ON_NULL_RETURN_VAL(cl, ECORE_CALLBACK_RENEW); + + cl->host_server = svr; + cl->client_addr = malloc(client_addr_len); + if (!cl->client_addr) + { + free(cl); + return ECORE_CALLBACK_RENEW; + } + cl->client_addr_len = client_addr_len; + + memcpy(cl->client_addr, &client_addr, client_addr_len); + ECORE_MAGIC_SET(cl, ECORE_MAGIC_CON_CLIENT); + svr->clients = eina_list_append(svr->clients, cl); + svr->client_count++; + + { /* indent to keep it all nicely separated */ + Ecore_Con_Event_Client_Add *add; + + add = calloc(1, sizeof(Ecore_Con_Event_Client_Add)); + EINA_SAFETY_ON_NULL_RETURN_VAL(add, ECORE_CALLBACK_RENEW); + + /*cl->event_count++;*/ + add->client = cl; + _ecore_con_cl_timer_update(cl); + ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, add, + _ecore_con_event_client_add_free, NULL); + } + + + { + Ecore_Con_Event_Client_Data *e; + e = calloc(1, sizeof(Ecore_Con_Event_Client_Data)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + + svr->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + e->data = malloc(num); + if (!e->data) + { + free(cl->client_addr); + free(cl); + return ECORE_CALLBACK_RENEW; + } + + memcpy(e->data, buf, num); + e->size = num; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e, + _ecore_con_event_client_data_free, NULL); + } return ECORE_CALLBACK_RENEW; } @@ -2066,138 +2084,134 @@ _ecore_con_svr_udp_handler(void *data, Ecore_Fd_Handler *fd_handler) static void _ecore_con_svr_cl_read(Ecore_Con_Client *cl) { - unsigned char *inbuf = NULL; - int inbuf_num = 0; - int tries; + DBG("cl=%p", cl); + int num = 0; + Eina_Bool lost_client = EINA_TRUE; + unsigned char buf[READBUFSIZ]; - for (tries = 0; tries < 16; tries++) + if (cl->handshaking) { - int num = 0; - Eina_Bool lost_client = EINA_TRUE; - unsigned char buf[READBUFSIZ]; - - errno = 0; + /* add an extra handshake attempt just before read, even though + * read also attempts to handshake, to try to finish sooner + */ + if (ecore_con_ssl_client_init(cl)) + lost_client = EINA_FALSE; - if (cl->handshaking) - { - if (ecore_con_ssl_client_init(cl)) - lost_client = EINA_FALSE; + _ecore_con_cl_timer_update(cl); + } - _ecore_con_cl_timer_update(cl); - } + if (!(cl->host_server->type & ECORE_CON_SSL)) + { + errno = 0; + num = read(cl->fd, buf, sizeof(buf)); + if ((num > 0) || (errno == EAGAIN)) + lost_client = EINA_FALSE; + } + else + { + num = ecore_con_ssl_client_read(cl, buf, sizeof(buf)); + if (num > 0) + lost_client = EINA_FALSE; + } - if (!(cl->host_server->type & ECORE_CON_SSL)) + if (lost_client) + { + if (!cl->delete_me) { - if ((num = read(cl->fd, buf, READBUFSIZ)) <= 0) - if ((num < 0) && (errno == EAGAIN)) - lost_client = EINA_FALSE; + /* we lost our client! */ + Ecore_Con_Event_Client_Del *e; - } - else if (!(num = ecore_con_ssl_client_read(cl, buf, READBUFSIZ))) - lost_client = EINA_FALSE; + e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); + EINA_SAFETY_ON_NULL_RETURN(e); - if (num > 0) - { - inbuf = realloc(inbuf, inbuf_num + num); - memcpy(inbuf + inbuf_num, buf, num); - inbuf_num += num; - continue; + cl->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, + _ecore_con_event_client_del_free, NULL); } + INF("Lost client %s", (cl->ip) ? cl->ip : ""); + cl->dead = EINA_TRUE; + if (cl->fd_handler) + ecore_main_fd_handler_del(cl->fd_handler); - if (inbuf && (!cl->delete_me)) - { - Ecore_Con_Event_Client_Data *e; - - e = malloc(sizeof(Ecore_Con_Event_Client_Data)); - if (e) - { - cl->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - e->data = inbuf; - e->size = inbuf_num; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e, - _ecore_con_event_client_data_free, NULL); - } - } + cl->fd_handler = NULL; + return; + } - if (lost_client && (!cl->delete_me)) - { - /* we lost our client! */ - Ecore_Con_Event_Client_Del *e; + if ((num > 0) && (!cl->delete_me)) + { + Ecore_Con_Event_Client_Data *e; - e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); - if (e) - { - cl->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, - _ecore_con_event_client_del_free, NULL); - } - } + e = malloc(sizeof(Ecore_Con_Event_Client_Data)); + EINA_SAFETY_ON_NULL_RETURN(e); - if (lost_client) + cl->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + e->data = malloc(num); + if (!e->data) { - cl->dead = EINA_TRUE; - if (cl->fd_handler) - ecore_main_fd_handler_del(cl->fd_handler); - - cl->fd_handler = NULL; + ERR("alloc!"); + free(e); + return; } - - break; + memcpy(e->data, buf, num); + e->size = num; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DATA, e, + _ecore_con_event_client_data_free, NULL); } + + } static Eina_Bool -_ecore_con_svr_cl_handler(void *data, Ecore_Fd_Handler *fd_handler) +_ecore_con_svr_cl_handler(void *data, + Ecore_Fd_Handler *fd_handler) { Ecore_Con_Client *cl; cl = data; if (cl->dead) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; if (cl->delete_me) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; if (cl->handshaking && ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ | ECORE_FD_WRITE)) { if (ecore_con_ssl_client_init(cl)) { ERR("ssl handshaking failed!"); + cl->handshaking = EINA_FALSE; /* we lost our client! */ Ecore_Con_Event_Client_Del *e; cl->dead = EINA_TRUE; + INF("Lost client %s", (cl->ip) ? cl->ip : ""); e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); - if (e) - { - cl->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, - _ecore_con_event_client_del_free, NULL); - } + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + cl->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, + _ecore_con_event_client_del_free, NULL); } else if (!cl->ssl_state) { - Ecore_Con_Event_Client_Add *add; - - add = calloc(1, sizeof(Ecore_Con_Event_Client_Add)); - if(add) - { -/*cl->event_count++;*/ - add->client = cl; - _ecore_con_cl_timer_update(cl); - ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, add, - _ecore_con_event_client_add_free, NULL); - } + Ecore_Con_Event_Client_Add *e; + + e = calloc(1, sizeof(Ecore_Con_Event_Client_Add)); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW); + + e->client = cl; + cl->event_count++; + _ecore_con_cl_timer_update(cl); + ecore_event_add(ECORE_CON_EVENT_CLIENT_ADD, e, + _ecore_con_event_client_add_free, NULL); } } - else if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) _ecore_con_svr_cl_read(cl); @@ -2213,14 +2227,14 @@ _ecore_con_server_flush(Ecore_Con_Server *svr) int count, num; if (!svr->write_buf) - return; + return; /* check whether we need to write anything at all. * we must not write zero bytes with SSL_write() since it * causes undefined behaviour */ if (svr->write_buf_size == svr->write_buf_offset) - return; + return; num = svr->write_buf_size - svr->write_buf_offset; @@ -2233,15 +2247,15 @@ _ecore_con_server_flush(Ecore_Con_Server *svr) } if (!(svr->type & ECORE_CON_SSL)) - count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num); + count = write(svr->fd, svr->write_buf + svr->write_buf_offset, num); else - count = ecore_con_ssl_server_write(svr, svr->write_buf + svr->write_buf_offset, num); + count = ecore_con_ssl_server_write(svr, svr->write_buf + svr->write_buf_offset, num); if (count < 0) { /* we lost our server! */ - _ecore_con_server_kill(svr); - return; + _ecore_con_server_kill(svr); + return; } svr->write_buf_offset += count; @@ -2252,8 +2266,10 @@ _ecore_con_server_flush(Ecore_Con_Server *svr) free(svr->write_buf); svr->write_buf = NULL; if (svr->fd_handler) - ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); } + else if (count < num) + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); } static void @@ -2262,7 +2278,7 @@ _ecore_con_client_flush(Ecore_Con_Client *cl) int num, count = 0; if (!cl->buf) - return; + return; if (cl->handshaking) { @@ -2270,43 +2286,42 @@ _ecore_con_client_flush(Ecore_Con_Client *cl) count = -1; _ecore_con_cl_timer_update(cl); - return; } if (!count) { num = cl->buf_size - cl->buf_offset; if (!(cl->host_server->type & ECORE_CON_SSL)) - count = write(cl->fd, cl->buf + cl->buf_offset, num); + count = write(cl->fd, cl->buf + cl->buf_offset, num); else - count = ecore_con_ssl_client_write(cl, cl->buf + cl->buf_offset, num); + count = ecore_con_ssl_client_write(cl, cl->buf + cl->buf_offset, num); } if (count < 0) { if ((errno == EIO) || (errno == EBADF) || (errno == EPIPE) || (errno == EINVAL) || (errno == ENOSPC) || (errno == ECONNREFUSED)) - if (!cl->delete_me) - { - /* we lost our client! */ + if (!cl->delete_me) + { + /* we lost our client! */ Ecore_Con_Event_Client_Del *e; e = calloc(1, sizeof(Ecore_Con_Event_Client_Del)); - if (e) - { - cl->event_count++; - _ecore_con_cl_timer_update(cl); - e->client = cl; - ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, - _ecore_con_event_client_del_free, NULL); - } + EINA_SAFETY_ON_NULL_RETURN(e); + + cl->event_count++; + _ecore_con_cl_timer_update(cl); + e->client = cl; + ecore_event_add(ECORE_CON_EVENT_CLIENT_DEL, e, + _ecore_con_event_client_del_free, NULL); cl->dead = EINA_TRUE; + INF("Lost client %s", (cl->ip) ? cl->ip : ""); if (cl->fd_handler) - ecore_main_fd_handler_del(cl->fd_handler); + ecore_main_fd_handler_del(cl->fd_handler); cl->fd_handler = NULL; - } + } return; } @@ -2319,103 +2334,112 @@ _ecore_con_client_flush(Ecore_Con_Client *cl) free(cl->buf); cl->buf = NULL; if (cl->fd_handler) - ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); } + else if (count < num) + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE); } static void -_ecore_con_event_client_add_free(void *data __UNUSED__, void *ev) +_ecore_con_event_client_add_free(void *data __UNUSED__, + void *ev) { Ecore_Con_Event_Client_Add *e; e = ev; e->client->event_count--; - if ((e->client->event_count == 0) && + if ((e->client->event_count <= 0) && (e->client->delete_me)) - ecore_con_client_del(e->client); + ecore_con_client_del(e->client); free(e); } static void -_ecore_con_event_client_del_free(void *data __UNUSED__, void *ev) +_ecore_con_event_client_del_free(void *data __UNUSED__, + void *ev) { Ecore_Con_Event_Client_Del *e; e = ev; e->client->event_count--; - if ((e->client->event_count == 0) && (e->client->delete_me)) - ecore_con_client_del(e->client); + if ((e->client->event_count <= 0) && (e->client->delete_me)) + ecore_con_client_del(e->client); - free(e); + free(e); } static void -_ecore_con_event_client_data_free(void *data __UNUSED__, void *ev) +_ecore_con_event_client_data_free(void *data __UNUSED__, + void *ev) { Ecore_Con_Event_Client_Data *e; e = ev; e->client->event_count--; if (e->data) - free(e->data); + free(e->data); - if (((e->client->event_count == 0) && (e->client->delete_me)) || + if (((e->client->event_count <= 0) && (e->client->delete_me)) || ((e->client->host_server && ((e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_UDP || (e->client->host_server->type & ECORE_CON_TYPE) == ECORE_CON_REMOTE_MCAST)))) - ecore_con_client_del(e->client); + ecore_con_client_del(e->client); free(e); } static void -_ecore_con_event_server_add_free(void *data __UNUSED__, void *ev) +_ecore_con_event_server_add_free(void *data __UNUSED__, + void *ev) { Ecore_Con_Event_Server_Add *e; e = ev; e->server->event_count--; - if ((e->server->event_count == 0) && + if ((e->server->event_count <= 0) && (e->server->delete_me)) - _ecore_con_server_free(e->server); + _ecore_con_server_free(e->server); free(e); } static void -_ecore_con_event_server_del_free(void *data __UNUSED__, void *ev) +_ecore_con_event_server_del_free(void *data __UNUSED__, + void *ev) { Ecore_Con_Event_Server_Del *e; e = ev; e->server->event_count--; - if ((e->server->event_count == 0) && + if ((e->server->event_count <= 0) && (e->server->delete_me)) - _ecore_con_server_free(e->server); + _ecore_con_server_free(e->server); - free(e); + free(e); } static void -_ecore_con_event_server_data_free(void *data __UNUSED__, void *ev) +_ecore_con_event_server_data_free(void *data __UNUSED__, + void *ev) { Ecore_Con_Event_Server_Data *e; e = ev; e->server->event_count--; if (e->data) - free(e->data); + free(e->data); - if ((e->server->event_count == 0) && + if ((e->server->event_count <= 0) && (e->server->delete_me)) - _ecore_con_server_free(e->server); + _ecore_con_server_free(e->server); free(e); } static void -_ecore_con_lookup_done(void *data, Ecore_Con_Info *infos) +_ecore_con_lookup_done(void *data, + Ecore_Con_Info *infos) { Ecore_Con_Server *svr; Ecore_Con_Lookup *lk; @@ -2424,13 +2448,14 @@ _ecore_con_lookup_done(void *data, Ecore_Con_Info *infos) lk = svr->data; if (infos) - lk->done_cb(infos->info.ai_canonname, infos->ip, - infos->info.ai_addr, infos->info.ai_addrlen, - (void *)lk->data); + lk->done_cb(infos->info.ai_canonname, infos->ip, + infos->info.ai_addr, infos->info.ai_addrlen, + (void *)lk->data); else - lk->done_cb(NULL, NULL, NULL, 0, (void *)lk->data); + lk->done_cb(NULL, NULL, NULL, 0, (void *)lk->data); free(svr->name); free(lk); free(svr); } + diff --git a/src/lib/ecore_con/ecore_con_ares.c b/src/lib/ecore_con/ecore_con_ares.c index b676067..f4c7f8e 100644 --- a/src/lib/ecore_con/ecore_con_ares.c +++ b/src/lib/ecore_con/ecore_con_ares.c @@ -17,26 +17,26 @@ #include "Ecore_Con.h" #include "ecore_con_private.h" -typedef struct _Ecore_Con_FD Ecore_Con_FD; +typedef struct _Ecore_Con_FD Ecore_Con_FD; typedef struct _Ecore_Con_CAres Ecore_Con_CAres; struct _Ecore_Con_FD { Ecore_Fd_Handler *handler; - int active; - int fd; + int active; + int fd; }; struct _Ecore_Con_CAres { Ecore_Con_Server *svr; Ecore_Con_Info_Cb done_cb; - void *data; - struct addrinfo hints; - Ecore_Con_Info *result; + void *data; + struct addrinfo hints; + Ecore_Con_Info *result; union { - struct in_addr v4; + struct in_addr v4; struct in6_addr v6; } addr; @@ -51,13 +51,16 @@ static int active = 0; static Ecore_Timer *tm = NULL; static fd_set info_readers, info_writers; -static void _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, int status, - int timeouts, char *node, - char *service); -static void _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, - int timeouts, - struct hostent *hostent); -static Eina_Bool _ecore_con_info_cares_fd_cb(void *data, +static void _ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, + int status, + int timeouts, + char *node, + char *service); +static void _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, + int status, + int timeouts, + struct hostent *hostent); +static Eina_Bool _ecore_con_info_cares_fd_cb(void *data, Ecore_Fd_Handler *fd_handler); static Eina_Bool _ecore_con_info_cares_timeout_cb(void *data); static void _ecore_con_info_cares_clean(void); @@ -68,7 +71,7 @@ ecore_con_info_init(void) if (info_init == 0) { if (ares_library_init(ARES_LIB_INIT_ALL) != 0) - return 0; + return 0; if (ares_init(&info_channel) != ARES_SUCCESS) { @@ -88,12 +91,12 @@ ecore_con_info_shutdown(void) if (info_init == 0) { /* Cancel all ongoing request */ - ares_cancel(info_channel); - ares_destroy(info_channel); + ares_cancel(info_channel); + ares_destroy(info_channel); - /* Destroy FD handler here. */ - /* Shutdown ares */ - ares_library_cleanup(); + /* Destroy FD handler here. */ + /* Shutdown ares */ + ares_library_cleanup(); } return info_init; @@ -102,7 +105,7 @@ ecore_con_info_shutdown(void) int ecore_con_info_tcp_connect(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -121,7 +124,7 @@ ecore_con_info_tcp_connect(Ecore_Con_Server *svr, int ecore_con_info_tcp_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -140,7 +143,7 @@ ecore_con_info_tcp_listen(Ecore_Con_Server *svr, int ecore_con_info_udp_connect(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -159,7 +162,7 @@ ecore_con_info_udp_connect(Ecore_Con_Server *svr, int ecore_con_info_udp_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -178,7 +181,7 @@ ecore_con_info_udp_listen(Ecore_Con_Server *svr, int ecore_con_info_mcast_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -196,19 +199,21 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr, static Eina_Bool _ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg, - int addrtype, const char *name, - struct sockaddr *addr, int addrlen) + int addrtype, + const char *name, + struct sockaddr *addr, + int addrlen) { int length = 0; if (name) - length = strlen(name) + 1; + length = strlen(name) + 1; else - length = 1; + length = 1; arg->result = malloc(sizeof (Ecore_Con_Info) + length); if (!arg->result) - return EINA_FALSE; + return EINA_FALSE; /* FIXME: What to do when hint is not set ? */ arg->result->info.ai_flags = arg->hints.ai_flags; @@ -221,34 +226,33 @@ _ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg, arg->result->info.ai_canonname = (char *)(arg->result + 1); if (!name) - *arg->result->info.ai_canonname = '\0'; + *arg->result->info.ai_canonname = '\0'; else - strcpy(arg->result->info.ai_canonname, name); + strcpy(arg->result->info.ai_canonname, name); arg->result->info.ai_next = NULL; ares_getnameinfo( - info_channel, addr, addrlen, - ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST | - ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST, - (ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg); + info_channel, addr, addrlen, + ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST | + ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST, + (ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg); return EINA_TRUE; } - EAPI int ecore_con_info_get(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data, - struct addrinfo *hints) + void *data, + struct addrinfo *hints) { Ecore_Con_CAres *cares; int ai_family = AF_INET6; cares = calloc(1, sizeof (Ecore_Con_CAres)); if (!cares) - return 0; + return 0; cares->svr = svr; cares->done_cb = done_cb; @@ -294,7 +298,8 @@ ecore_con_info_get(Ecore_Con_Server *svr, } static int -_ecore_con_info_fds_search(const Ecore_Con_FD *fd1, const Ecore_Con_FD *fd2) +_ecore_con_info_fds_search(const Ecore_Con_FD *fd1, + const Ecore_Con_FD *fd2) { return fd1->fd - fd2->fd; } @@ -308,7 +313,7 @@ _ecore_con_info_fds_lookup(int fd) fdl.fd = fd; search = eina_list_search_unsorted( - info_fds, (Eina_Compare_Cb)_ecore_con_info_fds_search, &fdl); + info_fds, (Eina_Compare_Cb)_ecore_con_info_fds_search, &fdl); if (search) { @@ -338,46 +343,45 @@ _ecore_con_info_cares_clean(void) int flags = 0; if (FD_ISSET(i, &readers)) - flags |= ECORE_FD_READ; + flags |= ECORE_FD_READ; if (FD_ISSET(i, &writers)) - flags |= ECORE_FD_WRITE; + flags |= ECORE_FD_WRITE; if (flags) - if (!_ecore_con_info_fds_lookup(i)) - { - ecf = malloc(sizeof (Ecore_Con_FD)); - if (ecf) - { - ecf->fd = i; - ecf->active = active; - ecf->handler = ecore_main_fd_handler_add( - i, ECORE_FD_WRITE | ECORE_FD_READ, - _ecore_con_info_cares_fd_cb, - NULL, NULL, NULL); - info_fds = eina_list_append(info_fds, ecf); - } - } - + if (!_ecore_con_info_fds_lookup(i)) + { + ecf = malloc(sizeof (Ecore_Con_FD)); + if (ecf) + { + ecf->fd = i; + ecf->active = active; + ecf->handler = ecore_main_fd_handler_add( + i, ECORE_FD_WRITE | ECORE_FD_READ, + _ecore_con_info_cares_fd_cb, + NULL, NULL, NULL); + info_fds = eina_list_append(info_fds, ecf); + } + } } info_readers = readers; info_writers = writers; EINA_LIST_FOREACH_SAFE(info_fds, l, l_next, ecf) - { - if (ecf->active != active) - { - ecore_main_fd_handler_del(ecf->handler); - free(ecf); - info_fds = eina_list_remove_list(info_fds, l); - } - } + { + if (ecf->active != active) + { + ecore_main_fd_handler_del(ecf->handler); + free(ecf); + info_fds = eina_list_remove_list(info_fds, l); + } + } if (!info_fds) { if (tm) - ecore_timer_del(tm); + ecore_timer_del(tm); tm = NULL; } @@ -388,17 +392,17 @@ _ecore_con_info_cares_clean(void) ares_timeout(info_channel, NULL, &tv); if (tm) - ecore_timer_delay(tm, tv.tv_sec); + ecore_timer_delay(tm, tv.tv_sec); else - tm = - ecore_timer_add((double)tv.tv_sec, - _ecore_con_info_cares_timeout_cb, - NULL); + tm = + ecore_timer_add((double)tv.tv_sec, + _ecore_con_info_cares_timeout_cb, + NULL); } } static Eina_Bool -_ecore_con_info_cares_timeout_cb(void *data) +_ecore_con_info_cares_timeout_cb(void *data __UNUSED__) { ares_process(info_channel, &info_readers, &info_writers); _ecore_con_info_cares_clean(); @@ -407,7 +411,8 @@ _ecore_con_info_cares_timeout_cb(void *data) } static Eina_Bool -_ecore_con_info_cares_fd_cb(void *data, Ecore_Fd_Handler *fd_handler) +_ecore_con_info_cares_fd_cb(void *data __UNUSED__, + Ecore_Fd_Handler *fd_handler __UNUSED__) { ares_process(info_channel, &info_readers, &info_writers); _ecore_con_info_cares_clean(); @@ -416,83 +421,84 @@ _ecore_con_info_cares_fd_cb(void *data, Ecore_Fd_Handler *fd_handler) } static void -_ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts, - struct hostent *hostent) +_ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, + int status, + int timeouts __UNUSED__, + struct hostent *hostent) { struct sockaddr *addr; int addrlen; - int length = 0; /* Found something ? */ switch (status) { case ARES_SUCCESS: - if (!hostent->h_addr_list[0]) - { - fprintf(stderr, "No IP found\n"); - goto on_error; - } + if (!hostent->h_addr_list[0]) + { + ERR("No IP found"); + goto on_error; + } - switch (hostent->h_addrtype) + switch (hostent->h_addrtype) + { + case AF_INET: { - case AF_INET: - { - struct sockaddr_in *addri; + struct sockaddr_in *addri; - addrlen = sizeof (struct sockaddr_in); - addri = malloc(addrlen); + addrlen = sizeof (struct sockaddr_in); + addri = malloc(addrlen); - if (!addri) - goto on_mem_error; + if (!addri) + goto on_mem_error; - addri->sin_family = AF_INET; - addri->sin_port = htons(arg->svr->port); + addri->sin_family = AF_INET; + addri->sin_port = htons(arg->svr->port); - memcpy(&addri->sin_addr.s_addr, - hostent->h_addr_list[0], sizeof (struct in_addr)); + memcpy(&addri->sin_addr.s_addr, + hostent->h_addr_list[0], sizeof (struct in_addr)); - addr = (struct sockaddr *)addri; - break; - } - - case AF_INET6: - { - struct sockaddr_in6 *addri6; + addr = (struct sockaddr *)addri; + break; + } - addrlen = sizeof (struct sockaddr_in6); - addri6 = malloc(addrlen); + case AF_INET6: + { + struct sockaddr_in6 *addri6; - if (!addri6) - goto on_mem_error; + addrlen = sizeof (struct sockaddr_in6); + addri6 = malloc(addrlen); - addri6->sin6_family = AF_INET6; - addri6->sin6_port = htons(arg->svr->port); - addri6->sin6_flowinfo = 0; - addri6->sin6_scope_id = 0; + if (!addri6) + goto on_mem_error; - memcpy(&addri6->sin6_addr.s6_addr, - hostent->h_addr_list[0], sizeof (struct in6_addr)); + addri6->sin6_family = AF_INET6; + addri6->sin6_port = htons(arg->svr->port); + addri6->sin6_flowinfo = 0; + addri6->sin6_scope_id = 0; - addr = (struct sockaddr *)addri6; - break; - } + memcpy(&addri6->sin6_addr.s6_addr, + hostent->h_addr_list[0], sizeof (struct in6_addr)); - default: - fprintf(stderr, "Unknown addrtype %i\n", hostent->h_addrtype); - goto on_error; + addr = (struct sockaddr *)addri6; + break; } - if (!_ecore_con_info_ares_getnameinfo(arg, hostent->h_addrtype, - hostent->h_name, - addr, addrlen)) - goto on_error; + default: + ERR("Unknown addrtype %i", hostent->h_addrtype); + goto on_error; + } + + if (!_ecore_con_info_ares_getnameinfo(arg, hostent->h_addrtype, + hostent->h_name, + addr, addrlen)) + goto on_error; - break; + break; case ARES_ENOTFOUND: /* address notfound */ - if (arg->byaddr) - { - /* This happen when host doesn't have a reverse. */ + if (arg->byaddr) + { + /* This happen when host doesn't have a reverse. */ if (arg->isv6) { struct sockaddr_in6 *addri6; @@ -501,7 +507,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts, addri6 = malloc(addrlen); if (!addri6) - goto on_mem_error; + goto on_mem_error; addri6->sin6_family = AF_INET6; addri6->sin6_port = htons(arg->svr->port); @@ -521,7 +527,7 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts, addri = malloc(addrlen); if (!addri) - goto on_mem_error; + goto on_mem_error; addri->sin_family = AF_INET; addri->sin_port = htons(arg->svr->port); @@ -537,28 +543,27 @@ _ecore_con_info_ares_host_cb(Ecore_Con_CAres *arg, int status, int timeouts, AF_INET, NULL, addr, addrlen)) - goto on_error; + goto on_error; break; - } + } case ARES_ENOTIMP: /* unknown family */ case ARES_EBADNAME: /* not a valid internet address */ case ARES_ENOMEM: /* not enough memory */ case ARES_EDESTRUCTION: /* request canceled, shuting down */ - goto on_error; + goto on_error; default: - fprintf(stderr, - "Unknown status returned by c-ares: %i assuming error\n", - status); - goto on_error; + ERR("Unknown status returned by c-ares: %i assuming error", + status); + goto on_error; } return; on_mem_error: - fprintf(stderr, "Not enough memory\n"); + ERR("Not enough memory"); on_error: arg->done_cb(arg->data, NULL); @@ -566,36 +571,39 @@ on_error: } static void -_ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, int status, int timeouts, - char *node, - char *service) +_ecore_con_info_ares_nameinfo(Ecore_Con_CAres *arg, + int status, + int timeouts __UNUSED__, + char *node, + char *service) { switch (status) { case ARES_SUCCESS: - if (node) - strcpy(arg->result->ip, node); - else - *arg->result->ip = '\0'; + if (node) + strcpy(arg->result->ip, node); + else + *arg->result->ip = '\0'; - if (service) - strcpy(arg->result->service, service); - else - *arg->result->service = '\0'; + if (service) + strcpy(arg->result->service, service); + else + *arg->result->service = '\0'; - arg->done_cb(arg->data, arg->result); - break; + arg->done_cb(arg->data, arg->result); + break; case ARES_ENOTIMP: case ARES_ENOTFOUND: case ARES_ENOMEM: case ARES_EDESTRUCTION: case ARES_EBADFLAGS: - arg->done_cb(arg->data, NULL); - break; + arg->done_cb(arg->data, NULL); + break; } free(arg->result->info.ai_addr); free(arg->result); free(arg); } + diff --git a/src/lib/ecore_con/ecore_con_info.c b/src/lib/ecore_con/ecore_con_info.c index 55fd609..3585cd4 100644 --- a/src/lib/ecore_con/ecore_con_info.c +++ b/src/lib/ecore_con/ecore_con_info.c @@ -23,7 +23,7 @@ # ifdef __cplusplus extern "C" # endif -void *alloca (size_t); +void *alloca(size_t); #endif #include @@ -62,22 +62,22 @@ typedef struct _CB_Data CB_Data; struct _CB_Data { - EINA_INLIST; - Ecore_Con_Info_Cb cb_done; - void *data; - Ecore_Fd_Handler *fdh; - pid_t pid; + EINA_INLIST; + Ecore_Con_Info_Cb cb_done; + void *data; + Ecore_Fd_Handler *fdh; + pid_t pid; Ecore_Event_Handler *handler; - int fd2; + int fd2; }; - static void _ecore_con_info_readdata(CB_Data *cbdata); static void _ecore_con_info_slave_free(CB_Data *cbdata); -static Eina_Bool _ecore_con_info_data_handler(void *data, +static Eina_Bool _ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler); -static Eina_Bool _ecore_con_info_exit_handler(void *data, int type __UNUSED__, - void *event); +static Eina_Bool _ecore_con_info_exit_handler(void *data, + int type __UNUSED__, + void *event); static int info_init = 0; static CB_Data *info_slaves = NULL; @@ -94,7 +94,7 @@ ecore_con_info_shutdown(void) { info_init--; if (info_init == 0) - while (info_slaves) _ecore_con_info_slave_free(info_slaves); + while (info_slaves) _ecore_con_info_slave_free(info_slaves); return info_init; } @@ -102,7 +102,7 @@ ecore_con_info_shutdown(void) int ecore_con_info_tcp_connect(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -121,7 +121,7 @@ ecore_con_info_tcp_connect(Ecore_Con_Server *svr, int ecore_con_info_tcp_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -140,7 +140,7 @@ ecore_con_info_tcp_listen(Ecore_Con_Server *svr, int ecore_con_info_udp_connect(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -159,7 +159,7 @@ ecore_con_info_udp_connect(Ecore_Con_Server *svr, int ecore_con_info_udp_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -178,7 +178,7 @@ ecore_con_info_udp_listen(Ecore_Con_Server *svr, int ecore_con_info_mcast_listen(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data) + void *data) { struct addrinfo hints; @@ -197,14 +197,14 @@ ecore_con_info_mcast_listen(Ecore_Con_Server *svr, EAPI int ecore_con_info_get(Ecore_Con_Server *svr, Ecore_Con_Info_Cb done_cb, - void *data, - struct addrinfo *hints) + void *data, + struct addrinfo *hints) { CB_Data *cbdata; int fd[2]; if (pipe(fd) < 0) - return 0; + return 0; cbdata = calloc(1, sizeof(CB_Data)); if (!cbdata) @@ -245,10 +245,10 @@ ecore_con_info_get(Ecore_Con_Server *svr, if (!getaddrinfo(svr->name, service, hints, &result) && result) { if (result->ai_canonname) - canonname_len = strlen(result->ai_canonname) + 1; + canonname_len = strlen(result->ai_canonname) + 1; tosend_len = sizeof(Ecore_Con_Info) + result->ai_addrlen + - canonname_len; + canonname_len; if (!(tosend = alloca(tosend_len))) goto on_error; memset(tosend, 0, tosend_len); @@ -270,7 +270,7 @@ ecore_con_info_get(Ecore_Con_Server *svr, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) { - memcpy(container->ip, hbuf, sizeof(container->ip)); + memcpy(container->ip, hbuf, sizeof(container->ip)); memcpy(container->service, sbuf, sizeof(container->service)); } @@ -279,7 +279,7 @@ ecore_con_info_get(Ecore_Con_Server *svr, on_error: if (result) - freeaddrinfo(result); + freeaddrinfo(result); err = write(fd[1], "", 1); close(fd[1]); @@ -292,8 +292,8 @@ on_error: /* PARENT */ cbdata->handler = - ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_info_exit_handler, - cbdata); + ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _ecore_con_info_exit_handler, + cbdata); close(fd[1]); if (!cbdata->handler) { @@ -304,7 +304,7 @@ on_error: } info_slaves = (CB_Data *)eina_inlist_append(EINA_INLIST_GET( - info_slaves), + info_slaves), EINA_INLIST_GET(cbdata)); return 1; } @@ -337,13 +337,13 @@ _ecore_con_info_readdata(CB_Data *cbdata) recv = (Ecore_Con_Info *)torecv; recv->info.ai_addr = - (struct sockaddr *)(torecv + sizeof(Ecore_Con_Info)); + (struct sockaddr *)(torecv + sizeof(Ecore_Con_Info)); if ((size_t)torecv_len != (sizeof(Ecore_Con_Info) + recv->info.ai_addrlen)) - recv->info.ai_canonname = (char *) - (torecv + sizeof(Ecore_Con_Info) + recv->info.ai_addrlen); + recv->info.ai_canonname = (char *) + (torecv + sizeof(Ecore_Con_Info) + recv->info.ai_addrlen); else - recv->info.ai_canonname = NULL; + recv->info.ai_canonname = NULL; recv->info.ai_next = NULL; @@ -352,10 +352,10 @@ _ecore_con_info_readdata(CB_Data *cbdata) free(torecv); } else - cbdata->cb_done(cbdata->data, NULL); + cbdata->cb_done(cbdata->data, NULL); } else - cbdata->cb_done(cbdata->data, NULL); + cbdata->cb_done(cbdata->data, NULL); cbdata->cb_done = NULL; } @@ -372,7 +372,8 @@ _ecore_con_info_slave_free(CB_Data *cbdata) } static Eina_Bool -_ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler) +_ecore_con_info_data_handler(void *data, + Ecore_Fd_Handler *fd_handler) { CB_Data *cbdata; @@ -381,7 +382,7 @@ _ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler) { if (ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) - _ecore_con_info_readdata(cbdata); + _ecore_con_info_readdata(cbdata); else { cbdata->cb_done(cbdata->data, NULL); @@ -394,7 +395,9 @@ _ecore_con_info_data_handler(void *data, Ecore_Fd_Handler *fd_handler) } static Eina_Bool -_ecore_con_info_exit_handler(void *data, int type __UNUSED__, void *event) +_ecore_con_info_exit_handler(void *data, + int type __UNUSED__, + void *event) { CB_Data *cbdata; Ecore_Exe_Event_Del *ev; @@ -402,9 +405,10 @@ _ecore_con_info_exit_handler(void *data, int type __UNUSED__, void *event) ev = event; cbdata = data; if (cbdata->pid != ev->pid) - return ECORE_CALLBACK_RENEW; + return ECORE_CALLBACK_RENEW; return ECORE_CALLBACK_CANCEL; /* FIXME: Woot ??? */ _ecore_con_info_slave_free(cbdata); return ECORE_CALLBACK_CANCEL; } + diff --git a/src/lib/ecore_con/ecore_con_local.c b/src/lib/ecore_con/ecore_con_local.c index cb1fc40..658fdc8 100644 --- a/src/lib/ecore_con/ecore_con_local.c +++ b/src/lib/ecore_con/ecore_con_local.c @@ -31,22 +31,20 @@ #include "Ecore_Con.h" #include "ecore_con_private.h" - -#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + \ - (size_t)(((struct sockaddr_un *)NULL)-> \ - sun_path)) -#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + \ +#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + \ + (size_t)(((struct sockaddr_un *)NULL)-> \ + sun_path)) +#define LENGTH_OF_ABSTRACT_SOCKADDR_UN(s, path) (strlen(path) + 1 + \ (size_t)(((struct sockaddr_un \ *)NULL)->sun_path)) - static int _ecore_con_local_init_count = 0; int ecore_con_local_init(void) { if (++_ecore_con_local_init_count != 1) - return _ecore_con_local_init_count; + return _ecore_con_local_init_count; return _ecore_con_local_init_count; } @@ -55,17 +53,18 @@ int ecore_con_local_shutdown(void) { if (--_ecore_con_local_init_count != 0) - return _ecore_con_local_init_count; + return _ecore_con_local_init_count; return _ecore_con_local_init_count; } int -ecore_con_local_connect(Ecore_Con_Server *svr, - Eina_Bool (*cb_done)(void *data, - Ecore_Fd_Handler *fd_handler), - void *data __UNUSED__, - void (*cb_free)(void *data, void *ev)) +ecore_con_local_connect(Ecore_Con_Server *svr, + Eina_Bool (*cb_done)(void *data, + Ecore_Fd_Handler *fd_handler), + void *data __UNUSED__, + void (*cb_free)(void *data, + void *ev)) { char buf[4096]; struct sockaddr_un socket_unix; @@ -77,10 +76,10 @@ ecore_con_local_connect(Ecore_Con_Server *svr, { homedir = getenv("HOME"); if (!homedir) - homedir = getenv("TMP"); + homedir = getenv("TMP"); if (!homedir) - homedir = "/tmp"; + homedir = "/tmp"; snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, svr->name, svr->port); @@ -90,39 +89,39 @@ ecore_con_local_connect(Ecore_Con_Server *svr, if (svr->port < 0) { if (svr->name[0] == '/') - strncpy(buf, svr->name, sizeof(buf)); + strncpy(buf, svr->name, sizeof(buf)); else - snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", svr->name); + snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s", svr->name); } else { if (svr->name[0] == '/') - snprintf(buf, sizeof(buf), "%s|%i", svr->name, - svr->port); + snprintf(buf, sizeof(buf), "%s|%i", svr->name, + svr->port); else - snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", - svr->name, - svr->port); + snprintf(buf, sizeof(buf), "/tmp/.ecore_service|%s|%i", + svr->name, + svr->port); } } else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT) - strncpy(buf, svr->name, - sizeof(buf)); + strncpy(buf, svr->name, + sizeof(buf)); svr->fd = socket(AF_UNIX, SOCK_STREAM, 0); if (svr->fd < 0) - return 0; + return 0; if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - return 0; + return 0; if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - return 0; + return 0; if (setsockopt(svr->fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&curstate, sizeof(curstate)) < 0) - return 0; + return 0; socket_unix.sun_family = AF_UNIX; @@ -148,34 +147,34 @@ ecore_con_local_connect(Ecore_Con_Server *svr, if (connect(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) - return 0; + return 0; svr->path = strdup(buf); if (!svr->path) - return 0; + return 0; if (svr->type & ECORE_CON_SSL) - ecore_con_ssl_server_init(svr); + ecore_con_ssl_server_init(svr); svr->fd_handler = - ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - cb_done, svr, NULL, NULL); + ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, + cb_done, svr, NULL, NULL); if (!svr->fd_handler) - return 0; + return 0; if (!svr->delete_me) { /* we got our server! */ - Ecore_Con_Event_Server_Add *e; - - e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); - if (e) - { - svr->event_count++; - e->server = svr; - ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, - cb_free, NULL); - } + Ecore_Con_Event_Server_Add *e; + + e = calloc(1, sizeof(Ecore_Con_Event_Server_Add)); + if (e) + { + svr->event_count++; + e->server = svr; + ecore_event_add(ECORE_CON_EVENT_SERVER_ADD, e, + cb_free, NULL); + } } return 1; @@ -183,13 +182,13 @@ ecore_con_local_connect(Ecore_Con_Server *svr, int ecore_con_local_listen( - Ecore_Con_Server *svr, - Eina_Bool (* - cb_listen)(void *data, - Ecore_Fd_Handler * - fd_handler), - void *data - __UNUSED__) + Ecore_Con_Server *svr, + Eina_Bool (* + cb_listen)(void *data, + Ecore_Fd_Handler * + fd_handler), + void *data + __UNUSED__) { char buf[4096]; struct sockaddr_un socket_unix; @@ -206,21 +205,21 @@ ecore_con_local_listen( { homedir = getenv("HOME"); if (!homedir) - homedir = getenv("TMP"); + homedir = getenv("TMP"); if (!homedir) - homedir = "/tmp"; + homedir = "/tmp"; mask = S_IRUSR | S_IWUSR | S_IXUSR; snprintf(buf, sizeof(buf), "%s/.ecore", homedir); if (stat(buf, &st) < 0) - mkdir(buf, mask); + mkdir(buf, mask); snprintf(buf, sizeof(buf), "%s/.ecore/%s", homedir, svr->name); if (stat(buf, &st) < 0) - mkdir(buf, mask); + mkdir(buf, mask); - snprintf(buf, + snprintf(buf, sizeof(buf), "%s/.ecore/%s/%i", homedir, @@ -234,45 +233,45 @@ ecore_con_local_listen( if (svr->name[0] == '/') { if (svr->port >= 0) - snprintf(buf, - sizeof(buf), - "%s|%i", - svr->name, - svr->port); + snprintf(buf, + sizeof(buf), + "%s|%i", + svr->name, + svr->port); else - snprintf(buf, - sizeof(buf), - "%s", - svr->name); + snprintf(buf, + sizeof(buf), + "%s", + svr->name); } else - snprintf(buf, - sizeof(buf), - "/tmp/.ecore_service|%s|%i", - svr->name, - svr->port); + snprintf(buf, + sizeof(buf), + "/tmp/.ecore_service|%s|%i", + svr->name, + svr->port); } else if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT) - strncpy(buf, svr->name, - sizeof(buf)); + strncpy(buf, svr->name, + sizeof(buf)); pmode = umask(mask); start: svr->fd = socket(AF_UNIX, SOCK_STREAM, 0); if (svr->fd < 0) - goto error_umask; + goto error_umask; if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0) - goto error_umask; + goto error_umask; if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0) - goto error_umask; + goto error_umask; lin.l_onoff = 1; lin.l_linger = 0; if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin, sizeof(struct linger)) < 0) - goto error_umask; + goto error_umask; socket_unix.sun_family = AF_UNIX; if ((svr->type & ECORE_CON_TYPE) == ECORE_CON_LOCAL_ABSTRACT) @@ -303,24 +302,24 @@ start: (connect(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) && (unlink(buf) >= 0)) - goto start; + goto start; else - goto error_umask; + goto error_umask; } if (listen(svr->fd, 4096) < 0) - goto error_umask; + goto error_umask; svr->path = strdup(buf); if (!svr->path) - goto error_umask; + goto error_umask; svr->fd_handler = - ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, - cb_listen, svr, NULL, NULL); + ecore_main_fd_handler_add(svr->fd, ECORE_FD_READ, + cb_listen, svr, NULL, NULL); umask(pmode); if (!svr->fd_handler) - goto error; + goto error; return 1; @@ -329,3 +328,4 @@ error_umask: error: return 0; } + diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index 5eaaf47..d4b4a58 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -92,7 +92,7 @@ struct _Ecore_Con_Client int buf_size; int buf_offset; unsigned char *buf; - char *ip; + const char *ip; int event_count; struct sockaddr *client_addr; int client_addr_len; @@ -146,7 +146,7 @@ struct _Ecore_Con_Server #endif double start_time; double client_disconnect_time; - char *ip; + const char *ip; Eina_Bool dead : 1; Eina_Bool created : 1; /* EINA_TRUE if server is our listening server */ Eina_Bool connecting : 1; /* EINA_FALSE if just initialized or connected */ diff --git a/src/lib/ecore_con/ecore_con_ssl.c b/src/lib/ecore_con/ecore_con_ssl.c index ebc70ad..047e57d 100644 --- a/src/lib/ecore_con/ecore_con_ssl.c +++ b/src/lib/ecore_con/ecore_con_ssl.c @@ -48,38 +48,55 @@ static int _client_connected = 0; static void _gnutls_print_errors(int ret) { - if (ret) - ERR("gnutls returned with error: %s - %s", gnutls_strerror_name(ret), gnutls_strerror(ret)); + if (ret) + ERR("gnutls returned with error: %s - %s", gnutls_strerror_name(ret), gnutls_strerror(ret)); } +static void +_gnutls_log_func(int level, + const char *str) +{ + DBG("|<%d>| %s", level, str); +} -static const char* +static const char * SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_description_t status) { switch (status) { case GNUTLS_HANDSHAKE_HELLO_REQUEST: return "Hello request"; + case GNUTLS_HANDSHAKE_CLIENT_HELLO: return "Client hello"; + case GNUTLS_HANDSHAKE_SERVER_HELLO: return "Server hello"; + case GNUTLS_HANDSHAKE_NEW_SESSION_TICKET: return "New session ticket"; + case GNUTLS_HANDSHAKE_CERTIFICATE_PKT: return "Certificate packet"; + case GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE: return "Server key exchange"; + case GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST: return "Certificate request"; + case GNUTLS_HANDSHAKE_SERVER_HELLO_DONE: return "Server hello done"; + case GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY: return "Certificate verify"; + case GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE: return "Client key exchange"; + case GNUTLS_HANDSHAKE_FINISHED: return "Finished"; + case GNUTLS_HANDSHAKE_SUPPLEMENTAL: return "Supplemental"; } @@ -100,54 +117,54 @@ _openssl_print_errors(void) ERR("openssl error: %s", ERR_reason_error_string(err)); } while (1); } -#endif -#define SSL_ERROR_CHECK_GOTO_ERROR(X) \ -do \ - { \ - if ((X)) \ - { \ - ERR("Error at %s:%s:%d!", __FILE__, __PRETTY_FUNCTION__, __LINE__); \ - goto error; \ - } \ - } \ -while (0) +#endif +#define SSL_ERROR_CHECK_GOTO_ERROR(X) \ + do \ + { \ + if ((X)) \ + { \ + ERR("Error at %s:%s:%d!", __FILE__, __PRETTY_FUNCTION__, __LINE__); \ + goto error; \ + } \ + } \ + while (0) static Ecore_Con_Ssl_Error - SSL_SUFFIX(_ecore_con_ssl_init) (void); + SSL_SUFFIX(_ecore_con_ssl_init) (void); static Ecore_Con_Ssl_Error - SSL_SUFFIX(_ecore_con_ssl_shutdown) (void); + SSL_SUFFIX(_ecore_con_ssl_shutdown) (void); -static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (Ecore_Con_Server *svr, const char *ca_file); -static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (Ecore_Con_Server *svr, const char *crl_file); -static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (Ecore_Con_Server *svr, const char *cert); -static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (Ecore_Con_Server *svr, const char *key_file); +static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (Ecore_Con_Server * svr, const char *ca_file); +static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (Ecore_Con_Server * svr, const char *crl_file); +static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (Ecore_Con_Server * svr, const char *cert); +static Eina_Bool SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (Ecore_Con_Server * svr, const char *key_file); -static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_prepare)(Ecore_Con_Server *svr, int ssl_type); +static Ecore_Con_Ssl_Error SSL_SUFFIX(_ecore_con_ssl_server_prepare) (Ecore_Con_Server * svr, int ssl_type); static Ecore_Con_Ssl_Error - SSL_SUFFIX(_ecore_con_ssl_server_init) (Ecore_Con_Server * svr); + SSL_SUFFIX(_ecore_con_ssl_server_init) (Ecore_Con_Server * svr); static Ecore_Con_Ssl_Error - SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (Ecore_Con_Server * + SSL_SUFFIX(_ecore_con_ssl_server_shutdown) (Ecore_Con_Server * svr); static int - SSL_SUFFIX(_ecore_con_ssl_server_read) (Ecore_Con_Server * svr, +SSL_SUFFIX(_ecore_con_ssl_server_read) (Ecore_Con_Server * svr, unsigned char *buf, int size); static int - SSL_SUFFIX(_ecore_con_ssl_server_write) (Ecore_Con_Server * +SSL_SUFFIX(_ecore_con_ssl_server_write) (Ecore_Con_Server * svr, unsigned char *buf, int size); static Ecore_Con_Ssl_Error - SSL_SUFFIX(_ecore_con_ssl_client_init) (Ecore_Con_Client * cl); + SSL_SUFFIX(_ecore_con_ssl_client_init) (Ecore_Con_Client * cl); static Ecore_Con_Ssl_Error - SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (Ecore_Con_Client * + SSL_SUFFIX(_ecore_con_ssl_client_shutdown) (Ecore_Con_Client * cl); static int - SSL_SUFFIX(_ecore_con_ssl_client_read) (Ecore_Con_Client * cl, +SSL_SUFFIX(_ecore_con_ssl_client_read) (Ecore_Con_Client * cl, unsigned char *buf, int size); static int - SSL_SUFFIX(_ecore_con_ssl_client_write) (Ecore_Con_Client * cl, +SSL_SUFFIX(_ecore_con_ssl_client_write) (Ecore_Con_Client * cl, unsigned char *buf, int size); /* @@ -158,7 +175,7 @@ Ecore_Con_Ssl_Error ecore_con_ssl_init(void) { if (!_init_con_ssl_init_count++) - SSL_SUFFIX(_ecore_con_ssl_init) (); + SSL_SUFFIX(_ecore_con_ssl_init) (); return _init_con_ssl_init_count; } @@ -173,7 +190,8 @@ ecore_con_ssl_shutdown(void) } Ecore_Con_Ssl_Error -ecore_con_ssl_server_prepare(Ecore_Con_Server *svr, int ssl_type) +ecore_con_ssl_server_prepare(Ecore_Con_Server *svr, + int ssl_type) { if (!ssl_type) return ECORE_CON_SSL_ERROR_NONE; @@ -197,13 +215,17 @@ ecore_con_ssl_server_shutdown(Ecore_Con_Server *svr) } int -ecore_con_ssl_server_read(Ecore_Con_Server *svr, unsigned char *buf, int size) +ecore_con_ssl_server_read(Ecore_Con_Server *svr, + unsigned char *buf, + int size) { return SSL_SUFFIX(_ecore_con_ssl_server_read) (svr, buf, size); } int -ecore_con_ssl_server_write(Ecore_Con_Server *svr, unsigned char *buf, int size) +ecore_con_ssl_server_write(Ecore_Con_Server *svr, + unsigned char *buf, + int size) { return SSL_SUFFIX(_ecore_con_ssl_server_write) (svr, buf, size); } @@ -225,13 +247,17 @@ ecore_con_ssl_client_shutdown(Ecore_Con_Client *cl) } int -ecore_con_ssl_client_read(Ecore_Con_Client *cl, unsigned char *buf, int size) +ecore_con_ssl_client_read(Ecore_Con_Client *cl, + unsigned char *buf, + int size) { return SSL_SUFFIX(_ecore_con_ssl_client_read) (cl, buf, size); } int -ecore_con_ssl_client_write(Ecore_Con_Client *cl, unsigned char *buf, int size) +ecore_con_ssl_client_write(Ecore_Con_Client *cl, + unsigned char *buf, + int size) { return SSL_SUFFIX(_ecore_con_ssl_client_write) (cl, buf, size); } @@ -273,7 +299,7 @@ ecore_con_ssl_server_verify(Ecore_Con_Server *svr) } svr->verify = EINA_TRUE; } - + /** * @brief Add an ssl certificate for use in ecore_con functions. * @@ -286,7 +312,7 @@ ecore_con_ssl_server_verify(Ecore_Con_Server *svr) EAPI Eina_Bool ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, - const char *cert) + const char *cert) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -294,7 +320,7 @@ ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_cert_add)(svr, cert); + return SSL_SUFFIX(_ecore_con_ssl_server_cert_add) (svr, cert); } /** @@ -309,7 +335,7 @@ ecore_con_ssl_server_cert_add(Ecore_Con_Server *svr, EAPI Eina_Bool ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, - const char *ca_file) + const char *ca_file) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -317,7 +343,7 @@ ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_cafile_add)(svr, ca_file); + return SSL_SUFFIX(_ecore_con_ssl_server_cafile_add) (svr, ca_file); } /** @@ -333,7 +359,7 @@ ecore_con_ssl_server_cafile_add(Ecore_Con_Server *svr, EAPI Eina_Bool ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, - const char *key_file) + const char *key_file) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -341,7 +367,7 @@ ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_privkey_add)(svr, key_file); + return SSL_SUFFIX(_ecore_con_ssl_server_privkey_add) (svr, key_file); } /** @@ -357,7 +383,7 @@ ecore_con_ssl_server_privkey_add(Ecore_Con_Server *svr, EAPI Eina_Bool ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr, - const char *crl_file) + const char *crl_file) { if (!ECORE_MAGIC_CHECK(svr, ECORE_MAGIC_CON_SERVER)) { @@ -365,7 +391,7 @@ ecore_con_ssl_server_crl_add(Ecore_Con_Server *svr, return EINA_FALSE; } - return SSL_SUFFIX(_ecore_con_ssl_server_crl_add)(svr, crl_file); + return SSL_SUFFIX(_ecore_con_ssl_server_crl_add) (svr, crl_file); } /** @@ -382,13 +408,13 @@ static Ecore_Con_Ssl_Error _ecore_con_ssl_init_gnutls(void) { #ifdef EFL_HAVE_PTHREAD - if (gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread)) - WRN( - "YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!"); - + if (gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread)) + WRN("YOU ARE USING PTHREADS, BUT I CANNOT INITIALIZE THREADSAFE GCRYPT OPERATIONS!"); #endif if (gnutls_global_init()) - return ECORE_CON_SSL_ERROR_INIT_FAILED; + return ECORE_CON_SSL_ERROR_INIT_FAILED; + gnutls_global_set_log_level(9); + gnutls_global_set_log_function(_gnutls_log_func); return ECORE_CON_SSL_ERROR_NONE; } @@ -402,13 +428,31 @@ _ecore_con_ssl_shutdown_gnutls(void) } static Ecore_Con_Ssl_Error -_ecore_con_ssl_server_prepare_gnutls(Ecore_Con_Server *svr, int ssl_type __UNUSED__) +_ecore_con_ssl_server_prepare_gnutls(Ecore_Con_Server *svr, + int ssl_type) { int ret; + if (ssl_type & ECORE_CON_USE_SSL2) + return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED; + + switch (ssl_type) + { + case ECORE_CON_USE_SSL3: + case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT: + case ECORE_CON_USE_TLS: + case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT: + case ECORE_CON_USE_MIXED: + case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT: + break; + + default: + return ECORE_CON_SSL_ERROR_NONE; + } + SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_allocate_credentials(&svr->cert)); - if (svr->created) + if ((!svr->use_cert) && svr->created) { SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_dh_params_init(&svr->dh_params)); INF("Generating DH params"); @@ -416,16 +460,17 @@ _ecore_con_ssl_server_prepare_gnutls(Ecore_Con_Server *svr, int ssl_type __UNUSE SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_server_credentials(&svr->anoncred_s)); /* TODO: implement PSK */ - SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_server_credentials(&svr->pskcred_s)); + // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_server_credentials(&svr->pskcred_s)); gnutls_anon_set_server_dh_params(svr->anoncred_s, svr->dh_params); gnutls_certificate_set_dh_params(svr->cert, svr->dh_params); - gnutls_psk_set_server_dh_params(svr->pskcred_s, svr->dh_params); + //gnutls_psk_set_server_dh_params(svr->pskcred_s, svr->dh_params); + INF("DH params successfully generated and applied!"); } - else + else if (!svr->use_cert) { - SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_client_credentials(&svr->pskcred_c)); - SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_client_credentials(&svr->anoncred_c)); + //SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_psk_allocate_client_credentials(&svr->pskcred_c)); + SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_anon_allocate_client_credentials(&svr->anoncred_c)); } return ECORE_CON_SSL_ERROR_NONE; @@ -436,10 +481,6 @@ error: return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED; } -/* Tries to connect an Ecore_Con_Server to an SSL host. - * Returns 1 on success, -1 on fatal errors and 0 if the caller - * should try again later. - */ static Ecore_Con_Ssl_Error _ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr) { @@ -453,6 +494,7 @@ _ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr) { case ECORE_CON_SSL_STATE_DONE: return ECORE_CON_SSL_ERROR_NONE; + case ECORE_CON_SSL_STATE_INIT: if (svr->type & ECORE_CON_USE_SSL2) /* not supported because of security issues */ return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED; @@ -461,34 +503,42 @@ _ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr) { case ECORE_CON_USE_SSL3: case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT: - priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1"; - break; + priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1"; + break; case ECORE_CON_USE_TLS: case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT: - priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0"; - break; + priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0"; + break; case ECORE_CON_USE_MIXED: case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT: - break; + break; default: - return ECORE_CON_SSL_ERROR_NONE; + return ECORE_CON_SSL_ERROR_NONE; } SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_init(&svr->session, GNUTLS_CLIENT)); SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_enable_client(svr->session)); SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_server_name_set(svr->session, GNUTLS_NAME_DNS, svr->name, strlen(svr->name))); + INF("Applying priority string: %s", priority); SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_priority_set_direct(svr->session, priority, NULL)); SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_CERTIFICATE, svr->cert)); - SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_PSK, svr->pskcred_c)); - SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_ANON, svr->anoncred_c)); + // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_PSK, svr->pskcred_c)); + if (!svr->use_cert) + SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(svr->session, GNUTLS_CRD_ANON, svr->anoncred_c)); gnutls_dh_set_prime_bits(svr->session, 512); gnutls_transport_set_ptr(svr->session, (gnutls_transport_ptr_t)svr->fd); svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING; + case ECORE_CON_SSL_STATE_HANDSHAKING: + if (!svr->session) + { + DBG("Server was previously lost, going to error condition"); + goto error; + } ret = gnutls_handshake(svr->session); DBG("calling gnutls_handshake(): returned with '%s'", gnutls_strerror_name(ret)); SSL_ERROR_CHECK_GOTO_ERROR(gnutls_error_is_fatal(ret)); @@ -505,6 +555,7 @@ _ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr) ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); return ECORE_CON_SSL_ERROR_NONE; } + default: break; } @@ -535,7 +586,6 @@ _ecore_con_ssl_server_init_gnutls(Ecore_Con_Server *svr) goto error; } - SSL_ERROR_CHECK_GOTO_ERROR(!(cert_list = gnutls_certificate_get_peers(svr->session, &cert_list_size))); SSL_ERROR_CHECK_GOTO_ERROR(!cert_list_size); @@ -551,10 +601,10 @@ error: _gnutls_print_errors(ret); if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED)) ERR("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(svr->session))); - if (svr->ssl_state != ECORE_CON_SSL_STATE_DONE) + if (svr->session && (svr->ssl_state != ECORE_CON_SSL_STATE_DONE)) { - ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(svr->session))); - ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(svr->session))); + ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(svr->session))); + ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(svr->session))); } if (cert) gnutls_x509_crt_deinit(cert); @@ -563,10 +613,11 @@ error: } static Eina_Bool -_ecore_con_ssl_server_cafile_add_gnutls(Ecore_Con_Server *svr, const char *ca_file) +_ecore_con_ssl_server_cafile_add_gnutls(Ecore_Con_Server *svr, + const char *ca_file) { SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_trust_file(svr->cert, ca_file, - GNUTLS_X509_FMT_PEM) < 1); + GNUTLS_X509_FMT_PEM) < 1); return EINA_TRUE; error: @@ -575,10 +626,11 @@ error: } static Eina_Bool -_ecore_con_ssl_server_crl_add_gnutls(Ecore_Con_Server *svr, const char *crl_file) +_ecore_con_ssl_server_crl_add_gnutls(Ecore_Con_Server *svr, + const char *crl_file) { SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_crl_file(svr->cert, crl_file, - GNUTLS_X509_FMT_PEM) < 1); + GNUTLS_X509_FMT_PEM) < 1); return EINA_TRUE; error: @@ -586,12 +638,12 @@ error: return EINA_FALSE; } - static Eina_Bool -_ecore_con_ssl_server_privkey_add_gnutls(Ecore_Con_Server *svr, const char *key_file) +_ecore_con_ssl_server_privkey_add_gnutls(Ecore_Con_Server *svr, + const char *key_file) { SSL_ERROR_CHECK_GOTO_ERROR(gnutls_certificate_set_x509_key_file(svr->cert, svr->cert_file, key_file, - GNUTLS_X509_FMT_PEM)); + GNUTLS_X509_FMT_PEM)); return EINA_TRUE; error: @@ -599,9 +651,9 @@ error: return EINA_FALSE; } - static Eina_Bool -_ecore_con_ssl_server_cert_add_gnutls(Ecore_Con_Server *svr, const char *cert_file) +_ecore_con_ssl_server_cert_add_gnutls(Ecore_Con_Server *svr, + const char *cert_file) { if (!(svr->cert_file = strdup(cert_file))) return EINA_FALSE; @@ -609,7 +661,6 @@ _ecore_con_ssl_server_cert_add_gnutls(Ecore_Con_Server *svr, const char *cert_fi return EINA_TRUE; } - static Ecore_Con_Ssl_Error _ecore_con_ssl_server_shutdown_gnutls(Ecore_Con_Server *svr) { @@ -635,8 +686,8 @@ _ecore_con_ssl_server_shutdown_gnutls(Ecore_Con_Server *svr) } if (svr->anoncred_s) gnutls_anon_free_server_credentials(svr->anoncred_s); - if (svr->pskcred_s) - gnutls_psk_free_server_credentials(svr->pskcred_s); + // if (svr->pskcred_s) + // gnutls_psk_free_server_credentials(svr->pskcred_s); svr->anoncred_s = NULL; svr->pskcred_s = NULL; @@ -645,8 +696,8 @@ _ecore_con_ssl_server_shutdown_gnutls(Ecore_Con_Server *svr) { if (svr->anoncred_c) gnutls_anon_free_client_credentials(svr->anoncred_c); - if (svr->pskcred_c) - gnutls_psk_free_client_credentials(svr->pskcred_c); + // if (svr->pskcred_c) + // gnutls_psk_free_client_credentials(svr->pskcred_c); svr->anoncred_c = NULL; svr->pskcred_c = NULL; @@ -657,10 +708,10 @@ _ecore_con_ssl_server_shutdown_gnutls(Ecore_Con_Server *svr) return ECORE_CON_SSL_ERROR_NONE; } - static int -_ecore_con_ssl_server_read_gnutls(Ecore_Con_Server *svr, unsigned char *buf, - int size) +_ecore_con_ssl_server_read_gnutls(Ecore_Con_Server *svr, + unsigned char *buf, + int size) { int num; @@ -671,10 +722,10 @@ _ecore_con_ssl_server_read_gnutls(Ecore_Con_Server *svr, unsigned char *buf, return 0; return -1; } - + num = gnutls_record_recv(svr->session, buf, size); if (num > 0) - return num; + return num; if (num == GNUTLS_E_REHANDSHAKE) { @@ -686,19 +737,19 @@ _ecore_con_ssl_server_read_gnutls(Ecore_Con_Server *svr, unsigned char *buf, if (!_ecore_con_ssl_server_init_gnutls(svr)) return 0; } - else if ((num == GNUTLS_E_AGAIN) || (num == GNUTLS_E_INTERRUPTED)) - return 0; + else if (!gnutls_error_is_fatal(num)) + return 0; return -1; } static int -_ecore_con_ssl_server_write_gnutls(Ecore_Con_Server *svr, unsigned char *buf, - int size) +_ecore_con_ssl_server_write_gnutls(Ecore_Con_Server *svr, + unsigned char *buf, + int size) { int num; - if (svr->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING) { DBG("Continuing gnutls handshake"); @@ -709,28 +760,30 @@ _ecore_con_ssl_server_write_gnutls(Ecore_Con_Server *svr, unsigned char *buf, num = gnutls_record_send(svr->session, buf, size); if (num > 0) - return num; + return num; if (num == GNUTLS_E_REHANDSHAKE) { - WRN("Rehandshake request ignored"); - return 0; + WRN("Rehandshake request ignored"); + return 0; /* this is only partly functional I think? */ svr->handshaking = EINA_TRUE; svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING; if (!_ecore_con_ssl_server_init_gnutls(svr)) return 0; } - else if ((num == GNUTLS_E_AGAIN) || (num == GNUTLS_E_INTERRUPTED)) - return 0; + else if (!gnutls_error_is_fatal(num)) + return 0; return -1; } - static Ecore_Con_Ssl_Error _ecore_con_ssl_client_init_gnutls(Ecore_Con_Client *cl) { + const gnutls_datum_t *cert_list; + unsigned int iter, cert_list_size; + gnutls_x509_crt_t cert = NULL; const char *priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:+VERS-TLS1.2:+VERS-TLS1.1:+VERS-TLS1.0:+VERS-SSL3.0"; int ret = 0; @@ -738,6 +791,7 @@ _ecore_con_ssl_client_init_gnutls(Ecore_Con_Client *cl) { case ECORE_CON_SSL_STATE_DONE: return ECORE_CON_SSL_ERROR_NONE; + case ECORE_CON_SSL_STATE_INIT: if (cl->host_server->type & ECORE_CON_USE_SSL2) /* not supported because of security issues */ return ECORE_CON_SSL_ERROR_SSL2_NOT_SUPPORTED; @@ -746,33 +800,46 @@ _ecore_con_ssl_client_init_gnutls(Ecore_Con_Client *cl) { case ECORE_CON_USE_SSL3: case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT: - priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1"; - break; + priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-TLS1.0:!VERS-TLS1.1"; + break; case ECORE_CON_USE_TLS: case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT: - priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0"; - break; + priority = "NONE:%VERIFY_ALLOW_X509_V1_CA_CRT:+RSA:+DHE-RSA:+DHE-DSS:+ANON-DH:+COMP-DEFLATE:+COMP-NULL:+CTYPE-X509:+SHA1:+SHA256:+SHA384:+SHA512:+AES-256-CBC:+AES-128-CBC:+3DES-CBC:!VERS-SSL3.0"; + break; + + case ECORE_CON_USE_MIXED: + case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT: + break; default: - return ECORE_CON_SSL_ERROR_NONE; + return ECORE_CON_SSL_ERROR_NONE; } _client_connected++; SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_init(&cl->session, GNUTLS_SERVER)); -#ifdef USE_GNUTLS_2_10 SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_key_generate(&cl->session_ticket)); SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_session_ticket_enable_server(cl->session, &cl->session_ticket)); -#endif + INF("Applying priority string: %s", priority); SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_priority_set_direct(cl->session, priority, NULL)); + SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_CERTIFICATE, cl->host_server->cert)); + // SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_PSK, cl->host_server->pskcred_s)); + if (!cl->host_server->use_cert) + SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_credentials_set(cl->session, GNUTLS_CRD_ANON, cl->host_server->anoncred_s)); gnutls_certificate_server_set_request(cl->session, GNUTLS_CERT_REQUEST); gnutls_dh_set_prime_bits(cl->session, 2048); gnutls_transport_set_ptr(cl->session, (gnutls_transport_ptr_t)cl->fd); cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING; + case ECORE_CON_SSL_STATE_HANDSHAKING: + if (!cl->session) + { + DBG("Client was previously lost, going to error condition"); + goto error; + } DBG("calling gnutls_handshake()"); ret = gnutls_handshake(cl->session); SSL_ERROR_CHECK_GOTO_ERROR(gnutls_error_is_fatal(ret)); @@ -790,19 +857,59 @@ _ecore_con_ssl_client_init_gnutls(Ecore_Con_Client *cl) ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); return ECORE_CON_SSL_ERROR_NONE; } + default: break; } - /* TODO: add cert verification support */ + if (!cl->host_server->verify) + /* not verifying certificates, so we're done! */ + return ECORE_CON_SSL_ERROR_NONE; + ret = 0; + /* use CRL/CA lists to verify */ + SSL_ERROR_CHECK_GOTO_ERROR(ret = gnutls_certificate_verify_peers2(cl->session, &iter)); + if (iter & GNUTLS_CERT_INVALID) + ERR("The certificate is not trusted."); + else if (iter & GNUTLS_CERT_SIGNER_NOT_FOUND) + ERR("The certificate hasn't got a known issuer."); + else if (iter & GNUTLS_CERT_REVOKED) + ERR("The certificate has been revoked."); + else if (iter & GNUTLS_CERT_EXPIRED) + ERR("The certificate has expired"); + else if (iter & GNUTLS_CERT_NOT_ACTIVATED) + ERR("The certificate is not yet activated"); + + if (iter) + goto error; + + if (gnutls_certificate_type_get(cl->session) != GNUTLS_CRT_X509) + { + ERR("Warning: PGP certificates are not yet supported!"); + goto error; + } + + SSL_ERROR_CHECK_GOTO_ERROR(!(cert_list = gnutls_certificate_get_peers(cl->session, &cert_list_size))); + SSL_ERROR_CHECK_GOTO_ERROR(!cert_list_size); + + SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_init(&cert)); + SSL_ERROR_CHECK_GOTO_ERROR(gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER)); + + SSL_ERROR_CHECK_GOTO_ERROR(!gnutls_x509_crt_check_hostname(cert, cl->host_server->name)); + gnutls_x509_crt_deinit(cert); + DBG("SSL certificate verification succeeded!"); return ECORE_CON_SSL_ERROR_NONE; error: _gnutls_print_errors(ret); if ((ret == GNUTLS_E_WARNING_ALERT_RECEIVED) || (ret == GNUTLS_E_FATAL_ALERT_RECEIVED)) ERR("Also received alert: %s", gnutls_alert_get_name(gnutls_alert_get(cl->session))); - ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(cl->session))); - ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(cl->session))); + if (cl->session && (cl->ssl_state != ECORE_CON_SSL_STATE_DONE)) + { + ERR("last out: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_out(cl->session))); + ERR("last in: %s", SSL_GNUTLS_PRINT_HANDSHAKE_STATUS(gnutls_handshake_get_last_in(cl->session))); + } + if (cert) + gnutls_x509_crt_deinit(cert); _ecore_con_ssl_client_shutdown_gnutls(cl); return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED; } @@ -823,10 +930,10 @@ _ecore_con_ssl_client_shutdown_gnutls(Ecore_Con_Client *cl) return ECORE_CON_SSL_ERROR_NONE; } - static int -_ecore_con_ssl_client_read_gnutls(Ecore_Con_Client *cl, unsigned char *buf, - int size) +_ecore_con_ssl_client_read_gnutls(Ecore_Con_Client *cl, + unsigned char *buf, + int size) { int num; @@ -839,7 +946,7 @@ _ecore_con_ssl_client_read_gnutls(Ecore_Con_Client *cl, unsigned char *buf, num = gnutls_record_recv(cl->session, buf, size); if (num > 0) - return num; + return num; if (num == GNUTLS_E_REHANDSHAKE) { @@ -849,22 +956,22 @@ _ecore_con_ssl_client_read_gnutls(Ecore_Con_Client *cl, unsigned char *buf, cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING; if (!_ecore_con_ssl_client_init_gnutls(cl)) return 0; - WRN("Rehandshake request ignored"); - return 0; + WRN("Rehandshake request ignored"); + return 0; } - else if ((num == GNUTLS_E_AGAIN) || (num == GNUTLS_E_INTERRUPTED)) - return 0; + else if (!gnutls_error_is_fatal(num)) + return 0; return -1; } static int -_ecore_con_ssl_client_write_gnutls(Ecore_Con_Client *cl, unsigned char *buf, - int size) +_ecore_con_ssl_client_write_gnutls(Ecore_Con_Client *cl, + unsigned char *buf, + int size) { int num; - if (cl->ssl_state == ECORE_CON_SSL_STATE_HANDSHAKING) { if (!_ecore_con_ssl_client_init_gnutls(cl)) @@ -874,7 +981,7 @@ _ecore_con_ssl_client_write_gnutls(Ecore_Con_Client *cl, unsigned char *buf, num = gnutls_record_send(cl->session, buf, size); if (num > 0) - return num; + return num; if (num == GNUTLS_E_REHANDSHAKE) { @@ -885,8 +992,8 @@ _ecore_con_ssl_client_write_gnutls(Ecore_Con_Client *cl, unsigned char *buf, if (!_ecore_con_ssl_client_init_gnutls(cl)) return 0; } - else if ((num == GNUTLS_E_AGAIN) || (num == GNUTLS_E_INTERRUPTED)) - return 0; + else if (!gnutls_error_is_fatal(num)) + return 0; return -1; } @@ -916,7 +1023,8 @@ _ecore_con_ssl_shutdown_openssl(void) } static Ecore_Con_Ssl_Error -_ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr, int ssl_type) +_ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr, + int ssl_type) { long options; int dh = 0; @@ -928,32 +1036,32 @@ _ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr, int ssl_type) { case ECORE_CON_USE_SSL3: case ECORE_CON_USE_SSL3 | ECORE_CON_LOAD_CERT: - if (!svr->created) - SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method()))); - else - SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_server_method()))); - break; + if (!svr->created) + SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_client_method()))); + else + SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv3_server_method()))); + break; case ECORE_CON_USE_TLS: case ECORE_CON_USE_TLS | ECORE_CON_LOAD_CERT: - if (!svr->created) - SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_client_method()))); - else - SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_server_method()))); - break; + if (!svr->created) + SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_client_method()))); + else + SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(TLSv1_server_method()))); + break; case ECORE_CON_USE_MIXED: case ECORE_CON_USE_MIXED | ECORE_CON_LOAD_CERT: - if (!svr->created) - SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_client_method()))); - else - SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_server_method()))); - options = SSL_CTX_get_options(svr->ssl_ctx); - SSL_CTX_set_options(svr->ssl_ctx, options | SSL_OP_NO_SSLv2 | SSL_OP_SINGLE_DH_USE); - break; + if (!svr->created) + SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_client_method()))); + else + SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl_ctx = SSL_CTX_new(SSLv23_server_method()))); + options = SSL_CTX_get_options(svr->ssl_ctx); + SSL_CTX_set_options(svr->ssl_ctx, options | SSL_OP_NO_SSLv2 | SSL_OP_SINGLE_DH_USE); + break; default: - break; + return ECORE_CON_SSL_ERROR_NONE; } if ((!svr->use_cert) && svr->created) @@ -967,13 +1075,12 @@ _ecore_con_ssl_server_prepare_openssl(Ecore_Con_Server *svr, int ssl_type) SSL_ERROR_CHECK_GOTO_ERROR(!DH_generate_key(dh_params)); SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_tmp_dh(svr->ssl_ctx, dh_params)); DH_free(dh_params); + INF("DH params successfully generated and applied!"); SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_cipher_list(svr->ssl_ctx, "aNULL:!eNULL:!LOW:!EXPORT:@STRENGTH")); } else if (!svr->use_cert) SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_set_cipher_list(svr->ssl_ctx, "aNULL:!eNULL:!LOW:!EXPORT:!ECDH:RSA:AES:!PSK:@STRENGTH")); - SSL_CTX_set_verify(svr->ssl_ctx, SSL_VERIFY_PEER, NULL); - return ECORE_CON_SSL_ERROR_NONE; error: @@ -990,9 +1097,6 @@ error: return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED; } - - - static Ecore_Con_Ssl_Error _ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr) { @@ -1002,13 +1106,20 @@ _ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr) { case ECORE_CON_SSL_STATE_DONE: return ECORE_CON_SSL_ERROR_NONE; + case ECORE_CON_SSL_STATE_INIT: SSL_ERROR_CHECK_GOTO_ERROR(!(svr->ssl = SSL_new(svr->ssl_ctx))); SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(svr->ssl, svr->fd)); SSL_set_connect_state(svr->ssl); svr->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING; - case ECORE_CON_SSL_STATE_HANDSHAKING: + + case ECORE_CON_SSL_STATE_HANDSHAKING: + if (!svr->ssl) + { + DBG("Server was previously lost, going to error condition"); + goto error; + } ret = SSL_do_handshake(svr->ssl); svr->ssl_err = SSL_get_error(svr->ssl, ret); SSL_ERROR_CHECK_GOTO_ERROR((svr->ssl_err == SSL_ERROR_SYSCALL) || (svr->ssl_err == SSL_ERROR_SSL)); @@ -1026,31 +1137,32 @@ _ecore_con_ssl_server_init_openssl(Ecore_Con_Server *svr) ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); return ECORE_CON_SSL_ERROR_NONE; } + default: break; } { /* print session info into DBG */ - SSL_SESSION *s; - BIO *b; - char log[4096]; - - - memset(log, 0, sizeof(log)); - s = SSL_get_session(svr->ssl); - b = BIO_new(BIO_s_mem()); - SSL_SESSION_print(b, s); - while (BIO_read(b, log, sizeof(log)) > 0) - DBG("%s", log); - - BIO_free(b); + SSL_SESSION *s; + BIO *b; + char log[4096]; + + memset(log, 0, sizeof(log)); + s = SSL_get_session(svr->ssl); + b = BIO_new(BIO_s_mem()); + SSL_SESSION_print(b, s); + while (BIO_read(b, log, sizeof(log)) > 0) + DBG("%s", log); + + BIO_free(b); } if (!svr->verify) /* not verifying certificates, so we're done! */ return ECORE_CON_SSL_ERROR_NONE; + SSL_set_verify(svr->ssl, SSL_VERIFY_PEER, NULL); /* use CRL/CA lists to verify */ if (SSL_get_peer_certificate(svr->ssl)) SSL_ERROR_CHECK_GOTO_ERROR(SSL_get_verify_result(svr->ssl)); @@ -1065,7 +1177,8 @@ error: } static Eina_Bool -_ecore_con_ssl_server_cafile_add_openssl(Ecore_Con_Server *svr, const char *ca_file) +_ecore_con_ssl_server_cafile_add_openssl(Ecore_Con_Server *svr, + const char *ca_file) { SSL_ERROR_CHECK_GOTO_ERROR(!SSL_CTX_load_verify_locations(svr->ssl_ctx, ca_file, NULL)); return EINA_TRUE; @@ -1076,7 +1189,8 @@ error: } static Eina_Bool -_ecore_con_ssl_server_crl_add_openssl(Ecore_Con_Server *svr, const char *crl_file) +_ecore_con_ssl_server_crl_add_openssl(Ecore_Con_Server *svr, + const char *crl_file) { X509_STORE *st; X509_LOOKUP *lu; @@ -1099,13 +1213,14 @@ error: } static Eina_Bool -_ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *svr, const char *key_file) +_ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *svr, + const char *key_file) { FILE *fp = NULL; EVP_PKEY *privkey = NULL; if (!(fp = fopen(key_file, "r"))) - goto error; + goto error; SSL_ERROR_CHECK_GOTO_ERROR(!(privkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL))); @@ -1117,20 +1232,20 @@ _ecore_con_ssl_server_privkey_add_openssl(Ecore_Con_Server *svr, const char *key error: if (fp) - fclose(fp); + fclose(fp); _openssl_print_errors(); return EINA_FALSE; } - static Eina_Bool -_ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *svr, const char *cert_file) +_ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *svr, + const char *cert_file) { FILE *fp = NULL; X509 *cert = NULL; if (!(fp = fopen(cert_file, "r"))) - goto error; + goto error; SSL_ERROR_CHECK_GOTO_ERROR(!(cert = PEM_read_X509(fp, NULL, NULL, NULL))); @@ -1142,7 +1257,7 @@ _ecore_con_ssl_server_cert_add_openssl(Ecore_Con_Server *svr, const char *cert_f error: if (fp) - fclose(fp); + fclose(fp); _openssl_print_errors(); return EINA_FALSE; } @@ -1153,13 +1268,13 @@ _ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *svr) if (svr->ssl) { if (!SSL_shutdown(svr->ssl)) - SSL_shutdown(svr->ssl); + SSL_shutdown(svr->ssl); SSL_free(svr->ssl); } if (svr->ssl_ctx) - SSL_CTX_free(svr->ssl_ctx); + SSL_CTX_free(svr->ssl_ctx); svr->ssl = NULL; svr->ssl_ctx = NULL; @@ -1169,8 +1284,9 @@ _ecore_con_ssl_server_shutdown_openssl(Ecore_Con_Server *svr) } static int -_ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr, unsigned char *buf, - int size) +_ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr, + unsigned char *buf, + int size) { int num; @@ -1180,25 +1296,26 @@ _ecore_con_ssl_server_read_openssl(Ecore_Con_Server *svr, unsigned char *buf, if (svr->fd_handler) { if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_READ) - ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); else if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_WRITE) - ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); } if ((svr->ssl_err == SSL_ERROR_ZERO_RETURN) || (svr->ssl_err == SSL_ERROR_SYSCALL) || (svr->ssl_err == SSL_ERROR_SSL)) - return -1; + return -1; if (num < 0) - return 0; + return 0; return num; } static int -_ecore_con_ssl_server_write_openssl(Ecore_Con_Server *svr, unsigned char *buf, - int size) +_ecore_con_ssl_server_write_openssl(Ecore_Con_Server *svr, + unsigned char *buf, + int size) { int num; @@ -1208,18 +1325,18 @@ _ecore_con_ssl_server_write_openssl(Ecore_Con_Server *svr, unsigned char *buf, if (svr->fd_handler) { if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_READ) - ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_READ); else if (svr->ssl && svr->ssl_err == SSL_ERROR_WANT_WRITE) - ecore_main_fd_handler_active_set( svr->fd_handler, ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(svr->fd_handler, ECORE_FD_WRITE); } if ((svr->ssl_err == SSL_ERROR_ZERO_RETURN) || (svr->ssl_err == SSL_ERROR_SYSCALL) || (svr->ssl_err == SSL_ERROR_SSL)) - return -1; + return -1; if (num < 0) - return 0; + return 0; return num; } @@ -1232,13 +1349,20 @@ _ecore_con_ssl_client_init_openssl(Ecore_Con_Client *cl) { case ECORE_CON_SSL_STATE_DONE: return ECORE_CON_SSL_ERROR_NONE; + case ECORE_CON_SSL_STATE_INIT: SSL_ERROR_CHECK_GOTO_ERROR(!(cl->ssl = SSL_new(cl->host_server->ssl_ctx))); SSL_ERROR_CHECK_GOTO_ERROR(!SSL_set_fd(cl->ssl, cl->fd)); SSL_set_accept_state(cl->ssl); cl->ssl_state = ECORE_CON_SSL_STATE_HANDSHAKING; + case ECORE_CON_SSL_STATE_HANDSHAKING: + if (!cl->ssl) + { + DBG("Client was previously lost, going to error condition"); + goto error; + } ret = SSL_do_handshake(cl->ssl); cl->ssl_err = SSL_get_error(cl->ssl, ret); SSL_ERROR_CHECK_GOTO_ERROR((cl->ssl_err == SSL_ERROR_SYSCALL) || (cl->ssl_err == SSL_ERROR_SSL)); @@ -1250,37 +1374,36 @@ _ecore_con_ssl_client_init_openssl(Ecore_Con_Client *cl) else { if (cl->ssl_err == SSL_ERROR_WANT_READ) - ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); else if (cl->ssl_err == SSL_ERROR_WANT_WRITE) - ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE); return ECORE_CON_SSL_ERROR_NONE; } + default: break; } { /* print session info into DBG */ - SSL_SESSION *s; - BIO *b; - char log[4096]; - - - memset(log, 0, sizeof(log)); - s = SSL_get_session(cl->ssl); - b = BIO_new(BIO_s_mem()); - SSL_SESSION_print(b, s); - while (BIO_read(b, log, sizeof(log)) > 0) - DBG("%s", log); - - BIO_free(b); + SSL_SESSION *s; + BIO *b; + char log[4096]; + + memset(log, 0, sizeof(log)); + s = SSL_get_session(cl->ssl); + b = BIO_new(BIO_s_mem()); + SSL_SESSION_print(b, s); + while (BIO_read(b, log, sizeof(log)) > 0) + DBG("%s", log); + + BIO_free(b); } - if (!cl->host_server->verify) /* not verifying certificates, so we're done! */ return ECORE_CON_SSL_ERROR_NONE; - + SSL_set_verify(cl->ssl, SSL_VERIFY_PEER, NULL); /* use CRL/CA lists to verify */ if (SSL_get_peer_certificate(cl->ssl)) SSL_ERROR_CHECK_GOTO_ERROR(SSL_get_verify_result(cl->ssl)); @@ -1293,14 +1416,13 @@ error: return ECORE_CON_SSL_ERROR_SERVER_INIT_FAILED; } - static Ecore_Con_Ssl_Error _ecore_con_ssl_client_shutdown_openssl(Ecore_Con_Client *cl) { if (cl->ssl) { if (!SSL_shutdown(cl->ssl)) - SSL_shutdown(cl->ssl); + SSL_shutdown(cl->ssl); SSL_free(cl->ssl); } @@ -1312,8 +1434,9 @@ _ecore_con_ssl_client_shutdown_openssl(Ecore_Con_Client *cl) } static int -_ecore_con_ssl_client_read_openssl(Ecore_Con_Client *cl, unsigned char *buf, - int size) +_ecore_con_ssl_client_read_openssl(Ecore_Con_Client *cl, + unsigned char *buf, + int size) { int num; @@ -1323,25 +1446,26 @@ _ecore_con_ssl_client_read_openssl(Ecore_Con_Client *cl, unsigned char *buf, if (cl->fd_handler) { if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_READ) - ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); else if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_WRITE) - ecore_main_fd_handler_active_set( cl->fd_handler, ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE); } if ((cl->ssl_err == SSL_ERROR_ZERO_RETURN) || (cl->ssl_err == SSL_ERROR_SYSCALL) || (cl->ssl_err == SSL_ERROR_SSL)) - return -1; + return -1; if (num < 0) - return 0; + return 0; return num; } static int -_ecore_con_ssl_client_write_openssl(Ecore_Con_Client *cl, unsigned char *buf, - int size) +_ecore_con_ssl_client_write_openssl(Ecore_Con_Client *cl, + unsigned char *buf, + int size) { int num; @@ -1351,18 +1475,18 @@ _ecore_con_ssl_client_write_openssl(Ecore_Con_Client *cl, unsigned char *buf, if (cl->fd_handler) { if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_READ) - ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_READ); else if (cl->ssl && cl->ssl_err == SSL_ERROR_WANT_WRITE) - ecore_main_fd_handler_active_set( cl->fd_handler, ECORE_FD_WRITE); + ecore_main_fd_handler_active_set(cl->fd_handler, ECORE_FD_WRITE); } if ((cl->ssl_err == SSL_ERROR_ZERO_RETURN) || (cl->ssl_err == SSL_ERROR_SYSCALL) || (cl->ssl_err == SSL_ERROR_SSL)) - return -1; + return -1; if (num < 0) - return 0; + return 0; return num; } @@ -1386,7 +1510,8 @@ _ecore_con_ssl_shutdown_none(void) } static Ecore_Con_Ssl_Error -_ecore_con_ssl_server_prepare_none(Ecore_Con_Server *svr __UNUSED__, int ssl_type __UNUSED__) +_ecore_con_ssl_server_prepare_none(Ecore_Con_Server *svr __UNUSED__, + int ssl_type __UNUSED__) { return ECORE_CON_SSL_ERROR_NONE; } @@ -1398,25 +1523,29 @@ _ecore_con_ssl_server_init_none(Ecore_Con_Server *svr __UNUSED__) } static Eina_Bool -_ecore_con_ssl_server_cafile_add_none(Ecore_Con_Server *svr __UNUSED__, const char *ca_file __UNUSED__) +_ecore_con_ssl_server_cafile_add_none(Ecore_Con_Server *svr __UNUSED__, + const char *ca_file __UNUSED__) { return EINA_FALSE; } static Eina_Bool -_ecore_con_ssl_server_cert_add_none(Ecore_Con_Server *svr __UNUSED__, const char *cert_file __UNUSED__) +_ecore_con_ssl_server_cert_add_none(Ecore_Con_Server *svr __UNUSED__, + const char *cert_file __UNUSED__) { return EINA_FALSE; } static Eina_Bool -_ecore_con_ssl_server_privkey_add_none(Ecore_Con_Server *svr __UNUSED__, const char *key_file __UNUSED__) +_ecore_con_ssl_server_privkey_add_none(Ecore_Con_Server *svr __UNUSED__, + const char *key_file __UNUSED__) { return EINA_FALSE; } static Eina_Bool -_ecore_con_ssl_server_crl_add_none(Ecore_Con_Server *svr __UNUSED__, const char *crl_file __UNUSED__) +_ecore_con_ssl_server_crl_add_none(Ecore_Con_Server *svr __UNUSED__, + const char *crl_file __UNUSED__) { return EINA_FALSE; } @@ -1428,15 +1557,17 @@ _ecore_con_ssl_server_shutdown_none(Ecore_Con_Server *svr __UNUSED__) } static int -_ecore_con_ssl_server_read_none(Ecore_Con_Server *svr __UNUSED__, unsigned char *buf __UNUSED__, - int size __UNUSED__) +_ecore_con_ssl_server_read_none(Ecore_Con_Server *svr __UNUSED__, + unsigned char *buf __UNUSED__, + int size __UNUSED__) { return -1; } static int -_ecore_con_ssl_server_write_none(Ecore_Con_Server *svr __UNUSED__, unsigned char *buf __UNUSED__, - int size __UNUSED__) +_ecore_con_ssl_server_write_none(Ecore_Con_Server *svr __UNUSED__, + unsigned char *buf __UNUSED__, + int size __UNUSED__) { return -1; } @@ -1454,15 +1585,17 @@ _ecore_con_ssl_client_shutdown_none(Ecore_Con_Client *cl __UNUSED__) } static int -_ecore_con_ssl_client_read_none(Ecore_Con_Client *cl __UNUSED__, unsigned char *buf __UNUSED__, - int size __UNUSED__) +_ecore_con_ssl_client_read_none(Ecore_Con_Client *cl __UNUSED__, + unsigned char *buf __UNUSED__, + int size __UNUSED__) { return -1; } static int -_ecore_con_ssl_client_write_none(Ecore_Con_Client *cl __UNUSED__, unsigned char *buf __UNUSED__, - int size __UNUSED__) +_ecore_con_ssl_client_write_none(Ecore_Con_Client *cl __UNUSED__, + unsigned char *buf __UNUSED__, + int size __UNUSED__) { return -1; } diff --git a/src/lib/ecore_con/ecore_con_url.c b/src/lib/ecore_con/ecore_con_url.c index d915966..ee19c0a 100644 --- a/src/lib/ecore_con/ecore_con_url.c +++ b/src/lib/ecore_con/ecore_con_url.c @@ -64,23 +64,30 @@ int ECORE_CON_EVENT_URL_COMPLETE = 0; int ECORE_CON_EVENT_URL_PROGRESS = 0; #ifdef HAVE_CURL -static Eina_Bool _ecore_con_url_fd_handler(void *data, +static Eina_Bool _ecore_con_url_fd_handler(void *data, Ecore_Fd_Handler *fd_handler); static Eina_Bool _ecore_con_url_perform(Ecore_Con_Url *url_con); -static size_t _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, - void *stream); -static size_t _ecore_con_url_data_cb(void *buffer, - size_t size, - size_t nitems, - void *userp); -static int _ecore_con_url_progress_cb(void *clientp, double dltotal, - double dlnow, double ultotal, - double ulnow); -static size_t _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, - void *stream); -static void _ecore_con_event_url_free(void *data __UNUSED__, void *ev); +static size_t _ecore_con_url_header_cb(void *ptr, + size_t size, + size_t nitems, + void *stream); +static size_t _ecore_con_url_data_cb(void *buffer, + size_t size, + size_t nitems, + void *userp); +static int _ecore_con_url_progress_cb(void *clientp, + double dltotal, + double dlnow, + double ultotal, + double ulnow); +static size_t _ecore_con_url_read_cb(void *ptr, + size_t size, + size_t nitems, + void *stream); +static void _ecore_con_event_url_free(void *data __UNUSED__, + void *ev); static int _ecore_con_url_process_completed_jobs( - Ecore_Con_Url *url_con_to_match); + Ecore_Con_Url *url_con_to_match); static Eina_Bool _ecore_con_url_idler_handler(void *data); static Ecore_Idler *_fd_idler_handler = NULL; @@ -93,7 +100,7 @@ static Ecore_Timer *_curl_timeout = NULL; typedef struct _Ecore_Con_Url_Event Ecore_Con_Url_Event; struct _Ecore_Con_Url_Event { - int type; + int type; void *ev; }; @@ -110,7 +117,8 @@ _url_complete_idler_cb(void *data) } static void -_url_complete_push_event(int type, void *ev) +_url_complete_push_event(int type, + void *ev) { Ecore_Con_Url_Event *lev; @@ -146,7 +154,7 @@ ecore_con_url_init(void) _init_count++; if (_init_count > 1) - return _init_count; + return _init_count; if (!ECORE_CON_EVENT_URL_DATA) { @@ -163,7 +171,7 @@ ecore_con_url_init(void) if (curl_global_init(CURL_GLOBAL_NOTHING)) { while (_url_con_list) - ecore_con_url_free(eina_list_data_get(_url_con_list)); + ecore_con_url_free(eina_list_data_get(_url_con_list)); return 0; } @@ -171,7 +179,7 @@ ecore_con_url_init(void) if (!_curlm) { while (_url_con_list) - ecore_con_url_free(eina_list_data_get(_url_con_list)); + ecore_con_url_free(eina_list_data_get(_url_con_list)); _init_count--; return 0; @@ -179,11 +187,11 @@ ecore_con_url_init(void) curl_multi_timeout(_curlm, &ms); if (ms <= 0) - ms = 1000; + ms = 1000; _curl_timeout = - ecore_timer_add((double)ms / 1000, _ecore_con_url_idler_handler, - (void *)0xACE); + ecore_timer_add((double)ms / 1000, _ecore_con_url_idler_handler, + (void *)0xACE); ecore_timer_freeze(_curl_timeout); } @@ -202,25 +210,25 @@ ecore_con_url_shutdown(void) { #ifdef HAVE_CURL if (!_init_count) - return 0; + return 0; _init_count--; if (_init_count != 0) - return _init_count; + return _init_count; if (_fd_idler_handler) - ecore_idler_del(_fd_idler_handler); + ecore_idler_del(_fd_idler_handler); _fd_idler_handler = NULL; if (_curl_timeout) - ecore_timer_del(_curl_timeout); + ecore_timer_del(_curl_timeout); _curl_timeout = NULL; while (_url_con_list) - ecore_con_url_free(eina_list_data_get(_url_con_list)); + ecore_con_url_free(eina_list_data_get(_url_con_list)); if (_curlm) { @@ -256,11 +264,11 @@ ecore_con_url_new(const char *url) CURLcode ret; if (!_init_count) - return NULL; + return NULL; url_con = calloc(1, sizeof(Ecore_Con_Url)); if (!url_con) - return NULL; + return NULL; url_con->fd = -1; url_con->write_fd = -1; @@ -296,18 +304,18 @@ ecore_con_url_new(const char *url) curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, _ecore_con_url_progress_cb); curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con); - curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE); + curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE); curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION, _ecore_con_url_header_cb); - curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con); + curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con); /* * FIXME: Check that these timeouts are sensible defaults * FIXME: Provide a means to change these timeouts */ curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30); - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300); + curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300); curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1); return url_con; @@ -334,22 +342,23 @@ ecore_con_url_new(const char *url) * @see ecore_con_url_url_set() */ EAPI Ecore_Con_Url * -ecore_con_url_custom_new(const char *url, const char *custom_request) +ecore_con_url_custom_new(const char *url, + const char *custom_request) { #ifdef HAVE_CURL Ecore_Con_Url *url_con; CURLcode ret; if (!url) - return NULL; + return NULL; if (!custom_request) - return NULL; + return NULL; url_con = ecore_con_url_new(url); if (!url_con) - return NULL; + return NULL; ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request); if (ret != CURLE_OK) @@ -383,7 +392,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con) CURLMcode ret; if (!url_con) - return; + return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { @@ -396,7 +405,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con) { FD_CLR(url_con->fd, &_current_fd_set); if (url_con->fd_handler) - ecore_main_fd_handler_del(url_con->fd_handler); + ecore_main_fd_handler_del(url_con->fd_handler); url_con->fd = -1; url_con->fd_handler = NULL; @@ -406,19 +415,19 @@ ecore_con_url_free(Ecore_Con_Url *url_con) { // FIXME: For an unknown reason, progress continue to arrive after destruction // this prevent any further call to the callback. - curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL); + curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL); - if (url_con->active) - { - url_con->active = EINA_FALSE; + if (url_con->active) + { + url_con->active = EINA_FALSE; - ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); - if (ret != CURLM_OK) - ERR("curl_multi_remove_handle failed: %s", - curl_multi_strerror(ret)); - } + ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); + if (ret != CURLM_OK) + ERR("curl_multi_remove_handle failed: %s", + curl_multi_strerror(ret)); + } - curl_easy_cleanup(url_con->curl_easy); + curl_easy_cleanup(url_con->curl_easy); } _url_con_list = eina_list_remove(_url_con_list, url_con); @@ -445,7 +454,8 @@ ecore_con_url_free(Ecore_Con_Url *url_con) * */ EAPI Eina_Bool -ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url) +ecore_con_url_url_set(Ecore_Con_Url *url_con, + const char *url) { #ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -455,20 +465,20 @@ ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url) } if (url_con->active) - return EINA_FALSE; + return EINA_FALSE; if (url_con->url) - free(url_con->url); + free(url_con->url); url_con->url = NULL; if (url) - url_con->url = strdup(url); + url_con->url = strdup(url); if (url_con->url) - curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, - url_con->url); + curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, + url_con->url); else - curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, ""); + curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, ""); return EINA_TRUE; #else @@ -491,7 +501,8 @@ ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url) * @see ecore_con_url_data_get() */ EAPI void -ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data) +ecore_con_url_data_set(Ecore_Con_Url *url_con, + void *data) { #ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -523,8 +534,9 @@ ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data) * @see ecore_con_url_additional_headers_clear() */ EAPI void -ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, - const char *value) +ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, + const char *key, + const char *value) { #ifdef HAVE_CURL char *tmp; @@ -538,7 +550,7 @@ ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, tmp = malloc(strlen(key) + strlen(value) + 3); if (!tmp) - return; + return; sprintf(tmp, "%s: %s", key, value); url_con->additional_headers = eina_list_append(url_con->additional_headers, @@ -625,8 +637,9 @@ ecore_con_url_data_get(Ecore_Con_Url *url_con) * @sa ecore_con_url_send() */ EAPI void -ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, - double timestamp) +ecore_con_url_time(Ecore_Con_Url *url_con, + Ecore_Con_Url_Time condition, + double timestamp) { #ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -657,7 +670,8 @@ ecore_con_url_time(Ecore_Con_Url *url_con, Ecore_Con_Url_Time condition, * */ EAPI void -ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd) +ecore_con_url_fd_set(Ecore_Con_Url *url_con, + int fd) { #ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -735,8 +749,10 @@ ecore_con_url_response_headers_get(Ecore_Con_Url *url_con) * */ EAPI Eina_Bool -ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, - const char *password, Eina_Bool safe) +ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, + const char *username, + const char *password, + Eina_Bool safe) { #ifdef HAVE_CURL CURLcode ret; @@ -752,10 +768,10 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, if ((username) && (password)) { if (safe) - curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, - CURLAUTH_ANYSAFE); + curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, + CURLAUTH_ANYSAFE); else - curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY); + curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, CURLAUTH_ANY); ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username); if (ret != CURLE_OK) @@ -802,8 +818,10 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, * @see ecore_con_url_time() */ EAPI Eina_Bool -ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length, - const char *content_type) +ecore_con_url_send(Ecore_Con_Url *url_con, + const void *data, + long length, + const char *content_type) { #ifdef HAVE_CURL Eina_List *l; @@ -817,10 +835,10 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length, } if (url_con->active) - return EINA_FALSE; + return EINA_FALSE; if (!url_con->url) - return EINA_FALSE; + return EINA_FALSE; /* Free response headers from previous send() calls */ EINA_LIST_FREE(url_con->response_headers, s) @@ -838,30 +856,30 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length, url_con->headers = curl_slist_append(url_con->headers, tmp); } - curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data); + curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data); curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length); } switch (url_con->time_condition) { case ECORE_CON_URL_TIME_NONE: - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, - CURL_TIMECOND_NONE); - break; + curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, + CURL_TIMECOND_NONE); + break; case ECORE_CON_URL_TIME_IFMODSINCE: - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, - CURL_TIMECOND_IFMODSINCE); - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, - (long)url_con->timestamp); - break; + curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, + CURL_TIMECOND_IFMODSINCE); + curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, + (long)url_con->timestamp); + break; case ECORE_CON_URL_TIME_IFUNMODSINCE: - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, - CURL_TIMECOND_IFUNMODSINCE); - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, - (long)url_con->timestamp); - break; + curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, + CURL_TIMECOND_IFUNMODSINCE); + curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, + (long)url_con->timestamp); + break; } /* Additional headers */ @@ -894,9 +912,11 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, long length, * and @p pass to directory @p upload_dir */ EAPI Eina_Bool -ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, - const char *user, const char *pass, - const char *upload_dir) +ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, + const char *filename, + const char *user, + const char *pass, + const char *upload_dir) { #ifdef HAVE_CURL char url[4096]; @@ -914,15 +934,15 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, } if (url_con->active) - return EINA_FALSE; + return EINA_FALSE; if (!url_con->url) - return EINA_FALSE; + return EINA_FALSE; if (filename) { if (stat(filename, &file_info)) - return EINA_FALSE; + return EINA_FALSE; snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass); ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd); @@ -940,7 +960,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url, upload_dir, basename(tmp)); else - snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url, + snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url, basename(tmp)); if (!ecore_con_url_url_set(url_con, url)) @@ -948,7 +968,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size); - curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1); + curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1); curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION, _ecore_con_url_read_cb); @@ -985,7 +1005,8 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, * @param verbose Whether or not to enable libcurl's verbose output. */ EAPI void -ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose) +ecore_con_url_verbose_set(Ecore_Con_Url *url_con, + Eina_Bool verbose) { #ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -996,10 +1017,10 @@ ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose) } if (url_con->active) - return; + return; if (!url_con->url) - return; + return; curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose); #else @@ -1013,7 +1034,8 @@ ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose) * @return FIXME: To be more documented. */ EAPI void -ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv) +ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, + Eina_Bool use_epsv) { #ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -1024,10 +1046,10 @@ ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv) } if (url_con->active) - return; + return; if (!url_con->url) - return; + return; curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, (int)use_epsv); #endif @@ -1048,17 +1070,17 @@ _ecore_con_url_suspend_fd_handler(void) int deleted = 0; if (!_url_con_list) - return 0; + return 0; EINA_LIST_FOREACH(_url_con_list, l, url_con) - { - if (url_con->active && url_con->fd_handler) - { - ecore_main_fd_handler_del(url_con->fd_handler); - url_con->fd_handler = NULL; - deleted++; - } - } + { + if (url_con->active && url_con->fd_handler) + { + ecore_main_fd_handler_del(url_con->fd_handler); + url_con->fd_handler = NULL; + deleted++; + } + } return deleted; } @@ -1071,25 +1093,28 @@ _ecore_con_url_restart_fd_handler(void) int activated = 0; if (!_url_con_list) - return 0; + return 0; EINA_LIST_FOREACH(_url_con_list, l, url_con) - { - if (!url_con->fd_handler && url_con->fd != -1) - { - url_con->fd_handler = - ecore_main_fd_handler_add(url_con->fd, url_con->flags, - _ecore_con_url_fd_handler, - NULL, NULL, NULL); - activated++; - } - } + { + if (!url_con->fd_handler && url_con->fd != -1) + { + url_con->fd_handler = + ecore_main_fd_handler_add(url_con->fd, url_con->flags, + _ecore_con_url_fd_handler, + NULL, NULL, NULL); + activated++; + } + } return activated; } static size_t -_ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) +_ecore_con_url_data_cb(void *buffer, + size_t size, + size_t nitems, + void *userp) { Ecore_Con_Url *url_con; Ecore_Con_Event_Url_Data *e; @@ -1098,7 +1123,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) url_con = (Ecore_Con_Url *)userp; if (!url_con) - return -1; + return -1; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { @@ -1111,14 +1136,14 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) if (url_con->write_fd < 0) { e = - malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) * - (real_size - 1)); + malloc(sizeof(Ecore_Con_Event_Url_Data) + sizeof(unsigned char) * + (real_size - 1)); if (e) { e->url_con = url_con; e->size = real_size; memcpy(e->data, buffer, real_size); - ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, + ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, _ecore_con_event_url_free, NULL); } } @@ -1136,7 +1161,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) if (count < 0) { if (errno != EAGAIN && errno != EINTR) - return -1; + return -1; } else { @@ -1149,31 +1174,34 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) return real_size; } -#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \ - { \ - Ecore_Con_Event_Url_Progress *e; \ - if ((Total != 0) || (Now != 0)) \ - { \ - e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \ - if (e) \ - { \ - e->url_con = url_con; \ - e->total = Total; \ - e->now = Now; \ - ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \ - } \ - } \ - } +#define ECORE_CON_URL_TRANSMISSION(Transmit, Event, Url_con, Total, Now) \ + { \ + Ecore_Con_Event_Url_Progress *e; \ + if ((Total != 0) || (Now != 0)) \ + { \ + e = calloc(1, sizeof(Ecore_Con_Event_Url_Progress)); \ + if (e) \ + { \ + e->url_con = url_con; \ + e->total = Total; \ + e->now = Now; \ + ecore_event_add(Event, e, _ecore_con_event_url_free, NULL); \ + } \ + } \ + } static size_t -_ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream) +_ecore_con_url_header_cb(void *ptr, + size_t size, + size_t nitems, + void *stream) { size_t real_size = size * nitems; Ecore_Con_Url *url_con = stream; char *header = malloc(sizeof(char) * (real_size + 1)); if (!header) - return real_size; + return real_size; memcpy(header, ptr, real_size); header[real_size] = '\0'; @@ -1185,7 +1213,9 @@ _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream) } static int -_ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, +_ecore_con_url_progress_cb(void *clientp, + double dltotal, + double dlnow, double ultotal, double ulnow) { @@ -1210,7 +1240,10 @@ _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, } static size_t -_ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream) +_ecore_con_url_read_cb(void *ptr, + size_t size, + size_t nitems, + void *stream) { size_t retcode = fread(ptr, size, nitems, stream); @@ -1250,7 +1283,7 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con) if (!completed_immediately) { if (url_con->fd_handler) - ecore_main_fd_handler_del(url_con->fd_handler); + ecore_main_fd_handler_del(url_con->fd_handler); url_con->fd_handler = NULL; @@ -1274,13 +1307,13 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con) { flags = 0; if (FD_ISSET(fd, &read_set)) - flags |= ECORE_FD_READ; + flags |= ECORE_FD_READ; if (FD_ISSET(fd, &write_set)) - flags |= ECORE_FD_WRITE; + flags |= ECORE_FD_WRITE; if (FD_ISSET(fd, &exc_set)) - flags |= ECORE_FD_ERROR; + flags |= ECORE_FD_ERROR; if (flags) { @@ -1292,15 +1325,15 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con) curl_multi_strerror(ret)); if (ms == 0) - ms = 1000; + ms = 1000; FD_SET(fd, &_current_fd_set); url_con->fd = fd; url_con->flags = flags; url_con->fd_handler = - ecore_main_fd_handler_add(fd, flags, - _ecore_con_url_fd_handler, - NULL, NULL, NULL); + ecore_main_fd_handler_add(fd, flags, + _ecore_con_url_fd_handler, + NULL, NULL, NULL); break; } } @@ -1308,16 +1341,16 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con) if (!url_con->fd_handler) { /* Failed to set up an fd_handler */ - ecore_timer_freeze(_curl_timeout); + ecore_timer_freeze(_curl_timeout); - ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); - if (ret != CURLM_OK) - ERR("curl_multi_remove_handle failed: %s", - curl_multi_strerror(ret)); + ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); + if (ret != CURLM_OK) + ERR("curl_multi_remove_handle failed: %s", + curl_multi_strerror(ret)); - url_con->active = EINA_FALSE; - url_con->fd = -1; - return EINA_FALSE; + url_con->active = EINA_FALSE; + url_con->fd = -1; + return EINA_FALSE; } ecore_timer_thaw(_curl_timeout); @@ -1334,12 +1367,12 @@ _ecore_con_url_idler_handler(void *data) start = ecore_time_get(); while (curl_multi_perform(_curlm, &still_running) == CURLM_CALL_MULTI_PERFORM) - /* make this not more than a frametime to keep interactivity high */ - if ((ecore_time_get() - start) > ecore_animator_frametime_get()) - { - done = 0; - break; - } + /* make this not more than a frametime to keep interactivity high */ + if ((ecore_time_get() - start) > ecore_animator_frametime_get()) + { + done = 0; + break; + } _ecore_con_url_process_completed_jobs(NULL); @@ -1349,7 +1382,7 @@ _ecore_con_url_idler_handler(void *data) _fd_idler_handler = NULL; if (!_url_con_list) - ecore_timer_freeze(_curl_timeout); + ecore_timer_freeze(_curl_timeout); return data == (void *)0xACE ? ECORE_CALLBACK_RENEW : ECORE_CALLBACK_CANCEL; @@ -1359,14 +1392,14 @@ _ecore_con_url_idler_handler(void *data) } static Eina_Bool -_ecore_con_url_fd_handler(void *data __UNUSED__, +_ecore_con_url_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler *fd_handler __UNUSED__) { _ecore_con_url_suspend_fd_handler(); if (!_fd_idler_handler) - _fd_idler_handler = ecore_idler_add( - _ecore_con_url_idler_handler, NULL); + _fd_idler_handler = ecore_idler_add( + _ecore_con_url_idler_handler, NULL); return ECORE_CALLBACK_RENEW; } @@ -1386,64 +1419,65 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match) while ((curlmsg = curl_multi_info_read(_curlm, &n_remaining))) { if (curlmsg->msg != CURLMSG_DONE) - continue; + continue; /* find the job which is done */ EINA_LIST_FOREACH(_url_con_list, l, url_con) - { - if (curlmsg->easy_handle == url_con->curl_easy) - { - if (url_con_to_match && - (url_con == url_con_to_match)) - job_matched = 1; - - if(url_con->fd != -1) - { - FD_CLR(url_con->fd, &_current_fd_set); - if (url_con->fd_handler) - ecore_main_fd_handler_del( + { + if (curlmsg->easy_handle == url_con->curl_easy) + { + if (url_con_to_match && + (url_con == url_con_to_match)) + job_matched = 1; + + if(url_con->fd != -1) + { + FD_CLR(url_con->fd, &_current_fd_set); + if (url_con->fd_handler) + ecore_main_fd_handler_del( url_con->fd_handler); - url_con->fd = -1; - url_con->fd_handler = NULL; - } - - _url_con_list = eina_list_remove(_url_con_list, url_con); - url_con->active = EINA_FALSE; - e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete)); - if (e) - { - e->url_con = url_con; - e->status = 0; - if (curlmsg->data.result == CURLE_OK) - { - long status; /* curl API uses long, not int */ - - status = 0; - curl_easy_getinfo(curlmsg->easy_handle, - CURLINFO_RESPONSE_CODE, - &status); - e->status = status; - } - - _url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e); - } - - ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); - if (ret != CURLM_OK) - ERR("curl_multi_remove_handle failed: %s", - curl_multi_strerror(ret)); - - break; - } - } + url_con->fd = -1; + url_con->fd_handler = NULL; + } + + _url_con_list = eina_list_remove(_url_con_list, url_con); + url_con->active = EINA_FALSE; + e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete)); + if (e) + { + e->url_con = url_con; + e->status = 0; + if (curlmsg->data.result == CURLE_OK) + { + long status; /* curl API uses long, not int */ + + status = 0; + curl_easy_getinfo(curlmsg->easy_handle, + CURLINFO_RESPONSE_CODE, + &status); + e->status = status; + } + + _url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e); + } + + ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); + if (ret != CURLM_OK) + ERR("curl_multi_remove_handle failed: %s", + curl_multi_strerror(ret)); + + break; + } + } } return job_matched; } static void -_ecore_con_event_url_free(void *data __UNUSED__, void *ev) +_ecore_con_event_url_free(void *data __UNUSED__, + void *ev) { free(ev); } diff --git a/src/lib/ecore_config/Makefile.am b/src/lib/ecore_config/Makefile.am index 80fe04f..c459351 100644 --- a/src/lib/ecore_config/Makefile.am +++ b/src/lib/ecore_config/Makefile.am @@ -16,8 +16,6 @@ AM_CPPFLAGS = \ CLEANFILES = $(DB) -if BUILD_ECORE_CONFIG - #DB = system.db #$(DB): Makefile # edb_ed $(top_builddir)/src/lib/ecore_config/$(DB) add /e/theme/name str "winter" @@ -58,8 +56,6 @@ libecore_config_la_LIBADD += $(top_builddir)/src/lib/ecore_ipc/libecore_ipc.la endif -endif - EXTRA_DIST = \ ecore_config_ipc.h \ ecore_config_private.h \ diff --git a/src/lib/ecore_directfb/Makefile.am b/src/lib/ecore_directfb/Makefile.am index 7761e7b..8142d33 100644 --- a/src/lib/ecore_directfb/Makefile.am +++ b/src/lib/ecore_directfb/Makefile.am @@ -5,8 +5,6 @@ AM_CPPFLAGS = \ -I$(top_builddir)/src/lib/ecore \ @DIRECTFB_CFLAGS@ @EINA_CFLAGS@ -if BUILD_ECORE_DIRECTFB - lib_LTLIBRARIES = libecore_directfb.la includes_HEADERS = Ecore_DirectFB.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -26,8 +24,6 @@ libecore_directfb_la_LDFLAGS = -version-info @version_info@ @release_info@ libecore_directfb_la_DEPENDENCIES = \ $(top_builddir)/src/lib/ecore/libecore.la -endif - EXTRA_DIST = \ Ecore_DirectFB.h \ ecore_directfb.c \ diff --git a/src/lib/ecore_evas/Ecore_Evas.h b/src/lib/ecore_evas/Ecore_Evas.h index 53e5296..8343473 100644 --- a/src/lib/ecore_evas/Ecore_Evas.h +++ b/src/lib/ecore_evas/Ecore_Evas.h @@ -189,6 +189,8 @@ EAPI Ecore_Evas *ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc EAPI const void *ecore_evas_buffer_pixels_get(Ecore_Evas *ee); EAPI Evas_Object *ecore_evas_object_image_new(Ecore_Evas *ee_target); +EAPI Ecore_Evas *ecore_evas_object_ecore_evas_get(Evas_Object *obj); +EAPI Evas *ecore_evas_object_evas_get(Evas_Object *obj); EAPI Ecore_Evas *ecore_evas_software_gdi_new(Ecore_Win32_Window *parent, int x, diff --git a/src/lib/ecore_evas/Makefile.am b/src/lib/ecore_evas/Makefile.am index 78a3b21..a4eba85 100644 --- a/src/lib/ecore_evas/Makefile.am +++ b/src/lib/ecore_evas/Makefile.am @@ -82,8 +82,6 @@ $(ECORE_WINCE_INC) \ AM_CFLAGS = @WIN32_CFLAGS@ -if BUILD_ECORE_EVAS - lib_LTLIBRARIES = libecore_evas.la includes_HEADERS = Ecore_Evas.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -118,7 +116,5 @@ $(top_builddir)/src/lib/ecore/libecore.la \ libecore_evas_la_LDFLAGS = @cocoa_ldflags@ -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = \ ecore_evas_private.h diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index a8cd2ff..fdd71dc 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -703,15 +703,15 @@ static const struct ecore_evas_engine _engines[] = { #endif /* Last chance to have a window */ +#ifdef BUILD_ECORE_EVAS_OPENGL_SDL + {"opengl_sdl", _ecore_evas_constructor_opengl_sdl}, +#endif + #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL {"sdl", _ecore_evas_constructor_sdl}, {"software_16_sdl", _ecore_evas_constructor_sdl16}, #endif -#ifdef BUILD_ECORE_EVAS_OPENGL_SDL - {"opengl_sdl", _ecore_evas_constructor_opengl_sdl}, -#endif - /* independent */ #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER {"buffer", _ecore_evas_constructor_buffer}, @@ -2761,15 +2761,13 @@ _ecore_evas_fps_debug_rendertime_add(double t) rlapse = tim; flapse = frames; } - else if ((tim - rlapse) >= 0.1) + else if ((tim - rlapse) >= 0.5) { - printf("%.6f \t", tim); printf("FRAME: %i, FPS: %3.1f, RTIME %3.0f%%\n", frames, (frames - flapse) / (tim - rlapse), (100.0 * rtime) / (tim - rlapse) ); - fflush(stdout); rlapse = tim; flapse = frames; rtime = 0.0; diff --git a/src/lib/ecore_evas/ecore_evas_buffer.c b/src/lib/ecore_evas/ecore_evas_buffer.c index 7e22260..22f13bd 100644 --- a/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/src/lib/ecore_evas/ecore_evas_buffer.c @@ -611,6 +611,23 @@ ecore_evas_buffer_pixels_get(Ecore_Evas *ee) #endif } +EAPI Evas * +ecore_evas_object_evas_get(Evas_Object *obj) +{ + Ecore_Evas *ee; + + ee = evas_object_data_get(obj, "Ecore_Evas"); + if (!ee) return NULL; + + return ecore_evas_get(ee); +} + +EAPI Ecore_Evas * +ecore_evas_object_ecore_evas_get(Evas_Object *obj) +{ + return evas_object_data_get(obj, "Ecore_Evas"); +} + EAPI Evas_Object * ecore_evas_object_image_new(Ecore_Evas *ee_target) { @@ -627,7 +644,9 @@ ecore_evas_object_image_new(Ecore_Evas *ee_target) if (!ee) return NULL; o = evas_object_image_add(ee_target->evas); - + evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC); + evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888); + ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS); _ecore_evas_buffer_init(); diff --git a/src/lib/ecore_evas/ecore_evas_fb.c b/src/lib/ecore_evas/ecore_evas_fb.c index 5c4389f..df9f70f 100644 --- a/src/lib/ecore_evas/ecore_evas_fb.c +++ b/src/lib/ecore_evas/ecore_evas_fb.c @@ -177,11 +177,14 @@ _ecore_evas_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void * { Ecore_Evas *ee; Ecore_Fb_Event_Mouse_Wheel *e; + unsigned long long event_time; e = event; ee = _ecore_evas_fb_match(); if (!ee) return EINA_TRUE; /* pass on event */ - _ecore_evas_mouse_move_process_fb(ee, e->x, e->y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff)); + event_time = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff); + _ecore_evas_mouse_move_process_fb(ee, e->x, e->y, event_time); + evas_event_feed_mouse_wheel(ee->evas, e->direction, e->wheel, event_time, NULL); return EINA_FALSE; /* dont pass it on */ } diff --git a/src/lib/ecore_evas/ecore_evas_x.c b/src/lib/ecore_evas/ecore_evas_x.c index bfa5195..c9fe041 100644 --- a/src/lib/ecore_evas/ecore_evas_x.c +++ b/src/lib/ecore_evas/ecore_evas_x.c @@ -1567,7 +1567,6 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize, } } -/* added by gl77.lee 101001 - for EFL rotation effect */ #define _USE_WIN_ROT_EFFECT 1 #if _USE_WIN_ROT_EFFECT @@ -1591,20 +1590,18 @@ _ecore_evas_x_rotation_effect_setup(void) } #endif /* end of _USE_WIN_ROT_EFFECT */ - - static void _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) { if (ee->rotation == rotation) return; if (!strcmp(ee->driver, "xrender_x11")) return; - #if _USE_WIN_ROT_EFFECT +#if _USE_WIN_ROT_EFFECT int angles[2]; angles[0] = rotation; angles[1] = ee->rotation; - #endif /* end of _USE_WIN_ROT_EFFECT */ - +#endif /* end of _USE_WIN_ROT_EFFECT */ + if (!strcmp(ee->driver, "opengl_x11")) { #ifdef BUILD_ECORE_EVAS_OPENGL_X11 @@ -1615,18 +1612,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal (ee, rotation, resize, (Evas_Engine_Info *)einfo); - - /* added by doyoun.kang 100218 - for rotation */ - #if _USE_WIN_ROT_EFFECT - ecore_x_window_prop_property_set (ee->prop.window, - ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, &angles, 2); - #else - ecore_x_window_prop_property_set (ee->prop.window, - ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); - #endif - +# if _USE_WIN_ROT_EFFECT + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_OPENGL_X11 */ } else if (!strcmp(ee->driver, "software_x11")) @@ -1639,18 +1633,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal (ee, rotation, resize, (Evas_Engine_Info *)einfo); - - /* added by doyoun.kang 100218 - for rotation */ - #if _USE_WIN_ROT_EFFECT - ecore_x_window_prop_property_set (ee->prop.window, - ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, &angles, 2); - #else - ecore_x_window_prop_property_set (ee->prop.window, - ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); - #endif - +# if _USE_WIN_ROT_EFFECT + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_SOFTWARE_X11 */ } else if (!strcmp(ee->driver, "software_16_x11")) @@ -1663,18 +1654,15 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal (ee, rotation, resize, (Evas_Engine_Info *)einfo); - - /* added by doyoun.kang 100218 - for rotation */ - #if _USE_WIN_ROT_EFFECT - ecore_x_window_prop_property_set (ee->prop.window, - ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, &angles, 2); - #else - ecore_x_window_prop_property_set (ee->prop.window, - ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, - ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); - #endif - +# if _USE_WIN_ROT_EFFECT + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_X11 */ } else if (!strcmp(ee->driver, "software_8_x11")) @@ -1687,13 +1675,22 @@ _ecore_evas_x_rotation_set(Ecore_Evas *ee, int rotation, int resize) einfo->info.rotation = rotation; _ecore_evas_x_rotation_set_internal (ee, rotation, resize, (Evas_Engine_Info *)einfo); +# if _USE_WIN_ROT_EFFECT + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &angles, 2); +# else + ecore_x_window_prop_property_set (ee->prop.window, + ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, + ECORE_X_ATOM_CARDINAL, 32, &rotation, 1); +# endif #endif /* BUILD_ECORE_EVAS_SOFTWARE_8_X11 */ } - #if _USE_WIN_ROT_EFFECT - _ecore_evas_x_rotation_effect_setup(); - _ecore_evas_x_flush_pre(ee, NULL, NULL); - #endif /* end of _USE_WIN_ROT_EFFECT */ +#if _USE_WIN_ROT_EFFECT + _ecore_evas_x_rotation_effect_setup(); + _ecore_evas_x_flush_pre(ee, NULL, NULL); +#endif /* end of _USE_WIN_ROT_EFFECT */ } static void diff --git a/src/lib/ecore_fb/Makefile.am b/src/lib/ecore_fb/Makefile.am index 696f6cb..a9af6c6 100644 --- a/src/lib/ecore_fb/Makefile.am +++ b/src/lib/ecore_fb/Makefile.am @@ -6,7 +6,6 @@ AM_CPPFLAGS = \ @TSLIB_CFLAGS@ \ @EINA_CFLAGS@ -if BUILD_ECORE_FB lib_LTLIBRARIES = libecore_fb.la includes_HEADERS = Ecore_Fb.h @@ -28,8 +27,6 @@ $(top_builddir)/src/lib/ecore/libecore.la \ libecore_fb_la_LDFLAGS = -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = \ ecore_fb_private.h \ ecore_fb_keytable.h diff --git a/src/lib/ecore_file/Makefile.am b/src/lib/ecore_file/Makefile.am index 55c8097..ab23ace 100644 --- a/src/lib/ecore_file/Makefile.am +++ b/src/lib/ecore_file/Makefile.am @@ -16,8 +16,6 @@ if BUILD_ECORE_CON lib_ecore_con_la = $(top_builddir)/src/lib/ecore_con/libecore_con.la endif -if BUILD_ECORE_FILE - lib_LTLIBRARIES = libecore_file.la includes_HEADERS = Ecore_File.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -39,7 +37,5 @@ $(lib_ecore_con_la) \ libecore_file_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_file_private.h diff --git a/src/lib/ecore_file/ecore_file.c b/src/lib/ecore_file/ecore_file.c index b568ca2..acd24e2 100644 --- a/src/lib/ecore_file/ecore_file.c +++ b/src/lib/ecore_file/ecore_file.c @@ -431,6 +431,15 @@ _ecore_file_mkpath_if_not_exists(const char *path) { struct stat st; + /* Windows: path like C: or D: etc are valid, but stat() returns an error */ +#ifdef _WIN32 + if ((strlen(path) == 2) && + ((path[0] >= 'a' && path[0] <= 'z') || + (path[0] >= 'A' && path[0] <= 'Z')) && + (path[1] == ':')) + return EINA_TRUE; +#endif + if (stat(path, &st) < 0) return ecore_file_mkdir(path); else if (!S_ISDIR(st.st_mode)) @@ -446,9 +455,9 @@ _ecore_file_mkpath_if_not_exists(const char *path) * @return EINA_TRUE on success, EINA_FALSE otherwise. * * This function create @p path and all the subdirectories it - * contains. The separator is '/' so, on Windows, '\' must be replaced - * by '/'. If @p path exists, this function returns EINA_TRUE - * immediatly. It returns EINA_TRUE on success, EINA_FALSE otherwise. + * contains. The separator is '/' or '\'. If @p path exists, this + * function returns EINA_TRUE immediatly. It returns EINA_TRUE on + * success, EINA_FALSE otherwise. */ EAPI Eina_Bool ecore_file_mkpath(const char *path) @@ -462,7 +471,7 @@ ecore_file_mkpath(const char *path) for (i = 0; path[i] != '\0'; ss[i] = path[i], i++) { if (i == sizeof(ss) - 1) return EINA_FALSE; - if ((path[i] == '/') && (i > 0)) + if (((path[i] == '/') || (path[i] == '\\')) && (i > 0)) { ss[i] = '\0'; if (!_ecore_file_mkpath_if_not_exists(ss)) diff --git a/src/lib/ecore_file/ecore_file_download.c b/src/lib/ecore_file/ecore_file_download.c index aa4b6a1..f97c682 100644 --- a/src/lib/ecore_file/ecore_file_download.c +++ b/src/lib/ecore_file/ecore_file_download.c @@ -153,6 +153,16 @@ ecore_file_download(const char *url, if(job_ret) *job_ret = job; return job ? EINA_TRUE : EINA_FALSE; } +# else + else if ((!strncmp(url, "http://", 7)) || + (!strncmp(url, "ftp://", 6))) + { + (void)completion_cb; + (void)progress_cb; + (void)data; + (void)job_ret; + return EINA_FALSE; + } # endif else { diff --git a/src/lib/ecore_file/ecore_file_monitor_inotify.c b/src/lib/ecore_file/ecore_file_monitor_inotify.c index abad382..71e0cab 100644 --- a/src/lib/ecore_file/ecore_file_monitor_inotify.c +++ b/src/lib/ecore_file/ecore_file_monitor_inotify.c @@ -16,6 +16,7 @@ * IN_ACCESS, IN_ATTRIB, IN_CLOSE_WRITE, IN_CLOSE_NOWRITE, IN_OPEN * - Read all events first, then call the callbacks. This will prevent several * callbacks with the typic save cycle (delete file, new file) + * - Listen to IN_IGNORED, emitted when the watch is removed */ #ifdef HAVE_INOTIFY @@ -134,7 +135,8 @@ ecore_file_monitor_inotify_del(Ecore_File_Monitor *em) { int fd; - _monitors = ECORE_FILE_MONITOR(eina_inlist_remove(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em))); + if (_monitors) + _monitors = ECORE_FILE_MONITOR(eina_inlist_remove(EINA_INLIST_GET(_monitors), EINA_INLIST_GET(em))); fd = ecore_main_fd_handler_fd_get(_fdh); if (ECORE_FILE_MONITOR_INOTIFY(em)->wd) @@ -195,10 +197,14 @@ _ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask) isdir = mask & IN_ISDIR; #if 0 - _ecore_file_monitor_inotify_print(file, mask); + _ecore_file_monitor_inotify_print(buf, mask); #endif - if (mask & IN_MODIFY) + if (mask & IN_ATTRIB) + { + em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf); + } + if (mask & IN_CLOSE_WRITE) { if (!isdir) em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf); @@ -263,7 +269,7 @@ static int _ecore_file_monitor_inotify_monitor(Ecore_File_Monitor *em, const char *path) { int mask; - mask = IN_MODIFY| + mask = IN_ATTRIB|IN_CLOSE_WRITE| IN_MOVED_FROM|IN_MOVED_TO| IN_DELETE|IN_CREATE| IN_DELETE_SELF|IN_MOVE_SELF| @@ -310,38 +316,32 @@ _ecore_file_monitor_inotify_print(char *file, int mask) else type = "file"; + if (mask & IN_ACCESS) + INF("Inotify accessed %s: %s", type, file); if (mask & IN_MODIFY) - { - WRN("Inotify modified %s: %s", type, file); - } + INF("Inotify modified %s: %s", type, file); + if (mask & IN_ATTRIB) + INF("Inotify attributes %s: %s", type, file); + if (mask & IN_CLOSE_WRITE) + INF("Inotify close write %s: %s", type, file); + if (mask & IN_CLOSE_NOWRITE) + INF("Inotify close write %s: %s", type, file); + if (mask & IN_OPEN) + INF("Inotify open %s: %s", type, file); if (mask & IN_MOVED_FROM) - { - WRN("Inotify moved from %s: %s", type, file); - } + INF("Inotify moved from %s: %s", type, file); if (mask & IN_MOVED_TO) - { - WRN("Inotify moved to %s: %s", type, file); - } + INF("Inotify moved to %s: %s", type, file); if (mask & IN_DELETE) - { - WRN("Inotify delete %s: %s", type, file); - } + INF("Inotify delete %s: %s", type, file); if (mask & IN_CREATE) - { - WRN("Inotify create %s: %s", type, file); - } + INF("Inotify create %s: %s", type, file); if (mask & IN_DELETE_SELF) - { - WRN("Inotify delete self %s: %s", type, file); - } + INF("Inotify delete self %s: %s", type, file); if (mask & IN_MOVE_SELF) - { - WRN("Inotify move self %s: %s", type, file); - } + INF("Inotify move self %s: %s", type, file); if (mask & IN_UNMOUNT) - { - WRN("Inotify unmount %s: %s", type, file); - } + INF("Inotify unmount %s: %s", type, file); } #endif #endif /* HAVE_INOTIFY */ diff --git a/src/lib/ecore_file/ecore_file_monitor_poll.c b/src/lib/ecore_file/ecore_file_monitor_poll.c index 16410a0..9cab3c7 100644 --- a/src/lib/ecore_file/ecore_file_monitor_poll.c +++ b/src/lib/ecore_file/ecore_file_monitor_poll.c @@ -300,7 +300,7 @@ _ecore_file_monitor_poll_check(Ecore_File_Monitor *em) f->name = strdup(file); f->mtime = ecore_file_mod_time(buf); - f->is_dir = ecore_file_mod_time(buf); + f->is_dir = ecore_file_is_dir(buf); if (f->is_dir) event = ECORE_FILE_EVENT_CREATED_DIRECTORY; else diff --git a/src/lib/ecore_file/ecore_file_path.c b/src/lib/ecore_file/ecore_file_path.c index e029d50..6990250 100644 --- a/src/lib/ecore_file/ecore_file_path.c +++ b/src/lib/ecore_file/ecore_file_path.c @@ -2,6 +2,24 @@ # include #endif +#undef alloca +#ifdef HAVE_ALLOCA_H +# include +#elif defined __GNUC__ +# define alloca __builtin_alloca +#elif defined _AIX +# define alloca __alloca +#elif defined _MSC_VER +# include +# define alloca _alloca +#else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +#endif + #include #include @@ -23,20 +41,22 @@ ecore_file_path_shutdown(void) char *dir; EINA_LIST_FREE(__ecore_file_path_bin, dir) - free(dir); + eina_stringshare_del(dir); } Eina_List * _ecore_file_path_from_env(const char *env) { Eina_List *path = NULL; - char *env_path, *p, *last; + char *env_tmp, *env_path, *p, *last; - env_path = getenv(env); - if (!env_path) + env_tmp = getenv(env); + if (!env_tmp) return path; - env_path = strdup(env_path); + env_path = alloca(sizeof(char) * strlen(env_tmp) + 1); + memset(env_path, 0, strlen(env_tmp)); + strcpy(env_path, env_tmp); last = env_path; for (p = env_path; *p; p++) { @@ -46,14 +66,13 @@ _ecore_file_path_from_env(const char *env) if (!*p) { if (!ecore_file_path_dir_exists(last)) - path = eina_list_append(path, strdup(last)); + path = eina_list_append(path, eina_stringshare_add(last)); last = p + 1; } } if (p > last) - path = eina_list_append(path, strdup(last)); + path = eina_list_append(path, eina_stringshare_add(last)); - free(env_path); return path; } diff --git a/src/lib/ecore_imf/ecore_imf_context.c b/src/lib/ecore_imf/ecore_imf_context.c index 8acea11..b817cd8 100644 --- a/src/lib/ecore_imf/ecore_imf_context.c +++ b/src/lib/ecore_imf/ecore_imf_context.c @@ -228,7 +228,7 @@ ecore_imf_context_del(Ecore_IMF_Context *ctx) if (ctx->klass->del) ctx->klass->del(ctx); ECORE_MAGIC_SET(ctx, ECORE_MAGIC_NONE); - + EINA_LIST_FREE(ctx->private_key_list, data) free(data); @@ -380,7 +380,7 @@ ecore_imf_context_preedit_string_get(Ecore_IMF_Context *ctx, char **str, int *cu } } -EAPI void +EAPI void ecore_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, char **str, Eina_List **attrs, int *cursor_pos) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -394,7 +394,7 @@ ecore_imf_context_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, cha else { if (str) *str = strdup(""); - if (attrs) *attrs = NULL; + if (attrs) *attrs = NULL; if (cursor_pos) *cursor_pos = 0; } } @@ -879,7 +879,7 @@ ecore_imf_context_delete_surrounding_event_add(Ecore_IMF_Context *ctx, int offse } /*** ImControl Related APIs */ -EAPI void +EAPI void ecore_imf_context_input_panel_show(Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -891,7 +891,7 @@ ecore_imf_context_input_panel_show(Ecore_IMF_Context *ctx) if (ctx->klass->show) ctx->klass->show(ctx); } -EAPI void +EAPI void ecore_imf_context_input_panel_hide(Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -903,7 +903,7 @@ ecore_imf_context_input_panel_hide(Ecore_IMF_Context *ctx) if (ctx->klass->hide) ctx->klass->hide(ctx); } -EAPI void +EAPI void ecore_imf_context_control_panel_show (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -915,7 +915,7 @@ ecore_imf_context_control_panel_show (Ecore_IMF_Context *ctx) if (ctx->klass->control_panel_show) ctx->klass->control_panel_show(ctx); } -EAPI void +EAPI void ecore_imf_context_control_panel_hide (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -927,7 +927,7 @@ ecore_imf_context_control_panel_hide (Ecore_IMF_Context *ctx) if (ctx->klass->control_panel_hide) ctx->klass->control_panel_hide(ctx); } -EAPI void +EAPI void ecore_imf_context_input_panel_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Lang lang) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -935,11 +935,12 @@ ecore_imf_context_input_panel_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_In ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_language_set"); return; } + if (ctx->klass->input_panel_language_set) ctx->klass->input_panel_language_set(ctx, lang); ctx->input_panel_lang = lang; } -EAPI Ecore_IMF_Input_Panel_Lang +EAPI Ecore_IMF_Input_Panel_Lang ecore_imf_context_input_panel_language_get (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -951,7 +952,7 @@ ecore_imf_context_input_panel_language_get (Ecore_IMF_Context *ctx) return ctx->input_panel_lang; } -EAPI int +EAPI int ecore_imf_context_ise_get_ise_language (Ecore_IMF_Context *ctx, const char* ise_name, char ***langlist) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -967,14 +968,13 @@ ecore_imf_context_ise_get_ise_language (Ecore_IMF_Context *ctx, const char* ise_ } if (ctx->klass->ise_get_ise_language) - { - return ctx->klass->ise_get_ise_language(ctx, ise_name, langlist); - } + return ctx->klass->ise_get_ise_language(ctx, ise_name, langlist); else return -1; } -EAPI void ecore_imf_context_keyboard_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_Keyboard_Lang lang) +EAPI void +ecore_imf_context_keyboard_language_set (Ecore_IMF_Context *ctx, Ecore_IMF_Keyboard_Lang lang) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { @@ -984,9 +984,11 @@ EAPI void ecore_imf_context_keyboard_language_set (Ecore_IMF_Context *ctx, Ecore // if (ctx->klass->ise_set_language) ctx->klass->ise_set_language(ctx, lang); } -EAPI Ecore_IMF_Keyboard_Lang ecore_imf_context_keyboard_language_get (Ecore_IMF_Context *ctx) +EAPI Ecore_IMF_Keyboard_Lang +ecore_imf_context_keyboard_language_get (Ecore_IMF_Context *ctx) { Ecore_IMF_Keyboard_Lang lang = ECORE_IMF_KEYBOARD_LANG_NATIVE; + if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_keyboard_language_get"); @@ -999,7 +1001,7 @@ EAPI Ecore_IMF_Keyboard_Lang ecore_imf_context_keyboard_language_get (Ecore_IMF_ return lang; } -EAPI void +EAPI void ecore_imf_context_ise_set_isf_language (Ecore_IMF_Context *ctx, const char* lang) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1017,7 +1019,7 @@ ecore_imf_context_ise_set_isf_language (Ecore_IMF_Context *ctx, const char* lang if (ctx->klass->ise_set_isf_language) ctx->klass->ise_set_isf_language(ctx, lang); } -EAPI void +EAPI void ecore_imf_context_input_panel_imdata_set (Ecore_IMF_Context *ctx, const char * data, int len) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1035,7 +1037,7 @@ ecore_imf_context_input_panel_imdata_set (Ecore_IMF_Context *ctx, const char * d if (ctx->klass->input_panel_imdata_set) ctx->klass->input_panel_imdata_set(ctx, data, len); } -EAPI void +EAPI void ecore_imf_context_input_panel_imdata_get (Ecore_IMF_Context *ctx, char * data, int *len) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1053,7 +1055,7 @@ ecore_imf_context_input_panel_imdata_get (Ecore_IMF_Context *ctx, char * data, i if (ctx->klass->input_panel_imdata_get) ctx->klass->input_panel_imdata_get(ctx, data, len); } -EAPI void +EAPI void ecore_imf_context_input_panel_use_effect_set (Ecore_IMF_Context *ctx, Eina_Bool use_effect) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1066,7 +1068,7 @@ ecore_imf_context_input_panel_use_effect_set (Ecore_IMF_Context *ctx, Eina_Bool ctx->use_effect = use_effect; } -EAPI Eina_Bool +EAPI Eina_Bool ecore_imf_context_input_panel_use_effect_get (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1078,7 +1080,7 @@ ecore_imf_context_input_panel_use_effect_get (Ecore_IMF_Context *ctx) return ctx->use_effect; } -EAPI void +EAPI void ecore_imf_context_input_panel_geometry_get (Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1090,9 +1092,13 @@ ecore_imf_context_input_panel_geometry_get (Ecore_IMF_Context *ctx, int *x, int if (ctx->klass->input_panel_geometry_get) ctx->klass->input_panel_geometry_get(ctx, x, y, w, h); } -EAPI void +EAPI void ecore_imf_context_input_panel_private_key_set (Ecore_IMF_Context *ctx, int layout_index, int key_index, const char *img_path, const char* label, int key_value, const char* key_string) { + Private_Key_Item *key_item; + Eina_List *l; + Eina_Bool exist = EINA_FALSE; + if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_private_key_set"); @@ -1105,21 +1111,18 @@ ecore_imf_context_input_panel_private_key_set (Ecore_IMF_Context *ctx, int layou return; } - Private_Key_Item *key_item; - Eina_List *l; - Eina_Bool exist = EINA_FALSE; - EINA_LIST_FOREACH(ctx->private_key_list, l, key_item) { - if (key_item && key_item->layout_idx == layout_index && key_item->key_idx == key_index) + if (key_item && key_item->layout_idx == layout_index && + key_item->key_idx == key_index) { // if exist in the list - exist = EINA_TRUE; + exist = EINA_TRUE; if (label) { key_item->type = 0; strcpy(key_item->data, label); - } + } else { key_item->type = 1; @@ -1141,7 +1144,7 @@ ecore_imf_context_input_panel_private_key_set (Ecore_IMF_Context *ctx, int layou { key_item->type = 0; strcpy(key_item->data, label); - } + } else { key_item->type = 1; @@ -1165,8 +1168,8 @@ ecore_imf_context_input_panel_private_key_list_get (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_private_key_list_get"); - return NULL; + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_private_key_list_get"); + return NULL; } return ctx->private_key_list; @@ -1175,16 +1178,16 @@ ecore_imf_context_input_panel_private_key_list_get (Ecore_IMF_Context *ctx) EAPI void ecore_imf_context_input_panel_key_disabled_set (Ecore_IMF_Context *ctx, int layout_index, int key_index, Eina_Bool disabled) { + Disable_Key_Item *key_item; + Eina_List *l; + Eina_Bool exist = EINA_FALSE; + if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_key_disabled_set"); return; } - Disable_Key_Item *key_item; - Eina_List *l; - Eina_Bool exist = EINA_FALSE; - EINA_LIST_FOREACH(ctx->disabled_key_list, l, key_item) { if (key_item && key_item->layout_idx == layout_index && key_item->key_idx == key_index) @@ -1212,10 +1215,10 @@ ecore_imf_context_input_panel_key_disabled_set (Ecore_IMF_Context *ctx, int layo EAPI Eina_List * ecore_imf_context_input_panel_key_disabled_list_get (Ecore_IMF_Context *ctx) { - return ctx->disabled_key_list; + return ctx->disabled_key_list; } -EAPI void +EAPI void ecore_imf_context_input_panel_layout_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Layout layout) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1246,7 +1249,7 @@ ecore_imf_context_input_panel_layout_get (Ecore_IMF_Context *ctx) return ECORE_IMF_INPUT_PANEL_LAYOUT_INVALID; } -EAPI void +EAPI void ecore_imf_context_input_panel_reset (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1258,7 +1261,7 @@ ecore_imf_context_input_panel_reset (Ecore_IMF_Context *ctx) if (ctx->klass->input_panel_reset) ctx->klass->input_panel_reset(ctx); } -EAPI void +EAPI void ecore_imf_context_input_panel_orient_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Orient orientation) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1271,7 +1274,7 @@ ecore_imf_context_input_panel_orient_set (Ecore_IMF_Context *ctx, Ecore_IMF_Inpu ctx->input_panel_orient = orientation; } -EAPI Ecore_IMF_Input_Panel_Orient +EAPI Ecore_IMF_Input_Panel_Orient ecore_imf_context_input_panel_orient_get (Ecore_IMF_Context *ctx) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) @@ -1309,6 +1312,7 @@ ecore_imf_context_ise_set_active_ise_by_name (Ecore_IMF_Context *ctx, const char ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_ise_set_active_ise_by_name"); return; } + if (!name) { printf ("input parameters error!!! \n"); @@ -1326,6 +1330,7 @@ ecore_imf_context_ise_set_active_ise_by_uuid (Ecore_IMF_Context *ctx, const char ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_ise_set_active_ise_by_uuid"); return; } + if (!uuid) { printf ("input parameters error!!! \n"); @@ -1335,48 +1340,44 @@ ecore_imf_context_ise_set_active_ise_by_uuid (Ecore_IMF_Context *ctx, const char if (ctx->klass->ise_set_active_ise_by_uuid) ctx->klass->ise_set_active_ise_by_uuid(ctx, uuid); } -EAPI int +EAPI int ecore_imf_context_ise_get_iselist (Ecore_IMF_Context *ctx, char*** iselist) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_ise_get_iselist"); - return -1; - } + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_ise_get_iselist"); + return -1; + } if (ctx->klass->ise_get_iselist) - { - return ctx->klass->ise_get_iselist(ctx, iselist); - } + return ctx->klass->ise_get_iselist(ctx, iselist); else - return -1; + return -1; } -EAPI Ecore_IMF_Input_Panel_State +EAPI Ecore_IMF_Input_Panel_State ecore_imf_context_input_panel_state_get (Ecore_IMF_Context *ctx) { Ecore_IMF_Input_Panel_State state = ECORE_IMF_INPUT_PANEL_STATE_INVALID; if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_state_get"); - return ECORE_IMF_INPUT_PANEL_STATE_INVALID; + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_state_get"); + return ECORE_IMF_INPUT_PANEL_STATE_INVALID; } if (ctx->klass->input_panel_state_get) - { - state = ctx->klass->input_panel_state_get(ctx); - } - + state = ctx->klass->input_panel_state_get(ctx); + return state; } -EAPI void +EAPI void ecore_imf_context_input_panel_event_callback_add (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Event type, void (*pEventCallBackFunc) (void *data, Ecore_IMF_Context *ctx, int value), const void *data) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_event_callback_add"); - return; + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_event_callback_add"); + return; } if (ctx->klass->input_panel_event_callback_add) @@ -1390,8 +1391,8 @@ ecore_imf_context_input_panel_event_callback_del (Ecore_IMF_Context *ctx, Ecore_ { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_event_callback_del"); - return; + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_event_callback_del"); + return; } if (ctx->klass->input_panel_event_callback_del) @@ -1400,13 +1401,13 @@ ecore_imf_context_input_panel_event_callback_del (Ecore_IMF_Context *ctx, Ecore_ } } -EAPI void +EAPI void ecore_imf_context_input_panel_move (Ecore_IMF_Context *ctx, int x, int y) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_move"); - return; + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_move"); + return; } if (ctx->klass->input_panel_move) ctx->klass->input_panel_move(ctx, x, y); @@ -1414,13 +1415,13 @@ ecore_imf_context_input_panel_move (Ecore_IMF_Context *ctx, int x, int y) ctx->input_panel_y = y; } -EAPI void +EAPI void ecore_imf_context_input_panel_caps_mode_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_Panel_Caps_Mode mode) { if (!ECORE_MAGIC_CHECK(ctx, ECORE_MAGIC_CONTEXT)) { - ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_caps_mode_set"); - return; + ECORE_MAGIC_FAIL(ctx, ECORE_MAGIC_CONTEXT,"ecore_imf_context_input_panel_caps_mode_set"); + return; } if (ctx->klass->input_panel_caps_mode_set) ctx->klass->input_panel_caps_mode_set(ctx, mode); diff --git a/src/lib/ecore_imf_evas/Makefile.am b/src/lib/ecore_imf_evas/Makefile.am index 37d9a8f..fa5c491 100644 --- a/src/lib/ecore_imf_evas/Makefile.am +++ b/src/lib/ecore_imf_evas/Makefile.am @@ -1,6 +1,5 @@ MAINTAINERCLEANFILES = Makefile.in -if BUILD_ECORE_IMF_EVAS AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/ecore \ -I$(top_srcdir)/src/lib/ecore_imf \ @@ -21,4 +20,3 @@ $(top_builddir)/src/lib/ecore_imf/libecore_imf.la \ @EINA_LIBS@ libecore_imf_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif diff --git a/src/lib/ecore_input/Makefile.am b/src/lib/ecore_input/Makefile.am index f9ff7c8..427dc1a 100644 --- a/src/lib/ecore_input/Makefile.am +++ b/src/lib/ecore_input/Makefile.am @@ -7,8 +7,6 @@ AM_CPPFLAGS = \ @EINA_CFLAGS@ \ @EVIL_CFLAGS@ -if BUILD_ECORE_INPUT - lib_LTLIBRARIES = libecore_input.la includes_HEADERS = Ecore_Input.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -23,6 +21,4 @@ $(top_builddir)/src/lib/ecore/libecore.la \ libecore_input_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_input_private.h diff --git a/src/lib/ecore_input_evas/Makefile.am b/src/lib/ecore_input_evas/Makefile.am index 4749ec9..9019bc9 100644 --- a/src/lib/ecore_input_evas/Makefile.am +++ b/src/lib/ecore_input_evas/Makefile.am @@ -10,8 +10,6 @@ AM_CPPFLAGS = \ @EINA_CFLAGS@ \ @EVIL_CFLAGS@ -if BUILD_ECORE_INPUT_EVAS - lib_LTLIBRARIES = libecore_input_evas.la includes_HEADERS = Ecore_Input_Evas.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -28,6 +26,4 @@ $(top_builddir)/src/lib/ecore_input/libecore_input.la \ libecore_input_evas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_input_evas_private.h diff --git a/src/lib/ecore_input_evas/ecore_input_evas.c b/src/lib/ecore_input_evas/ecore_input_evas.c index 174d540..4de8b1d 100644 --- a/src/lib/ecore_input_evas/ecore_input_evas.c +++ b/src/lib/ecore_input_evas/ecore_input_evas.c @@ -132,7 +132,7 @@ _ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press) { Ecore_Input_Window *lookup; - lookup = _ecore_event_window_match(e->window); + lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_RENEW; ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers); if (press == ECORE_DOWN) @@ -148,7 +148,7 @@ _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press pr Ecore_Input_Window *lookup; Evas_Button_Flags flags = EVAS_BUTTON_NONE; - lookup = _ecore_event_window_match(e->window); + lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_RENEW; if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK; if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK; @@ -177,7 +177,7 @@ ecore_event_evas_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *ev Ecore_Input_Window *lookup; e = event; - lookup = _ecore_event_window_match(e->window); + lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_RENEW; if (e->multi.device == 0) { @@ -208,7 +208,7 @@ _ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io) { Ecore_Input_Window *lookup; - lookup = _ecore_event_window_match(e->window); + lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_RENEW; ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers); switch (io) @@ -246,7 +246,7 @@ ecore_event_evas_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *e Ecore_Input_Window *lookup; e = event; - lookup = _ecore_event_window_match(e->window); + lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_RENEW; ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers); evas_event_feed_mouse_wheel(lookup->evas, e->direction, e->z, e->timestamp, NULL); diff --git a/src/lib/ecore_ipc/Makefile.am b/src/lib/ecore_ipc/Makefile.am index 0ed48c8..03b392d 100644 --- a/src/lib/ecore_ipc/Makefile.am +++ b/src/lib/ecore_ipc/Makefile.am @@ -9,8 +9,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/ecore_ipc \ @SSL_CFLAGS@ @EINA_CFLAGS@ -if BUILD_ECORE_IPC - lib_LTLIBRARIES = libecore_ipc.la includes_HEADERS = Ecore_Ipc.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -26,6 +24,4 @@ $(top_builddir)/src/lib/ecore_con/libecore_con.la \ libecore_ipc_la_LDFLAGS = -no-undefined -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_ipc_private.h diff --git a/src/lib/ecore_sdl/Makefile.am b/src/lib/ecore_sdl/Makefile.am index 3948bc4..27210bb 100644 --- a/src/lib/ecore_sdl/Makefile.am +++ b/src/lib/ecore_sdl/Makefile.am @@ -12,8 +12,6 @@ AM_CPPFLAGS = \ @EVAS_CFLAGS@ \ @EINA_CFLAGS@ -if BUILD_ECORE_SDL - lib_LTLIBRARIES = libecore_sdl.la includes_HEADERS = Ecore_Sdl.h includesdir = $(includedir)/ecore-@VMAJ@ @@ -28,6 +26,4 @@ $(top_builddir)/src/lib/ecore_input/libecore_input.la \ libecore_sdl_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = Ecore_Sdl_Keys.h ecore_sdl_private.h diff --git a/src/lib/ecore_sdl/ecore_sdl.c b/src/lib/ecore_sdl/ecore_sdl.c index 89984aa..a19db4a 100644 --- a/src/lib/ecore_sdl/ecore_sdl.c +++ b/src/lib/ecore_sdl/ecore_sdl.c @@ -133,6 +133,7 @@ _ecore_sdl_event_key(SDL_Event *event, double time) ev->timestamp = time; ev->window = 0; + ev->event_window = 0; ev->modifiers = _ecore_sdl_event_modifiers(SDL_GetModState()); ev->key = NULL; ev->compose = NULL; @@ -170,6 +171,7 @@ ecore_sdl_feed_events(void) ev->timestamp = time; ev->window = 0; + ev->event_window = 0; ev->modifiers = 0; /* FIXME: keep modifier around. */ ev->x = event.motion.x; ev->y = event.motion.y; @@ -191,6 +193,7 @@ ecore_sdl_feed_events(void) ev->timestamp = time; ev->window = 0; + ev->event_window = 0; ev->modifiers = 0; /* FIXME: keep modifier around. */ ev->direction = 0; ev->z = event.button.button == SDL_BUTTON_WHEELDOWN ? -1 : 1; @@ -206,6 +209,7 @@ ecore_sdl_feed_events(void) ev->timestamp = time; ev->window = 0; + ev->event_window = 0; ev->modifiers = 0; /* FIXME: keep modifier around. */ ev->buttons = event.button.button; ev->double_click = 0; @@ -223,6 +227,7 @@ ecore_sdl_feed_events(void) if (!ev) return ; ev->timestamp = time; ev->window = 0; + ev->event_window = 0; ev->modifiers = 0; /* FIXME: keep modifier around. */ ev->buttons = event.button.button; ev->double_click = 0; diff --git a/src/lib/ecore_win32/Makefile.am b/src/lib/ecore_win32/Makefile.am index 2f4ced9..ce317c7 100644 --- a/src/lib/ecore_win32/Makefile.am +++ b/src/lib/ecore_win32/Makefile.am @@ -9,9 +9,6 @@ AM_CPPFLAGS = \ @EINA_CFLAGS@ \ @WIN32_CPPFLAGS@ - -if BUILD_ECORE_WIN32 - lib_LTLIBRARIES = libecore_win32.la includes_HEADERS = Ecore_Win32.h @@ -37,8 +34,6 @@ $(top_builddir)/src/lib/ecore_input/libecore_input.la \ libecore_win32_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = \ ecore_win32_private.h \ ecore_win32_dnd_enumformatetc.h \ diff --git a/src/lib/ecore_win32/ecore_win32.c b/src/lib/ecore_win32/ecore_win32.c index 0726234..7734f48 100644 --- a/src/lib/ecore_win32/ecore_win32.c +++ b/src/lib/ecore_win32/ecore_win32.c @@ -35,6 +35,8 @@ DEFINE_OLEGUID(IID_IDropSource, 0x00000121L, 0, 0); DEFINE_OLEGUID(IID_IDropTarget, 0x00000122L, 0, 0); DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0); +#define IDI_ICON 101 + static int _ecore_win32_init_count = 0; LRESULT CALLBACK @@ -260,6 +262,35 @@ int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = 0; * Ecore_Win32 is a library that wraps Windows graphic functions * and integrate them nicely into the Ecore main loop. * + * @section Ecore_Win32_Sec_Init Initialisation / Shutdown + * + * To fill... + * + * @section Ecore_Win32_Sec_Icons How to set icons to an application + * + * It is possible to also sets the icon of the application easily: + * + * @li Create an icon with your favorite image creator. The Gimp is a + * good choice. Create several images of size 16, 32 and 48. You can + * also create images of size 24, 64, 128 and 256. Paste all of them + * in the image of size 16 as a layer. Save the image of size 16 with + * the name my_icon.ico. Put it where the source code of the + * application is located. + * @li Create my_icon_rc.rc file with your code editor and add in it: + * @code + * 101 ICON DISCARDABLE "my_icon.ico" + * @endcode + * @li With Visual Studio, put that file in the 'Resource file' part + * of the project. + * @li With MinGW, you have to compile it with windres: + * @code + * windres my_icon_rc.rc my_icon_rc.o + * @endcode + * and add my_icon_rc.o to the object files of the application. + * + * @note The value 101 must not be changed, it's the ID used + * internally by Ecore_Win32 to get the icons. + * * @{ */ @@ -278,7 +309,9 @@ int ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST = 0; EAPI int ecore_win32_init() { - WNDCLASS wc; + WNDCLASSEX wc; + HICON icon; + HICON icon_sm; if (++_ecore_win32_init_count != 1) return _ecore_win32_init_count; @@ -307,19 +340,38 @@ ecore_win32_init() goto shutdown_ecore_event; } - memset (&wc, 0, sizeof (WNDCLASS)); + icon = LoadImage(_ecore_win32_instance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), + LR_DEFAULTCOLOR); + icon_sm = LoadImage(_ecore_win32_instance, + MAKEINTRESOURCE(IDI_ICON), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_DEFAULTCOLOR); + if (!icon) + icon = LoadIcon (NULL, IDI_APPLICATION); + if (!icon_sm) + icon_sm = LoadIcon (NULL, IDI_APPLICATION); + + memset (&wc, 0, sizeof (WNDCLASSEX)); + wc.cbSize = sizeof (WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = _ecore_win32_window_procedure; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = _ecore_win32_instance; - wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); + wc.hIcon = icon; wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); wc.lpszMenuName = NULL; wc.lpszClassName = ECORE_WIN32_WINDOW_CLASS; + wc.hIconSm = icon_sm; - if(!RegisterClass(&wc)) + if(!RegisterClassEx(&wc)) { ERR("RegisterClass() failed"); goto free_library; diff --git a/src/lib/ecore_win32/ecore_win32_dnd.c b/src/lib/ecore_win32/ecore_win32_dnd.c index a8eaf9c..7ac1083 100755 --- a/src/lib/ecore_win32/ecore_win32_dnd.c +++ b/src/lib/ecore_win32/ecore_win32_dnd.c @@ -43,9 +43,6 @@ static HANDLE DataToHandle(const char *data, int size) /** * @addtogroup Ecore_Win32_Group Ecore_Win32 library * - * Ecore_Win32 is a library that wraps Windows CE graphic functions - * and integrate them nicely into the Ecore main loop. - * * @{ */ diff --git a/src/lib/ecore_win32/ecore_win32_event.c b/src/lib/ecore_win32/ecore_win32_event.c index c133ead..b6e2472 100644 --- a/src/lib/ecore_win32/ecore_win32_event.c +++ b/src/lib/ecore_win32/ecore_win32_event.c @@ -56,7 +56,7 @@ _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, INF("key pressed"); - e = (Ecore_Event_Key *)malloc(sizeof(Ecore_Event_Key)); + e = (Ecore_Event_Key *)calloc(1, sizeof(Ecore_Event_Key)); if (!e) return; if (is_keystroke) @@ -91,6 +91,7 @@ _ecore_win32_event_handle_key_press(Ecore_Win32_Callback_Data *msg, free(e); return; } + e->event_window = e->window; e->timestamp = msg->time; _ecore_win32_event_last_time = e->timestamp; @@ -141,6 +142,7 @@ _ecore_win32_event_handle_key_release(Ecore_Win32_Callback_Data *msg, free(e); return; } + e->event_window = e->window; e->timestamp = msg->time; _ecore_win32_event_last_time = e->timestamp; @@ -166,6 +168,7 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->direction = 0; /* wheel delta is positive or negative, never 0 */ e->z = GET_WHEEL_DELTA_WPARAM(msg->window_param) > 0 ? -1 : 1; @@ -187,6 +190,7 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->x = GET_X_LPARAM(msg->data_param); e->y = GET_Y_LPARAM(msg->data_param); e->timestamp = msg->time; @@ -212,6 +216,7 @@ _ecore_win32_event_handle_button_press(Ecore_Win32_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->buttons = button; e->x = GET_X_LPARAM(msg->data_param); e->y = GET_Y_LPARAM(msg->data_param); @@ -267,6 +272,7 @@ _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->x = GET_X_LPARAM(msg->data_param); e->y = GET_Y_LPARAM(msg->data_param); e->timestamp = msg->time; @@ -284,6 +290,7 @@ _ecore_win32_event_handle_button_release(Ecore_Win32_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->buttons = button; e->x = GET_X_LPARAM(msg->data_param); e->y = GET_Y_LPARAM(msg->data_param); @@ -320,6 +327,7 @@ _ecore_win32_event_handle_motion_notify(Ecore_Win32_Callback_Data *msg) if (!e) return; e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA); + e->event_window = e->window; e->x = GET_X_LPARAM(msg->data_param); e->y = GET_Y_LPARAM(msg->data_param); e->timestamp = msg->time; @@ -339,6 +347,7 @@ _ecore_win32_event_handle_enter_notify(Ecore_Win32_Callback_Data *msg) if (!e) return; e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA); + e->event_window = e->window; e->x = msg->x; e->y = msg->y; e->timestamp = msg->time; @@ -378,6 +387,7 @@ _ecore_win32_event_handle_leave_notify(Ecore_Win32_Callback_Data *msg) if (!e) return; e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA); + e->event_window = e->window; e->x = msg->x; e->y = msg->y; e->timestamp = msg->time; diff --git a/src/lib/ecore_wince/Makefile.am b/src/lib/ecore_wince/Makefile.am index f349763..a264ffb 100644 --- a/src/lib/ecore_wince/Makefile.am +++ b/src/lib/ecore_wince/Makefile.am @@ -12,9 +12,6 @@ AM_CPPFLAGS = \ AM_CFLAGS = @WIN32_CFLAGS@ - -if BUILD_ECORE_WINCE - lib_LTLIBRARIES = libecore_wince.la includes_HEADERS = Ecore_WinCE.h @@ -35,6 +32,4 @@ $(top_builddir)/src/lib/ecore/libecore.la \ libecore_wince_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -endif - EXTRA_DIST = ecore_wince_private.h diff --git a/src/lib/ecore_wince/ecore_wince_event.c b/src/lib/ecore_wince/ecore_wince_event.c index e2599d9..5193fa0 100644 --- a/src/lib/ecore_wince/ecore_wince_event.c +++ b/src/lib/ecore_wince/ecore_wince_event.c @@ -406,6 +406,7 @@ _ecore_wince_event_handle_key_press(Ecore_WinCE_Callback_Data *msg, } e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA); + e->event_window = e->window; if (!e->window) { free(e); @@ -453,6 +454,7 @@ _ecore_wince_event_handle_key_release(Ecore_WinCE_Callback_Data *msg, } e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA); + e->event_window = e->window; if (!e->window) { free(e); @@ -482,6 +484,7 @@ _ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->x = LOWORD(msg->data_param); e->y = HIWORD(msg->data_param); e->timestamp = msg->time; @@ -507,6 +510,7 @@ _ecore_wince_event_handle_button_press(Ecore_WinCE_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->buttons = button; e->x = LOWORD(msg->data_param); e->y = HIWORD(msg->data_param); @@ -561,6 +565,7 @@ _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->x = LOWORD(msg->data_param); e->y = HIWORD(msg->data_param); e->timestamp = msg->time; @@ -578,6 +583,7 @@ _ecore_wince_event_handle_button_release(Ecore_WinCE_Callback_Data *msg, if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->buttons = button; e->x = LOWORD(msg->data_param); e->y = HIWORD(msg->data_param); @@ -614,6 +620,7 @@ _ecore_wince_event_handle_motion_notify(Ecore_WinCE_Callback_Data *msg) if (!e) return; e->window = (Ecore_Window)GetWindowLong(msg->window, GWL_USERDATA); + e->event_window = e->window; e->x = LOWORD(msg->data_param); e->y = HIWORD(msg->data_param); e->timestamp = msg->time; @@ -637,6 +644,7 @@ _ecore_wince_event_handle_enter_notify(Ecore_WinCE_Callback_Data *msg) if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->x = msg->x; e->y = msg->y; e->timestamp = msg->time; @@ -680,6 +688,7 @@ _ecore_wince_event_handle_leave_notify(Ecore_WinCE_Callback_Data *msg) if (!e) return; e->window = (Ecore_Window)window; + e->event_window = e->window; e->x = msg->x; e->y = msg->y; e->timestamp = msg->time; diff --git a/src/lib/ecore_x/Ecore_X.h b/src/lib/ecore_x/Ecore_X.h index f3697df..14db3d1 100644 --- a/src/lib/ecore_x/Ecore_X.h +++ b/src/lib/ecore_x/Ecore_X.h @@ -604,7 +604,6 @@ struct _Ecore_X_Selection_Data unsigned char *data; int length; int format; - int (*free)(void *data); }; diff --git a/src/lib/ecore_x/Makefile.am b/src/lib/ecore_x/Makefile.am index c3a5d96..b14fc7d 100644 --- a/src/lib/ecore_x/Makefile.am +++ b/src/lib/ecore_x/Makefile.am @@ -1,7 +1,5 @@ MAINTAINERCLEANFILES = Makefile.in -if BUILD_ECORE_X - SUBDIRS = xlib xcb if BUILD_ECORE_X_XCB @@ -29,6 +27,4 @@ Ecore_X_Atoms.h \ Ecore_X_Cursor.h includesdir = $(includedir)/ecore-@VMAJ@ -endif - EXTRA_DIST = ecore_x_atoms_decl.h diff --git a/src/lib/ecore_x/xcb/ecore_xcb.c b/src/lib/ecore_x/xcb/ecore_xcb.c index 8a2ef77..a0519f8 100644 --- a/src/lib/ecore_x/xcb/ecore_xcb.c +++ b/src/lib/ecore_x/xcb/ecore_xcb.c @@ -90,6 +90,7 @@ EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0; EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0; EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0; EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0; +EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0; EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0; EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0; EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0; @@ -102,16 +103,6 @@ EAPI int ECORE_X_EVENT_SCREEN_CHANGE = 0; EAPI int ECORE_X_EVENT_DAMAGE_NOTIFY = 0; EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0; -/* - EAPI int ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE = 0; - */ EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0; EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0; @@ -532,6 +523,7 @@ ecore_x_init(const char *name) ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new(); + ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new(); ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new(); ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new(); ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new(); @@ -544,17 +536,6 @@ ecore_x_init(const char *name) ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new(); - /* - ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE = ecore_event_type_new(); - */ - ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_STATE_REQUEST = ecore_event_type_new(); diff --git a/src/lib/ecore_x/xcb/ecore_xcb_events.c b/src/lib/ecore_x/xcb/ecore_xcb_events.c index 82055e0..0f39591 100644 --- a/src/lib/ecore_x/xcb/ecore_xcb_events.c +++ b/src/lib/ecore_x/xcb/ecore_xcb_events.c @@ -20,15 +20,6 @@ #define CODESET "INVALID" #endif /* ifndef CODESET */ -#if 0 -static void _ecore_x_event_free_window_prop_name_class_change(void *data, void *ev); -static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev); -static void _ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev); -static void _ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev); -static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev); -static void _ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev); -#endif /* if 0 */ - static Ecore_X_Window _ecore_xcb_mouse_down_last_window = 0; static Ecore_X_Window _ecore_xcb_mouse_down_last_last_window = 0; static Ecore_X_Window _ecore_xcb_mouse_down_last_event_window = 0; @@ -99,84 +90,6 @@ ecore_x_event_mask_unset(Ecore_X_Window window, free(reply); } /* ecore_x_event_mask_unset */ -#if 0 -static void -_ecore_x_event_free_window_prop_name_class_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Name_Class_Change *e; - - e = ev; - if (e->name) - free(e->name); - - if (e->clas) - free(e->clas); - - free(e); -} /* _ecore_x_event_free_window_prop_name_class_change */ - -static void -_ecore_x_event_free_window_prop_title_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Title_Change *e; - - e = ev; - if (e->title) - free(e->title); - - free(e); -} /* _ecore_x_event_free_window_prop_title_change */ - -static void -_ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Visible_Title_Change *e; - - e = ev; - if (e->title) - free(e->title); - - free(e); -} /* _ecore_x_event_free_window_prop_visible_title_change */ - -static void -_ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Icon_Name_Change *e; - - e = ev; - if (e->name) - free(e->name); - - free(e); -} /* _ecore_x_event_free_window_prop_icon_name_change */ - -static void -_ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e; - - e = ev; - if (e->name) - free(e->name); - - free(e); -} /* _ecore_x_event_free_window_prop_visible_icon_name_change */ - -static void -_ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Client_Machine_Change *e; - - e = ev; - if (e->name) - free(e->name); - - free(e); -} /* _ecore_x_event_free_window_prop_client_machine_change */ - -#endif /* if 0 */ - static void _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev) { @@ -1377,114 +1290,6 @@ _ecore_x_event_handle_circulate_request(xcb_generic_event_t *event) void _ecore_x_event_handle_property_notify(xcb_generic_event_t *event) { -#if 0 /* for now i disabled this. nice idea though this is - it leaves a lot - * to be desired for efficiency that is better left to the app layer - */ - if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS) - { - Ecore_X_Event_Window_Prop_Name_Class_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change)); - if (!e) - return; - - ecore_x_window_prop_name_class_get(xevent->xproperty.window, - &(e->name), &(e->clas)); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e, _ecore_x_event_free_window_prop_name_class_change, NULL); - } - else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME)) - { - Ecore_X_Event_Window_Prop_Title_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change)); - if (!e) - return; - - e->title = ecore_x_window_prop_title_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_title_change, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME) - { - Ecore_X_Event_Window_Prop_Visible_Title_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change)); - if (!e) - return; - - e->title = ecore_x_window_prop_visible_title_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE, e, _ecore_x_event_free_window_prop_visible_title_change, NULL); - } - else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) || (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME)) - { - Ecore_X_Event_Window_Prop_Icon_Name_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change)); - if (!e) - return; - - e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_icon_name_change, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME) - { - Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change)); - if (!e) - return; - - e->name = ecore_x_window_prop_visible_icon_name_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE, e, _ecore_x_event_free_window_prop_visible_icon_name_change, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE) - { - Ecore_X_Event_Window_Prop_Client_Machine_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change)); - if (!e) - return; - - e->name = ecore_x_window_prop_client_machine_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE, e, _ecore_x_event_free_window_prop_client_machine_change, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID) - { - Ecore_X_Event_Window_Prop_Pid_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change)); - if (!e) - return; - - e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP) - { - Ecore_X_Event_Window_Prop_Desktop_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change)); - if (!e) - return; - - e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window); - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL); - } - else -#endif /* if 0 */ { xcb_property_notify_event_t *ev; Ecore_X_Event_Window_Property *e; diff --git a/src/lib/ecore_x/xlib/ecore_x.c b/src/lib/ecore_x/xlib/ecore_x.c index fb00931..9426f41 100644 --- a/src/lib/ecore_x/xlib/ecore_x.c +++ b/src/lib/ecore_x/xlib/ecore_x.c @@ -89,6 +89,7 @@ EAPI int ECORE_X_EVENT_WINDOW_STACK_REQUEST = 0; EAPI int ECORE_X_EVENT_WINDOW_PROPERTY = 0; EAPI int ECORE_X_EVENT_WINDOW_COLORMAP = 0; EAPI int ECORE_X_EVENT_WINDOW_MAPPING = 0; +EAPI int ECORE_X_EVENT_MAPPING_CHANGE = 0; EAPI int ECORE_X_EVENT_SELECTION_CLEAR = 0; EAPI int ECORE_X_EVENT_SELECTION_REQUEST = 0; EAPI int ECORE_X_EVENT_SELECTION_NOTIFY = 0; @@ -103,17 +104,6 @@ EAPI int ECORE_X_EVENT_RANDR_CRTC_CHANGE = 0; EAPI int ECORE_X_EVENT_RANDR_OUTPUT_CHANGE = 0; EAPI int ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY = 0; EAPI int ECORE_X_EVENT_WINDOW_DELETE_REQUEST = 0; -/* - EAPI int ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE = 0; - EAPI int ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE = 0; - */ - EAPI int ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = 0; EAPI int ECORE_X_EVENT_WINDOW_STATE_REQUEST = 0; EAPI int ECORE_X_EVENT_FRAME_EXTENTS_REQUEST = 0; @@ -467,6 +457,7 @@ ecore_x_init(const char *name) ECORE_X_EVENT_WINDOW_PROPERTY = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_COLORMAP = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_MAPPING = ecore_event_type_new(); + ECORE_X_EVENT_MAPPING_CHANGE = ecore_event_type_new(); ECORE_X_EVENT_SELECTION_CLEAR = ecore_event_type_new(); ECORE_X_EVENT_SELECTION_REQUEST = ecore_event_type_new(); ECORE_X_EVENT_SELECTION_NOTIFY = ecore_event_type_new(); @@ -482,16 +473,6 @@ ecore_x_init(const char *name) ECORE_X_EVENT_DAMAGE_NOTIFY = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_DELETE_REQUEST = ecore_event_type_new(); - /* - ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE = ecore_event_type_new(); - ECORE_X_EVENT_WINDOW_PROP_DESKTOP_CHANGE = ecore_event_type_new(); - */ ECORE_X_EVENT_DESKTOP_CHANGE = ecore_event_type_new(); ECORE_X_EVENT_WINDOW_MOVE_RESIZE_REQUEST = ecore_event_type_new(); diff --git a/src/lib/ecore_x/xlib/ecore_x_events.c b/src/lib/ecore_x/xlib/ecore_x_events.c index 43421c4..7368602 100644 --- a/src/lib/ecore_x/xlib/ecore_x_events.c +++ b/src/lib/ecore_x/xlib/ecore_x_events.c @@ -22,20 +22,6 @@ #define CODESET "INVALID" #endif /* ifndef CODESET */ -#if 0 -static void _ecore_x_event_free_window_prop_name_class_change(void *data, - void *ev); -static void _ecore_x_event_free_window_prop_title_change(void *data, void *ev); -static void _ecore_x_event_free_window_prop_visible_title_change(void *data, - void *ev); -static void _ecore_x_event_free_window_prop_icon_name_change(void *data, - void *ev); -static void _ecore_x_event_free_window_prop_visible_icon_name_change(void *data, - void *ev); -static void _ecore_x_event_free_window_prop_client_machine_change(void *data, - void *ev); -#endif /* if 0 */ - static Window _ecore_x_mouse_down_last_win = 0; static Window _ecore_x_mouse_down_last_last_win = 0; static Window _ecore_x_mouse_down_last_event_win = 0; @@ -95,84 +81,6 @@ ecore_x_event_mask_unset(Ecore_X_Window w, Ecore_X_Event_Mask mask) XChangeWindowAttributes(_ecore_x_disp, w, CWEventMask, &s_attr); } /* ecore_x_event_mask_unset */ -#if 0 -static void -_ecore_x_event_free_window_prop_name_class_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Name_Class_Change *e; - - e = ev; - if (e->name) - free(e->name); - - if (e->clas) - free(e->clas); - - free(e); -} /* _ecore_x_event_free_window_prop_name_class_change */ - -static void -_ecore_x_event_free_window_prop_title_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Title_Change *e; - - e = ev; - if (e->title) - free(e->title); - - free(e); -} /* _ecore_x_event_free_window_prop_title_change */ - -static void -_ecore_x_event_free_window_prop_visible_title_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Visible_Title_Change *e; - - e = ev; - if (e->title) - free(e->title); - - free(e); -} /* _ecore_x_event_free_window_prop_visible_title_change */ - -static void -_ecore_x_event_free_window_prop_icon_name_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Icon_Name_Change *e; - - e = ev; - if (e->name) - free(e->name); - - free(e); -} /* _ecore_x_event_free_window_prop_icon_name_change */ - -static void -_ecore_x_event_free_window_prop_visible_icon_name_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e; - - e = ev; - if (e->name) - free(e->name); - - free(e); -} /* _ecore_x_event_free_window_prop_visible_icon_name_change */ - -static void -_ecore_x_event_free_window_prop_client_machine_change(void *data, void *ev) -{ - Ecore_X_Event_Window_Prop_Client_Machine_Change *e; - - e = ev; - if (e->name) - free(e->name); - - free(e); -} /* _ecore_x_event_free_window_prop_client_machine_change */ - -#endif /* if 0 */ - static void _ecore_x_event_free_xdnd_enter(void *data __UNUSED__, void *ev) { @@ -1376,132 +1284,6 @@ void _ecore_x_event_handle_property_notify(XEvent *xevent) { _ecore_x_last_event_mouse_move = 0; -#if 0 /* for now i disabled this. nice idea though this is - it leaves a lot - * to be desired for efficiency that is better left to the app layer - */ - if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLASS) - { - Ecore_X_Event_Window_Prop_Name_Class_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Name_Class_Change)); - if (!e) - return; - - ecore_x_window_prop_name_class_get(xevent->xproperty.window, - &(e->name), &(e->clas)); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_NAME_CLASS_CHANGE, e, - _ecore_x_event_free_window_prop_name_class_change, NULL); - } - else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_NAME) || - (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_NAME)) - { - Ecore_X_Event_Window_Prop_Title_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Title_Change)); - if (!e) - return; - - e->title = ecore_x_window_prop_title_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_TITLE_CHANGE, e, - _ecore_x_event_free_window_prop_title_change, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_NAME) - { - Ecore_X_Event_Window_Prop_Visible_Title_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Title_Change)); - if (!e) - return; - - e->title = ecore_x_window_prop_visible_title_get( - xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_VISIBLE_TITLE_CHANGE, - e, - _ecore_x_event_free_window_prop_visible_title_change, - NULL); - } - else if ((xevent->xproperty.atom == ECORE_X_ATOM_WM_ICON_NAME) || - (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_ICON_NAME)) - { - Ecore_X_Event_Window_Prop_Icon_Name_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Icon_Name_Change)); - if (!e) - return; - - e->name = ecore_x_window_prop_icon_name_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_ICON_NAME_CHANGE, e, - _ecore_x_event_free_window_prop_icon_name_change, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_VISIBLE_ICON_NAME) - { - Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Visible_Icon_Name_Change)); - if (!e) - return; - - e->name = ecore_x_window_prop_visible_icon_name_get( - xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add( - ECORE_X_EVENT_WINDOW_PROP_VISIBLE_ICON_NAME_CHANGE, - e, - _ecore_x_event_free_window_prop_visible_icon_name_change, - NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_WM_CLIENT_MACHINE) - { - Ecore_X_Event_Window_Prop_Client_Machine_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Client_Machine_Change)); - if (!e) - return; - - e->name = ecore_x_window_prop_client_machine_get( - xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_CLIENT_MACHINE_CHANGE, - e, - _ecore_x_event_free_window_prop_client_machine_change, - NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_PID) - { - Ecore_X_Event_Window_Prop_Pid_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Pid_Change)); - if (!e) - return; - - e->pid = ecore_x_window_prop_pid_get(xevent->xproperty.window); - e->time = xevent->xproperty.time; - _ecore_x_event_last_time = e->time; - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL); - } - else if (xevent->xproperty.atom == ECORE_X_ATOM_NET_WM_DESKTOP) - { - Ecore_X_Event_Window_Prop_Desktop_Change *e; - - e = calloc(1, sizeof(Ecore_X_Event_Window_Prop_Desktop_Change)); - if (!e) - return; - - e->desktop = ecore_x_window_prop_desktop_get(xevent->xproperty.window); - ecore_event_add(ECORE_X_EVENT_WINDOW_PROP_PID_CHANGE, e, NULL, NULL); - } - else -#endif /* if 0 */ { Ecore_X_Event_Window_Property *e; @@ -1691,9 +1473,9 @@ _ecore_x_event_handle_colormap_notify(XEvent *xevent) e->cmap = xevent->xcolormap.colormap; e->time = _ecore_x_event_last_time; if (xevent->xcolormap.state == ColormapInstalled) - e->installed = 1; + e->installed = EINA_TRUE; else - e->installed = 0; + e->installed = EINA_FALSE; ecore_event_add(ECORE_X_EVENT_WINDOW_COLORMAP, e, NULL, NULL); } /* _ecore_x_event_handle_colormap_notify */ @@ -1941,7 +1723,7 @@ _ecore_x_event_handle_client_message(XEvent *xevent) { Ecore_X_Event_Xdnd_Finished *e; Ecore_X_DND_Source *source; - int completed = 1; + Eina_Bool completed = EINA_TRUE; LOGFN(__FILE__, __LINE__, __FUNCTION__); source = _ecore_x_dnd_source_get(); @@ -1959,7 +1741,7 @@ _ecore_x_event_handle_client_message(XEvent *xevent) } else if (source->version >= 5) { - completed = 0; + completed = EINA_FALSE; source->state = ECORE_X_DND_SOURCE_CONVERTING; /* FIXME: Probably need to add a timer to switch back to idle @@ -2153,8 +1935,28 @@ _ecore_x_event_handle_client_message(XEvent *xevent) void _ecore_x_event_handle_mapping_notify(XEvent *xevent) { + Ecore_X_Event_Mapping_Change *e; + _ecore_x_last_event_mouse_move = 0; XRefreshKeyboardMapping((XMappingEvent *)xevent); + e = calloc(1, sizeof(Ecore_X_Event_Mapping_Change)); + if (!e) return; + switch (xevent->xmapping.request) + { + case MappingModifier: + e->type = ECORE_X_MAPPING_MODIFIER; + break; + case MappingKeyboard: + e->type = ECORE_X_MAPPING_KEYBOARD; + break; + case MappingPointer: + default: + e->type = ECORE_X_MAPPING_MOUSE; + break; + } + e->keycode = xevent->xmapping.first_keycode; + e->num = xevent->xmapping.count; + ecore_event_add(ECORE_X_EVENT_MAPPING_CHANGE, e, NULL, NULL); } /* _ecore_x_event_handle_mapping_notify */ void @@ -2208,9 +2010,9 @@ _ecore_x_event_handle_screensaver_notify(XEvent *xevent) e->win = screensaver_event->window; if (screensaver_event->state == ScreenSaverOn) - e->on = 1; + e->on = EINA_TRUE; else - e->on = 0; + e->on = EINA_FALSE; e->time = screensaver_event->time; ecore_event_add(ECORE_X_EVENT_SCREENSAVER_NOTIFY, e, NULL, NULL); @@ -2343,7 +2145,10 @@ _ecore_x_event_handle_randr_notify_output_property(const XRRNotifyEvent *xevent) e->output = randr_event->output; e->property = randr_event->property; e->time = randr_event->timestamp; - e->state = randr_event->state; + if (randr_event->state == PropertyNewValue) + e->state = ECORE_X_RANDR_PROPERTY_CHANGE_ADD; + else + e->state = ECORE_X_RANDR_PROPERTY_CHANGE_DEL; ecore_event_add(ECORE_X_EVENT_RANDR_OUTPUT_PROPERTY_NOTIFY, e, NULL, NULL); } /* _ecore_x_event_handle_randr_notify_output_property */ diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am old mode 100755 new mode 100644 diff --git a/src/tests/ecore_suite.c b/src/tests/ecore_suite.c old mode 100755 new mode 100644 diff --git a/src/tests/ecore_suite.h b/src/tests/ecore_suite.h old mode 100755 new mode 100644 diff --git a/src/tests/ecore_test_ecore.c b/src/tests/ecore_test_ecore.c old mode 100755 new mode 100644 diff --git a/src/tests/ecore_test_ecore_x.c b/src/tests/ecore_test_ecore_x.c old mode 100755 new mode 100644