From 2c1c6b9335e38c6e52b06829a95d9b58d780c99e Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 10 Oct 2013 22:31:18 +0900 Subject: [PATCH] ecore-con: make curl support entirely runtime loaded via eina_module this makes curl support a pure runtime-only thing. libcurl is loaded by eina_module (dlopen/dlsym) when curl is actually first needed (when a url connection/object is created). this means that ecore-con has no link or compile dependencies on curl, only runtime, AND this saves memory (due to curl inits using apparently a chunk of private pages). so this saves memory and moves the dependency to runtime (though still consider libcurl a dependency of efl - but like a binary executed, it's at runtime). --- ChangeLog | 5 + NEWS | 1 + configure.ac | 17 - src/lib/ecore_con/ecore_con_private.h | 7 +- src/lib/ecore_con/ecore_con_url.c | 1074 ++++++++++++------------- 5 files changed, 520 insertions(+), 584 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0fec054967..f81b1399f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-10-10 Carsten Haitzler (The Rasterman) + + * Ecore-con: use dlopen/dlsym (eina_module) to load libcurl to + save memory (private pages) when not yet used by the process + 2013-10-10 Michael Bouchaud (yoz) * Emotion: add two events to trigger webcam plug and unplug diff --git a/NEWS b/NEWS index 173dd1b0f6..fa991926b5 100644 --- a/NEWS +++ b/NEWS @@ -223,6 +223,7 @@ Improvements: - Add iterator for walking child of smart objects, table and a box. * Ecore_Con: - Rebase dns.c against upstream + - URL support now dynamically loads libcurl at runtime via eina_module. * Edje: - Entry: cursor position and location will be passed when it's really changed in case of mouse down, move, and up event. - Entry: remove ecore_imf_context_reset in mouse up event because it's useless. diff --git a/configure.ac b/configure.ac index 77972b8997..d5a359e39c 100644 --- a/configure.ac +++ b/configure.ac @@ -1969,26 +1969,12 @@ EFL_LIB_END([Ecore]) EFL_LIB_START([Ecore_Con]) -### Additional options to configure - -AC_ARG_ENABLE([curl], - [AC_HELP_STRING([--disable-curl], [disable curl support. @<:@default=enabled@:>@])], - [ - if test "x${enableval}" = "xyes" ; then - want_curl="yes" - else - want_curl="no" - fi - ], - [want_curl="yes"]) - ### Default values want_ecore_con_local_sockets="yes" want_ecore_con_abstract_sockets="yes" if test "${have_wince}" = "yes"; then - want_curl="no" want_cares="no" want_ecore_con_local_sockets="no" want_ecore_con_abstract_sockets="no" @@ -2027,8 +2013,6 @@ EFL_INTERNAL_DEPEND_PKG([ECORE_CON], [ecore]) EFL_ADD_LIBS([ECORE_CON], [-lm]) -EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_curl}], [CURL], [libcurl]) - EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_cares}], [CARES], [libcares >= 1.6.1]) AM_CONDITIONAL([HAVE_CARES], [test "x${have_cares}" = "xyes"]) @@ -2043,7 +2027,6 @@ fi EFL_OPTIONAL_DEPEND_PKG([ECORE_CON], [${want_systemd}], [SYSTEMD], [libsystemd-daemon]) -EFL_ADD_FEATURE([ECORE_CON], [curl]) EFL_ADD_FEATURE([ECORE_CON], [cares]) EFL_ADD_FEATURE([ECORE_CON], [local-sockets], [${want_ecore_con_local_sockets}]) EFL_ADD_FEATURE([ECORE_CON], [abstract-sockets], [${want_ecore_con_abstract_sockets}]) diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index bdd7d961d6..ea9fada698 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -17,9 +17,6 @@ #elif HAVE_OPENSSL # include #endif -#ifdef HAVE_CURL -#include -#endif #define READBUFSIZ 65536 @@ -199,11 +196,10 @@ struct _Ecore_Con_Server #endif }; -#ifdef HAVE_CURL struct _Ecore_Con_Url { ECORE_MAGIC; - CURL *curl_easy; + void *curl_easy; struct curl_slist *headers; Eina_List *additional_headers; Eina_List *response_headers; @@ -226,7 +222,6 @@ struct _Ecore_Con_Url Eina_Bool dead : 1; Eina_Bool multi : 1; }; -#endif struct _Ecore_Con_Info { diff --git a/src/lib/ecore_con/ecore_con_url.c b/src/lib/ecore_con/ecore_con_url.c index f427138571..959ca94af3 100644 --- a/src/lib/ecore_con/ecore_con_url.c +++ b/src/lib/ecore_con/ecore_con_url.c @@ -30,13 +30,191 @@ #include "Ecore_Con.h" #include "ecore_con_private.h" +// all the types, defines, enums etc. from curl that we actuall USE. +// we have to add to this if we use more things from curl not already +// defined here. see culr headers to get them from +typedef enum { + CURLM_CALL_MULTI_PERFORM = -1, + CURLM_OK = 0 +} CURLMcode; +typedef enum { + CURLE_OK = 0, + CURLE_OPERATION_TIMEDOUT = 28 +} CURLcode; +#define CURLOPTTYPE_LONG 0 +#define CURLOPTTYPE_OBJECTPOINT 10000 +#define CURLOPTTYPE_FUNCTIONPOINT 20000 +#define CURLOPTTYPE_OFF_T 30000 +#define CINIT(na,t,nu) CURLOPT_ ## na = CURLOPTTYPE_ ## t + nu +typedef enum { + CINIT(FILE, OBJECTPOINT, 1), + CINIT(URL, OBJECTPOINT, 2), + CINIT(PROXY, OBJECTPOINT, 4), + CINIT(USERPWD, OBJECTPOINT, 5), + CINIT(INFILE, OBJECTPOINT, 9), + CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11), + CINIT(READFUNCTION, FUNCTIONPOINT, 12), + CINIT(POSTFIELDS, OBJECTPOINT, 15), + CINIT(HTTPHEADER, OBJECTPOINT, 23), + CINIT(WRITEHEADER, OBJECTPOINT, 29), + CINIT(COOKIEFILE, OBJECTPOINT, 31), + CINIT(TIMECONDITION, LONG, 33), + CINIT(TIMEVALUE, LONG, 34), + CINIT(CUSTOMREQUEST, OBJECTPOINT, 36), + CINIT(VERBOSE, LONG, 41), + CINIT(NOPROGRESS, LONG, 43), + CINIT(UPLOAD, LONG, 46), + CINIT(POST, LONG, 47), + CINIT(FOLLOWLOCATION, LONG, 52), + CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56), + CINIT(PROGRESSDATA, OBJECTPOINT, 57), + CINIT(POSTFIELDSIZE, LONG, 60), + CINIT(SSL_VERIFYPEER, LONG, 64), + CINIT(CAINFO, OBJECTPOINT, 65), + CINIT(CONNECTTIMEOUT, LONG, 78), + CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79), + CINIT(COOKIEJAR, OBJECTPOINT, 82), + CINIT(HTTP_VERSION, LONG, 84), + CINIT(FTP_USE_EPSV, LONG, 85), + CINIT(COOKIESESSION, LONG, 96), + CINIT(PROXYTYPE, LONG, 101), + CINIT(ACCEPT_ENCODING, OBJECTPOINT, 102), + CINIT(HTTPAUTH, LONG, 107), + CINIT(INFILESIZE_LARGE, OFF_T, 115), + CINIT(COOKIELIST, OBJECTPOINT, 135), + CINIT(USERNAME, OBJECTPOINT, 173), + CINIT(PASSWORD, OBJECTPOINT, 174) +} CURLoption; +#define CURLINFO_STRING 0x100000 +#define CURLINFO_LONG 0x200000 +#define CURLINFO_DOUBLE 0x300000 +#define CURLINFO_SLIST 0x400000 +#define CURLINFO_MASK 0x0fffff +#define CURLINFO_TYPEMASK 0xf00000 +typedef enum { + CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2, +} CURLINFO; +typedef enum { + CURLVERSION_FOURTH = 3 +} CURLversion; +typedef enum { + CURLMSG_DONE = 1 +} CURLMSG; +#undef CINIT +#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num +typedef enum { + CINIT(PIPELINING, LONG, 3) +} CURLMoption; +typedef enum { + CURL_TIMECOND_NONE = 0, + CURL_TIMECOND_IFMODSINCE = 1, + CURL_TIMECOND_IFUNMODSINCE = 2 +} curl_TimeCond; +enum { + CURL_HTTP_VERSION_1_0 = 1, + CURL_HTTP_VERSION_1_1 = 2, +}; +typedef enum { + CURLPROXY_HTTP = 0, + CURLPROXY_SOCKS4 = 4, + CURLPROXY_SOCKS5 = 5, + CURLPROXY_SOCKS4A = 6, + CURLPROXY_SOCKS5_HOSTNAME = 7 +} curl_proxytype; + +#define CURL_GLOBAL_SSL (1<<0) +#define CURL_GLOBAL_WIN32 (1<<1) +#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32) +#define CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING +#define CURLOPT_WRITEDATA CURLOPT_FILE +#define CURLOPT_READDATA CURLOPT_INFILE +#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER +#define CURLVERSION_NOW CURLVERSION_FOURTH +#define CURLAUTH_BASIC (((unsigned long)1)<<0) +#define CURLAUTH_DIGEST_IE (((unsigned long)1)<<4) +#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) +#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) +#define CURL_READFUNC_ABORT 0x10000000 + +typedef void CURLM; +typedef void CURL; +struct curl_slist { + char *data; + struct curl_slist *next; +}; +typedef struct { + CURLversion age; + const char *version; + unsigned int version_num; + const char *host; + int features; + const char *ssl_version; + long ssl_version_num; + const char *libz_version; + const char * const *protocols; + const char *ares; + int ares_num; + const char *libidn; + int iconv_ver_num; + const char *libssh_version; +} curl_version_info_data; +typedef struct { + CURLMSG msg; + CURL *easy_handle; + union { + void *whatever; + CURLcode result; + } data; +} CURLMsg; + + +typedef struct _Ecore_Con_Curl Ecore_Con_Curl; + +struct _Ecore_Con_Curl +{ + Eina_Module *mod; + + CURLM *_curlm; + + CURLcode (*curl_global_init) (long flags); + void (*curl_global_cleanup)(void); + CURLM *(*curl_multi_init)(void); + CURLMcode (*curl_multi_timeout)(CURLM *multi_handle, + long *milliseconds); + CURLMcode (*curl_multi_cleanup)(CURLM *multi_handle); + CURLMcode (*curl_multi_remove_handle)(CURLM *multi_handle, + CURL *curl_handle); + const char *(*curl_multi_strerror)(CURLMcode); + CURLMsg *(*curl_multi_info_read)(CURLM *multi_handle, + int *msgs_in_queue); + CURLMcode (*curl_multi_fdset)(CURLM *multi_handle, + fd_set *read_fd_set, + fd_set *write_fd_set, + fd_set *exc_fd_set, + int *max_fd); + CURLMcode (*curl_multi_perform)(CURLM *multi_handle, + int *running_handles); + CURLMcode (*curl_multi_add_handle)(CURLM *multi_handle, + CURL *curl_handle); + CURLMcode (*curl_multi_setopt)(CURLM *multi_handle, + CURLMoption option, ...); + CURL *(*curl_easy_init)(void); + CURLcode (*curl_easy_setopt)(CURL *curl, CURLoption option, ...); + const char *(*curl_easy_strerror)(CURLcode); + void (*curl_easy_cleanup)(CURL *curl); + CURLcode (*curl_easy_getinfo)(CURL *curl, CURLINFO info, ...); + void (*curl_slist_free_all)(struct curl_slist *); + struct curl_slist *(*curl_slist_append)(struct curl_slist *list, + const char *string); + curl_version_info_data *(*curl_version_info)(CURLversion); +}; + #define CURL_MIN_TIMEOUT 100 int ECORE_CON_EVENT_URL_DATA = 0; int ECORE_CON_EVENT_URL_COMPLETE = 0; int ECORE_CON_EVENT_URL_PROGRESS = 0; -#ifdef HAVE_CURL static void _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg); static void _ecore_con_url_multi_remove(Ecore_Con_Url *url_con); static Eina_Bool _ecore_con_url_perform(Ecore_Con_Url *url_con); @@ -52,12 +230,87 @@ static void _ecore_con_url_status_get(Ecore_Con_Url *url_con); static Eina_List *_url_con_list = NULL; static Eina_List *_fd_hd_list = NULL; -static CURLM *_curlm = NULL; static int _init_count = 0; static Ecore_Timer *_curl_timer = NULL; static Eina_Bool pipelining = EINA_FALSE; static Ecore_Idler *_curl_idler = NULL; -#endif + +static Ecore_Con_Curl *_c = NULL; +static Eina_Bool _c_fail = EINA_FALSE; + +static Eina_Bool +_c_init(void) +{ + long ms = 0; + + if (_c) return EINA_TRUE; + if (_c_fail) return EINA_FALSE; + _c = calloc(1, sizeof(Ecore_Con_Curl)); + if (!_c) goto error; + _c->mod = eina_module_new("libcurl.so.4"); + if (!_c->mod) goto error; + if (!eina_module_load(_c->mod)) goto error; + +#define SYM(x) if (!(_c->x = eina_module_symbol_get(_c->mod, #x))) goto error + SYM(curl_global_init); + SYM(curl_global_cleanup); + SYM(curl_multi_init); + SYM(curl_multi_timeout); + SYM(curl_multi_cleanup); + SYM(curl_multi_remove_handle); + SYM(curl_multi_strerror); + SYM(curl_multi_info_read); + SYM(curl_multi_fdset); + SYM(curl_multi_perform); + SYM(curl_multi_add_handle); + SYM(curl_multi_setopt); + SYM(curl_easy_init); + SYM(curl_easy_setopt); + SYM(curl_easy_strerror); + SYM(curl_easy_cleanup); + SYM(curl_easy_getinfo); + SYM(curl_slist_free_all); + SYM(curl_slist_append); + SYM(curl_version_info); + + // curl_global_init() is not thread safe! + if (_c->curl_global_init(CURL_GLOBAL_ALL)) goto error; + _c->_curlm = _c->curl_multi_init(); + if (!_c->_curlm) + { + _c->curl_global_cleanup(); + goto error; + } + _c->curl_multi_timeout(_c->_curlm, &ms); + if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT; + _curl_timer = ecore_timer_add((double)ms / 1000.0, + _ecore_con_url_timer, NULL); + ecore_timer_freeze(_curl_timer); + return EINA_TRUE; +error: + if (_c) + { + if (_c->mod) eina_module_free(_c->mod); + free(_c); + _c = NULL; + } + _c_fail = EINA_TRUE; + return EINA_FALSE; +} + +static void +_c_shutdown(void) +{ + if (!_c) return; + if (_c->_curlm) + { + _c->curl_multi_cleanup(_c->_curlm); + } + _c->curl_global_cleanup(); + if (_c->mod) eina_module_free(_c->mod); + free(_c); + _c = NULL; +} /** * @addtogroup Ecore_Con_Url_Group Ecore URL Connection Functions @@ -68,95 +321,52 @@ static Ecore_Idler *_curl_idler = NULL; EAPI int ecore_con_url_init(void) { -#ifdef HAVE_CURL - long ms; if (++_init_count > 1) return _init_count; - ECORE_CON_EVENT_URL_DATA = ecore_event_type_new(); ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new(); ECORE_CON_EVENT_URL_PROGRESS = ecore_event_type_new(); - - // curl_global_init() is not thread safe! - if (curl_global_init(CURL_GLOBAL_ALL)) return --_init_count; - - _curlm = curl_multi_init(); - if (!_curlm) - { - curl_global_cleanup(); - return --_init_count; - } - - curl_multi_timeout(_curlm, &ms); - if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT; - - _curl_timer = ecore_timer_add((double)ms / 1000.0, - _ecore_con_url_timer, NULL); - ecore_timer_freeze(_curl_timer); - return _init_count; -#else - return 0; -#endif } EAPI int ecore_con_url_shutdown(void) { -#ifdef HAVE_CURL Ecore_Con_Url *url_con; Ecore_Fd_Handler *fd_handler; if (_init_count == 0) return 0; --_init_count; if (_init_count) return _init_count; - if (_curl_timer) { ecore_timer_del(_curl_timer); _curl_timer = NULL; } - if (_curl_idler) { ecore_idler_del(_curl_idler); _curl_idler = NULL; } - EINA_LIST_FREE(_url_con_list, url_con) ecore_con_url_free(url_con); EINA_LIST_FREE(_fd_hd_list, fd_handler) ecore_main_fd_handler_del(fd_handler); - - if (_curlm) - { - curl_multi_cleanup(_curlm); - _curlm = NULL; - } - curl_global_cleanup(); + _c_shutdown(); return 0; -#endif - return 1; } EAPI void ecore_con_url_pipeline_set(Eina_Bool enable) { -#ifdef HAVE_CURL + if (!_c_init()) return; if (enable == pipelining) return; - curl_multi_setopt(_curlm, CURLMOPT_PIPELINING, !!enable); + _c->curl_multi_setopt(_c->_curlm, CURLMOPT_PIPELINING, !!enable); pipelining = enable; -#else - return; - (void)enable; -#endif } EAPI Eina_Bool ecore_con_url_pipeline_get(void) { -#ifdef HAVE_CURL return pipelining; -#endif - return EINA_FALSE; } extern Ecore_Con_Socks *_ecore_con_proxy_global; @@ -164,20 +374,18 @@ extern Ecore_Con_Socks *_ecore_con_proxy_global; EAPI Ecore_Con_Url * ecore_con_url_new(const char *url) { -#ifdef HAVE_CURL Ecore_Con_Url *url_con; CURLcode ret; - if (!_init_count) - return NULL; - + if (!_init_count) return NULL; + if (!_c_init()) return NULL; + url_con = calloc(1, sizeof(Ecore_Con_Url)); - if (!url_con) - return NULL; + if (!url_con) return NULL; url_con->write_fd = -1; - url_con->curl_easy = curl_easy_init(); + url_con->curl_easy = _c->curl_easy_init(); if (!url_con->curl_easy) { free(url_con); @@ -195,8 +403,8 @@ ecore_con_url_new(const char *url) // Read socks proxy url_con->proxy_type = -1; if (_ecore_con_proxy_global && _ecore_con_proxy_global->ip && - (_ecore_con_proxy_global->version == 4 || - _ecore_con_proxy_global->version == 5)) + ((_ecore_con_proxy_global->version == 4) || + (_ecore_con_proxy_global->version == 5))) { char proxy[256]; char host[256]; @@ -229,98 +437,83 @@ ecore_con_url_new(const char *url) _ecore_con_proxy_global->username); } - ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate"); + ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, + "gzip,deflate"); if (ret != CURLE_OK) { ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s", - curl_easy_strerror(ret)); + _c->curl_easy_strerror(ret)); ecore_con_url_free(url_con); return NULL; } - curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION, - _ecore_con_url_data_cb); - curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con); - - 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_HEADERFUNCTION, - _ecore_con_url_header_cb); - curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con); - + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION, + _ecore_con_url_data_cb); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con); + + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, + _ecore_con_url_progress_cb); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE); + + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION, + _ecore_con_url_header_cb); + _c->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_FOLLOWLOCATION, 1); - + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1); return url_con; -#else - return NULL; - (void)url; -#endif } EAPI Ecore_Con_Url * 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; - - if (!custom_request) - return NULL; - + if (!_init_count) return NULL; + if (!_c_init()) return NULL; + if (!url) return NULL; + if (!custom_request) return NULL; url_con = ecore_con_url_new(url); + if (!url_con) return NULL; - if (!url_con) - return NULL; - - ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request); + ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, + custom_request); if (ret != CURLE_OK) { ERR("Could not set a custom request string: %s", - curl_easy_strerror(ret)); + _c->curl_easy_strerror(ret)); ecore_con_url_free(url_con); return NULL; } - return url_con; -#else - return NULL; - (void)url; - (void)custom_request; -#endif } EAPI void ecore_con_url_free(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL char *s; - if (!url_con) return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_free"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->curl_easy) { - // FIXME : How can we delete curl_easy's fds ?? (Curl do not give this info.) + // FIXME : How can we delete curl_easy's fds ?? + // (Curl do not give this info.) // This cause "Failed to delete epoll fd xx!" error messages - curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, NULL); - curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_TRUE); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, + NULL); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, + EINA_TRUE); if (url_con->multi) { @@ -328,7 +521,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con) _url_con_list = eina_list_remove(_url_con_list, url_con); } - curl_easy_cleanup(url_con->curl_easy); + _c->curl_easy_cleanup(url_con->curl_easy); } if (url_con->timer) ecore_timer_del(url_con->timer); @@ -338,287 +531,203 @@ ecore_con_url_free(Ecore_Con_Url *url_con) if (url_con->event_count) return; ECORE_MAGIC_SET(url_con, ECORE_MAGIC_NONE); - curl_slist_free_all(url_con->headers); - EINA_LIST_FREE(url_con->additional_headers, s) - free(s); - EINA_LIST_FREE(url_con->response_headers, s) - free(s); + _c->curl_slist_free_all(url_con->headers); + EINA_LIST_FREE(url_con->additional_headers, s) free(s); + EINA_LIST_FREE(url_con->response_headers, s) free(s); eina_stringshare_del(url_con->url); if (url_con->post_data) free(url_con->post_data); free(url_con); -#else - return; - (void)url_con; -#endif } EAPI const char * ecore_con_url_url_get(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return NULL; } return url_con->url; -#else - return NULL; - (void)url_con; -#endif } EAPI int ecore_con_url_status_code_get(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return 0; } - if (url_con->status) return url_con->status; _ecore_con_url_status_get(url_con); return url_con->status; -#else - return -1; - (void)url_con; -#endif } EAPI Eina_Bool ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url) { -#ifdef HAVE_CURL + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_url_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } - if (url_con->dead) return EINA_FALSE; eina_stringshare_replace(&url_con->url, url); - if (url_con->url) - curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, - url_con->url); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, + url_con->url); else - curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, ""); - + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_URL, ""); return EINA_TRUE; -#else - return EINA_FALSE; - (void)url; - (void)url_con; -#endif } EAPI void 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)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - url_con->data = data; -#else - return; - (void)url_con; - (void)data; -#endif } EAPI void ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, const char *value) { -#ifdef HAVE_CURL char *tmp; - if (url_con->dead) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_additional_header_add"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } if (url_con->dead) return; tmp = malloc(strlen(key) + strlen(value) + 3); - if (!tmp) - return; - + if (!tmp) return; sprintf(tmp, "%s: %s", key, value); url_con->additional_headers = eina_list_append(url_con->additional_headers, tmp); -#else - return; - (void)url_con; - (void)key; - (void)value; -#endif } EAPI void ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL char *s; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_additional_headers_clear"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - - EINA_LIST_FREE(url_con->additional_headers, s) - free(s); -#else - return; - (void)url_con; -#endif + EINA_LIST_FREE(url_con->additional_headers, s) free(s); } EAPI void * ecore_con_url_data_get(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_get"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return NULL; } - return url_con->data; -#else - return NULL; - (void)url_con; -#endif } EAPI void 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)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_time"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; url_con->time_condition = condition; url_con->timestamp = timestamp; -#else - return; - (void)url_con; - (void)condition; - (void)timestamp; -#endif } EAPI void 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)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; url_con->write_fd = fd; -#else - return; - (void)url_con; - (void)fd; -#endif } EAPI int ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_received_bytes_get"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return -1; } - return url_con->received; -#else - return 0; - (void)url_con; -#endif } EAPI const Eina_List * ecore_con_url_response_headers_get(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL + if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) + { + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); + return NULL; + } return url_con->response_headers; -#else - return NULL; - (void)url_con; -#endif } EAPI Eina_Bool ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const char *password, Eina_Bool safe) { -#ifdef HAVE_CURL CURLcode ret; + curl_version_info_data *vers = NULL; + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_httpauth_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } - if (url_con->dead) return EINA_FALSE; -# if LIBCURL_VERSION_NUM >= 0x071301 - if ((username) && (password)) + vers = _c->curl_version_info(CURLVERSION_NOW); + if (vers->version_num >= 0x071301) { - if (safe) - curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, - CURLAUTH_ANYSAFE); - else - 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) + if ((username) && (password)) { - ERR("Could not set username for HTTP authentication: %s", - curl_easy_strerror(ret)); - return EINA_FALSE; + if (safe) + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, + CURLAUTH_ANYSAFE); + else + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH, + CURLAUTH_ANY); + + ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, + username); + if (ret != CURLE_OK) + { + ERR("Could not set username for HTTP authentication: %s", + _c->curl_easy_strerror(ret)); + return EINA_FALSE; + } + + ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, + password); + if (ret != CURLE_OK) + { + ERR("Could not set password for HTTP authentication: %s", + _c->curl_easy_strerror(ret)); + return EINA_FALSE; + } + return EINA_TRUE; } - - ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password); - if (ret != CURLE_OK) - { - ERR("Could not set password for HTTP authentication: %s", - curl_easy_strerror(ret)); - return EINA_FALSE; - } - - return EINA_TRUE; } -# endif -#else - return EINA_FALSE; - (void)url_con; - (void)username; - (void)password; - (void)safe; -#endif - return EINA_FALSE; } @@ -629,14 +738,14 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username, const c static Eina_Bool _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long length, const char *content_type) { -#ifdef HAVE_CURL Eina_List *l; const char *s; char tmp[512]; + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_send"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } @@ -644,14 +753,12 @@ _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long len if (url_con->dead) return EINA_FALSE; /* Free response headers from previous send() calls */ - EINA_LIST_FREE(url_con->response_headers, s) - free((char *)s); + EINA_LIST_FREE(url_con->response_headers, s) free((char *)s); url_con->response_headers = NULL; url_con->status = 0; - curl_slist_free_all(url_con->headers); + _c->curl_slist_free_all(url_con->headers); url_con->headers = NULL; - if ((mode == MODE_POST) || (mode == MODE_AUTO)) { if (url_con->post_data) free(url_con->post_data); @@ -664,59 +771,52 @@ _ecore_con_url_send(Ecore_Con_Url *url_con, int mode, const void *data, long len memcpy(url_con->post_data, data, length); if ((content_type) && (strlen(content_type) < 450)) { - snprintf(tmp, sizeof(tmp), "Content-Type: %s", content_type); - url_con->headers = curl_slist_append(url_con->headers, tmp); + snprintf(tmp, sizeof(tmp), "Content-Type: %s", + content_type); + url_con->headers = + _c->curl_slist_append(url_con->headers, tmp); } - curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, url_con->post_data); - curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, length); + _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_POSTFIELDS, url_con->post_data); + _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_POSTFIELDSIZE, length); } else return EINA_FALSE; } - else curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDSIZE, 0); + else _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_POSTFIELDSIZE, 0); if (mode == MODE_POST) - curl_easy_setopt(url_con->curl_easy, CURLOPT_POST, 1); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_POST, 1); } switch (url_con->time_condition) { case ECORE_CON_URL_TIME_NONE: - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, + _c->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, + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, + _c->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, + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFUNMODSINCE); - curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEVALUE, (long)url_con->timestamp); break; } - /* Additional headers */ EINA_LIST_FOREACH(url_con->additional_headers, l, s) - url_con->headers = curl_slist_append(url_con->headers, s); - - curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers); + url_con->headers = _c->curl_slist_append(url_con->headers, s); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, + url_con->headers); url_con->received = 0; - return _ecore_con_url_perform(url_con); -#else - return EINA_FALSE; - (void)url_con; - (void)mode; - (void)data; - (void)length; - (void)content_type; -#endif } EAPI Eina_Bool @@ -734,18 +834,16 @@ ecore_con_url_post(Ecore_Con_Url *url_con, const void *data, long length, const 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) { -#ifdef HAVE_CURL char url[4096]; char userpwd[4096]; FILE *fd; struct stat file_info; CURLcode ret; + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, - ECORE_MAGIC_CON_URL, - "ecore_con_url_ftp_upload"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } @@ -753,15 +851,14 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha if (!url_con->url) return EINA_FALSE; if ((!filename) || (!filename[0])) return EINA_FALSE; - if (stat(filename, &file_info)) - return EINA_FALSE; + if (stat(filename, &file_info)) return EINA_FALSE; snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass); - ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd); + ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd); if (ret != CURLE_OK) { ERR("Could not set username and password for FTP upload: %s", - curl_easy_strerror(ret)); + _c->curl_easy_strerror(ret)); return EINA_FALSE; } @@ -777,244 +874,150 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const cha if (!ecore_con_url_url_set(url_con, url)) return EINA_FALSE; - - 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_READFUNCTION, - _ecore_con_url_read_cb); - + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE, + (off_t)file_info.st_size); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1); + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION, + _ecore_con_url_read_cb); fd = fopen(filename, "rb"); if (!fd) { ERR("Could not open \"%s\" for FTP upload", filename); return EINA_FALSE; } - curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd); - + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd); return _ecore_con_url_perform(url_con); -#else - return EINA_FALSE; - (void)url_con; - (void)filename; - (void)user; - (void)pass; - (void)upload_dir; -#endif } EAPI void ecore_con_url_cookies_init(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL - if (!url_con) - return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_init"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, ""); -#else - return; - (void)url_con; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, ""); } EAPI void ecore_con_url_cookies_ignore_old_session_set(Ecore_Con_Url *url_con, Eina_Bool ignore) { -#ifdef HAVE_CURL - if (!url_con) - return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_ignore_old_session_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore); -#else - return; - (void)url_con; - (void)ignore; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIESESSION, ignore); } EAPI void ecore_con_url_cookies_clear(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL - if (!url_con) - return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_clear"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL"); -#else - return; - (void)url_con; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "ALL"); } EAPI void ecore_con_url_cookies_session_clear(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL - if (!url_con) - return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_session_clear"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS"); -#else - return; - (void)url_con; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "SESS"); } EAPI void ecore_con_url_cookies_file_add(Ecore_Con_Url *url_con, const char *const file_name) { -#ifdef HAVE_CURL - if (!url_con) - return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_file_add"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name); -#else - return; - (void)url_con; - (void)file_name; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEFILE, file_name); } EAPI Eina_Bool ecore_con_url_cookies_jar_file_set(Ecore_Con_Url *url_con, const char *const cookiejar_file) { -#ifdef HAVE_CURL CURLcode ret; - if (!url_con) - return EINA_FALSE; - + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_jar_file_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } - if (url_con->dead) return EINA_FALSE; - ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR, - cookiejar_file); + ret = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIEJAR, + cookiejar_file); if (ret != CURLE_OK) { ERR("Setting the cookie-jar name failed: %s", - curl_easy_strerror(ret)); + _c->curl_easy_strerror(ret)); return EINA_FALSE; } - return EINA_TRUE; -#else - return EINA_FALSE; - (void)url_con; - (void)cookiejar_file; -#endif } EAPI void ecore_con_url_cookies_jar_write(Ecore_Con_Url *url_con) { -#ifdef HAVE_CURL - if (!url_con) - return; - + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_cookies_jar_write"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH"); -#else - return; - (void)url_con; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_COOKIELIST, "FLUSH"); } EAPI void ecore_con_url_verbose_set(Ecore_Con_Url *url_con, Eina_Bool verbose) { -#ifdef HAVE_CURL + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_verbose_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - - if (!url_con->url) - return; - + if (!url_con->url) return; if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose); -#else - return; - (void)url_con; - (void)verbose; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_VERBOSE, (int)verbose); } EAPI void ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv) { -#ifdef HAVE_CURL + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_ftp_use_epsv_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - - if (!url_con->url) - return; - + if (!url_con->url) return; if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, (int)use_epsv); -#else - return; - (void)url_con; - (void)use_epsv; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_FTP_USE_EPSV, + (int)use_epsv); } /** @@ -1032,24 +1035,16 @@ ecore_con_url_ftp_use_epsv_set(Ecore_Con_Url *url_con, Eina_Bool use_epsv) EAPI void ecore_con_url_ssl_verify_peer_set(Ecore_Con_Url *url_con, Eina_Bool verify) { -#ifdef HAVE_CURL + if (!_c) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, - "ecore_con_url_ssl_verify_peer_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - - if (!url_con->url) - return; - + if (!url_con->url) return; if (url_con->dead) return; - curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, (int)verify); -#else - return; - (void)url_con; - (void)verify; -#endif + _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, + (int)verify); } /** @@ -1075,95 +1070,83 @@ ecore_con_url_ssl_ca_set(Ecore_Con_Url *url_con, const char *ca_path) { int res = -1; -#ifdef HAVE_CURL + if (!_c) return -1; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ssl_ca_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return -1; } - if (!url_con->url) return -1; if (url_con->dead) return -1; if (ca_path == NULL) - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 0); + res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 0); else { - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_SSL_VERIFYPEER, 1); + res = _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_SSL_VERIFYPEER, 1); if (!res) - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_CAINFO, ca_path); + res = _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_CAINFO, ca_path); } -#else - return -1; - (void)url_con; - (void)ca_path; -#endif - return res; } EAPI Eina_Bool ecore_con_url_http_version_set(Ecore_Con_Url *url_con, Ecore_Con_Url_Http_Version version) { -#ifdef HAVE_CURL int res = -1; + + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_http_version_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } if (url_con->dead) return EINA_FALSE; switch (version) { case ECORE_CON_URL_HTTP_VERSION_1_0: - res = curl_easy_setopt(url_con->curl_easy, - CURLOPT_HTTP_VERSION, - CURL_HTTP_VERSION_1_0); + res = _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_HTTP_VERSION, + CURL_HTTP_VERSION_1_0); break; - case ECORE_CON_URL_HTTP_VERSION_1_1: - res = curl_easy_setopt(url_con->curl_easy, - CURLOPT_HTTP_VERSION, - CURL_HTTP_VERSION_1_1); + res = _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_HTTP_VERSION, + CURL_HTTP_VERSION_1_1); break; - default: break; } if (res != CURLE_OK) { - ERR("curl http version setting failed: %s", curl_easy_strerror(res)); + ERR("curl http version setting failed: %s", _c->curl_easy_strerror(res)); return EINA_FALSE; } return EINA_TRUE; -#else - (void)url_con; - (void)version; - return EINA_FALSE; -#endif } EAPI Eina_Bool ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy) { -#ifdef HAVE_CURL int res = -1; curl_version_info_data *vers = NULL; + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } - if (!url_con->url) return EINA_FALSE; if (url_con->dead) return EINA_FALSE; - - if (!proxy) res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, ""); + if (!proxy) res = _c->curl_easy_setopt(url_con->curl_easy, + CURLOPT_PROXY, ""); else { // before curl version 7.21.7, socks protocol:// prefix is not supported // (e.g. socks4://, socks4a://, socks5:// or socks5h://, etc.) - vers = curl_version_info(CURLVERSION_NOW); + vers = _c->curl_version_info(CURLVERSION_NOW); if (vers->version_num < 0x71507) { url_con->proxy_type = CURLPROXY_HTTP; @@ -1175,95 +1158,81 @@ ecore_con_url_proxy_set(Ecore_Con_Url *url_con, const char *proxy) url_con->proxy_type = CURLPROXY_SOCKS5_HOSTNAME; else if (strstr(proxy, "socks5")) url_con->proxy_type = CURLPROXY_SOCKS5; - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXYTYPE, - url_con->proxy_type); + res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXYTYPE, + url_con->proxy_type); if (res != CURLE_OK) { ERR("curl proxy type setting failed: %s", - curl_easy_strerror(res)); + _c->curl_easy_strerror(res)); url_con->proxy_type = -1; return EINA_FALSE; } } - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy); + res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PROXY, proxy); } if (res != CURLE_OK) { - ERR("curl proxy setting failed: %s", curl_easy_strerror(res)); + ERR("curl proxy setting failed: %s", _c->curl_easy_strerror(res)); url_con->proxy_type = -1; return EINA_FALSE; } return EINA_TRUE; -#else - return EINA_FALSE; - (void)url_con; - (void)proxy; -#endif } EAPI void ecore_con_url_timeout_set(Ecore_Con_Url *url_con, double timeout) { -#ifdef HAVE_CURL if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_timeout_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return; } - if (url_con->dead) return; if (!url_con->url || timeout < 0) return; if (url_con->timer) ecore_timer_del(url_con->timer); - url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb, url_con); -#else - return; - (void)url_con; - (void)timeout; -#endif + url_con->timer = ecore_timer_add(timeout, _ecore_con_url_timeout_cb, + url_con); } EAPI Eina_Bool ecore_con_url_proxy_username_set(Ecore_Con_Url *url_con, const char *username) { -#ifdef HAVE_CURL int res = -1; + + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_username_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } - if (url_con->dead) return EINA_FALSE; if (!url_con->url) return EINA_FALSE; if ((!username) || (!username[0])) return EINA_FALSE; - if (url_con->proxy_type == CURLPROXY_SOCKS4 || url_con->proxy_type == CURLPROXY_SOCKS4A) + if ((url_con->proxy_type == CURLPROXY_SOCKS4) || + (url_con->proxy_type == CURLPROXY_SOCKS4A)) { ERR("Proxy type should be socks5 and above"); return EINA_FALSE; } - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username); + res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username); if (res != CURLE_OK) { - ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res)); + ERR("curl_easy_setopt() failed: %s", _c->curl_easy_strerror(res)); return EINA_FALSE; } return EINA_TRUE; -#else - return EINA_FALSE; - (void)url_con; - (void)username; -#endif } EAPI Eina_Bool ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password) { -#ifdef HAVE_CURL int res = -1; + + if (!_c) return EINA_FALSE; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_proxy_password_set"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return EINA_FALSE; } if (!url_con->url) return EINA_FALSE; @@ -1274,33 +1243,28 @@ ecore_con_url_proxy_password_set(Ecore_Con_Url *url_con, const char *password) ERR("Proxy type should be socks5 and above"); return EINA_FALSE; } - - res = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password); + res = _c->curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password); if (res != CURLE_OK) { - ERR("curl_easy_setopt() failed: %s", curl_easy_strerror(res)); + ERR("curl_easy_setopt() failed: %s", _c->curl_easy_strerror(res)); return EINA_FALSE; } return EINA_TRUE; -#else - return EINA_FALSE; - (void)url_con; - (void)password; -#endif } /** * @} */ -#ifdef HAVE_CURL static void _ecore_con_url_status_get(Ecore_Con_Url *url_con) { long status = 0; - + + if (!_c) return; if (!url_con->curl_easy) return; - if (!curl_easy_getinfo(url_con->curl_easy, CURLINFO_RESPONSE_CODE, &status)) + if (!_c->curl_easy_getinfo(url_con->curl_easy, CURLINFO_RESPONSE_CODE, + &status)) url_con->status = status; else url_con->status = 0; @@ -1312,13 +1276,12 @@ _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg) Ecore_Con_Event_Url_Complete *e; int status = url_con->status; + if (!_c) return; e = calloc(1, sizeof(Ecore_Con_Event_Url_Complete)); if (!e) return; if (!curlmsg) - { - ERR("Event completed without CURL message handle. Shouldn't happen"); - } + ERR("Event completed without CURL message handle. Shouldn't happen"); else if ((curlmsg->msg == CURLMSG_DONE) && (curlmsg->data.result == CURLE_OPERATION_TIMEDOUT) && (!curlmsg->easy_handle)) @@ -1337,14 +1300,13 @@ _ecore_con_url_event_url_complete(Ecore_Con_Url *url_con, CURLMsg *curlmsg) else { ERR("Curl message have errors: %d (%s)", - curlmsg->data.result, curl_easy_strerror(curlmsg->data.result)); + curlmsg->data.result, _c->curl_easy_strerror(curlmsg->data.result)); } - e->status = status; e->url_con = url_con; - url_con->event_count++; - ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con); + ecore_event_add(ECORE_CON_EVENT_URL_COMPLETE, e, + (Ecore_End_Cb)_ecore_con_event_url_free, url_con); } static void @@ -1352,9 +1314,10 @@ _ecore_con_url_multi_remove(Ecore_Con_Url *url_con) { CURLMcode ret; - ret = curl_multi_remove_handle(_curlm, url_con->curl_easy); + if (!_c) return; + ret = _c->curl_multi_remove_handle(_c->_curlm, url_con->curl_easy); url_con->multi = EINA_FALSE; - if (ret != CURLM_OK) ERR("curl_multi_remove_handle failed: %s", curl_multi_strerror(ret)); + if (ret != CURLM_OK) ERR("curl_multi_remove_handle failed: %s", _c->curl_multi_strerror(ret)); } static Eina_Bool @@ -1363,13 +1326,14 @@ _ecore_con_url_timeout_cb(void *data) Ecore_Con_Url *url_con = data; CURLMsg timeout_msg; + if (!_c) return ECORE_CALLBACK_CANCEL; if (!url_con) return ECORE_CALLBACK_CANCEL; if (!url_con->curl_easy) return ECORE_CALLBACK_CANCEL; _ecore_con_url_multi_remove(url_con); _url_con_list = eina_list_remove(_url_con_list, url_con); - curl_slist_free_all(url_con->headers); + _c->curl_slist_free_all(url_con->headers); url_con->headers = NULL; url_con->timer = NULL; @@ -1390,18 +1354,14 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) size_t real_size = size * nitems; url_con = (Ecore_Con_Url *)userp; - - if (!url_con) - return -1; - + if (!url_con) return -1; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { - ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_data_cb"); + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, __func__); return -1; } url_con->received += real_size; - INF("reading from %s", url_con->url); if (url_con->write_fd < 0) { @@ -1414,7 +1374,8 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) e->size = real_size; memcpy(e->data, buffer, real_size); url_con->event_count++; - ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con); + ecore_event_add(ECORE_CON_EVENT_URL_DATA, e, + (Ecore_End_Cb)_ecore_con_event_url_free, url_con); } } else @@ -1430,8 +1391,7 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) total_size); if (count < 0) { - if (errno != EAGAIN && errno != EINTR) - return -1; + if ((errno != EAGAIN) && (errno != EINTR)) return -1; } else { @@ -1440,7 +1400,6 @@ _ecore_con_url_data_cb(void *buffer, size_t size, size_t nitems, void *userp) } } } - return real_size; } @@ -1451,15 +1410,11 @@ _ecore_con_url_header_cb(void *ptr, size_t size, size_t nitems, void *stream) Ecore_Con_Url *url_con = stream; char *header = malloc(sizeof(char) * (real_size + 1)); - if (!header) - return real_size; - + if (!header) return real_size; memcpy(header, ptr, real_size); header[real_size] = '\0'; - url_con->response_headers = eina_list_append(url_con->response_headers, header); - return real_size; } @@ -1470,7 +1425,6 @@ _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double u Ecore_Con_Url *url_con; url_con = clientp; - e = malloc(sizeof(Ecore_Con_Event_Url_Progress)); if (e) { @@ -1480,9 +1434,9 @@ _ecore_con_url_progress_cb(void *clientp, double dltotal, double dlnow, double u e->up.total = ultotal; e->up.now = ulnow; url_con->event_count++; - ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, (Ecore_End_Cb)_ecore_con_event_url_free, url_con); + ecore_event_add(ECORE_CON_EVENT_URL_PROGRESS, e, + (Ecore_End_Cb)_ecore_con_event_url_free, url_con); } - return 0; } @@ -1501,7 +1455,6 @@ _ecore_con_url_read_cb(void *ptr, size_t size, size_t nitems, void *stream) fclose((FILE *)stream); return 0; } - #ifdef _WIN32 INF("*** We read %Iu bytes from file", retcode); #else @@ -1516,12 +1469,13 @@ _ecore_con_url_info_read(void) CURLMsg *curlmsg; int n_remaining; - while ((curlmsg = curl_multi_info_read(_curlm, &n_remaining))) + if (!_c) return; + while ((curlmsg = _c->curl_multi_info_read(_c->_curlm, &n_remaining))) { Eina_List *l, *ll; Ecore_Con_Url *url_con = NULL; + DBG("Curl message: %d", curlmsg->msg); - if (curlmsg->msg == CURLMSG_DONE) { EINA_LIST_FOREACH_SAFE(_url_con_list, l, ll, url_con) @@ -1549,15 +1503,12 @@ _ecore_con_url_fd_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fd_handler E Ecore_Fd_Handler *fdh; long ms; + if (!_c) return ECORE_CALLBACK_CANCEL; EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh); - - curl_multi_timeout(_curlm, &ms); + _c->curl_multi_timeout(_c->_curlm, &ms); if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT; ecore_timer_interval_set(_curl_timer, (double)ms / 1000.0); - - if (!_curl_idler) - _curl_idler = ecore_idler_add(_ecore_con_url_timer, NULL); - + if (!_curl_idler) _curl_idler = ecore_idler_add(_ecore_con_url_timer, NULL); return ECORE_CALLBACK_CANCEL; } @@ -1568,14 +1519,17 @@ _ecore_con_url_fdset(void) fd_set read_set, write_set, exc_set; int fd, fd_max; + if (!_c) return; + FD_ZERO(&read_set); FD_ZERO(&write_set); FD_ZERO(&exc_set); - ret = curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set, &fd_max); + ret = _c->curl_multi_fdset(_c->_curlm, &read_set, + &write_set, &exc_set, &fd_max); if (ret != CURLM_OK) { - ERR("curl_multi_fdset failed: %s", curl_multi_strerror(ret)); + ERR("curl_multi_fdset failed: %s", _c->curl_multi_strerror(ret)); return; } @@ -1587,7 +1541,8 @@ _ecore_con_url_fdset(void) if (FD_ISSET(fd, &exc_set)) flags |= ECORE_FD_ERROR; if (flags) { - // FIXME: Who is owner (easy_handle) of this fd?? (Curl do not give this info.) + // FIXME: Who is owner (easy_handle) of this fd?? + // (Curl do not give this info.) // This cause "Failed to delete epoll fd xx!" error messages Ecore_Fd_Handler *fd_handler; fd_handler = ecore_main_fd_handler_add(fd, flags, @@ -1608,8 +1563,8 @@ _ecore_con_url_timer(void *data EINA_UNUSED) EINA_LIST_FREE(_fd_hd_list, fdh) ecore_main_fd_handler_del(fdh); _ecore_con_url_info_read(); - - ret = curl_multi_perform(_curlm, &still_running); + if (!_c) return ECORE_CALLBACK_RENEW; + ret = _c->curl_multi_perform(_c->_curlm, &still_running); if (ret == CURLM_CALL_MULTI_PERFORM) { DBG("curl_multi_perform() again immediately"); @@ -1617,7 +1572,7 @@ _ecore_con_url_timer(void *data EINA_UNUSED) } else if (ret != CURLM_OK) { - ERR("curl_multi_perform() failed: %s", curl_multi_strerror(ret)); + ERR("curl_multi_perform() failed: %s", _c->curl_multi_strerror(ret)); _ecore_con_url_curl_clear(); ecore_timer_freeze(_curl_timer); if (_curl_idler) @@ -1626,13 +1581,14 @@ _ecore_con_url_timer(void *data EINA_UNUSED) _curl_idler = NULL; } } - if (still_running) { long ms; + _ecore_con_url_fdset(); - curl_multi_timeout(_curlm, &ms); - DBG("multiperform is still running: %d, timeout: %ld", still_running, ms); + _c->curl_multi_timeout(_c->_curlm, &ms); + DBG("multiperform is still running: %d, timeout: %ld", + still_running, ms); if ((ms >= CURL_MIN_TIMEOUT) || (ms <= 0)) ms = CURL_MIN_TIMEOUT; ecore_timer_interval_set(_curl_timer, (double)ms / 1000.0); } @@ -1648,7 +1604,6 @@ _ecore_con_url_timer(void *data EINA_UNUSED) _curl_idler = NULL; } } - return ECORE_CALLBACK_RENEW; } @@ -1657,17 +1612,17 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con) { CURLMcode ret; - ret = curl_multi_add_handle(_curlm, url_con->curl_easy); + if (!_c) return EINA_FALSE; + ret = _c->curl_multi_add_handle(_c->_curlm, url_con->curl_easy); if (ret != CURLM_OK) { - ERR("curl_multi_add_handle() failed: %s", curl_multi_strerror(ret)); + ERR("curl_multi_add_handle() failed: %s", + _c->curl_multi_strerror(ret)); return EINA_FALSE; } - url_con->multi = EINA_TRUE; _url_con_list = eina_list_append(_url_con_list, url_con); ecore_timer_thaw(_curl_timer); - return EINA_TRUE; } @@ -1676,8 +1631,5 @@ _ecore_con_event_url_free(Ecore_Con_Url *url_con, void *ev) { free(ev); url_con->event_count--; - if (url_con->dead && (!url_con->event_count)) - ecore_con_url_free(url_con); + if (url_con->dead && (!url_con->event_count)) ecore_con_url_free(url_con); } - -#endif