Depending on the option being set by curl_easy_setopt, a return value
different from CURL_OK can be returned (the same applies to curl_multi_*
and CURLM_OK).
This commit checks the return value from those calls and usually
displays an error message with ERR() and returns -- in some cases, an
error is shown but the function does not immediately return.
A few lines of code have also been moved around in order to make
returning from functions as harmless as possible.
---
src/lib/ecore_con/ecore_con_url.c | 132 +++++++++++++++++++++++++++++--------
1 files changed, 103 insertions(+), 29 deletions(-)
diff --git a/src/lib/ecore_con/ecore_con_url.c
b/src/lib/ecore_con/ecore_con_url.c
index be64054..e1b7935 100644
--- a/src/lib/ecore_con/ecore_con_url.c
+++ b/src/lib/ecore_con/ecore_con_url.c
@@ -253,6 +253,7 @@ ecore_con_url_new(const char *url)
{
#ifdef HAVE_CURL
Ecore_Con_Url *url_con;
+ CURLcode ret;
if (!_init_count)
return NULL;
@@ -261,6 +262,9 @@ ecore_con_url_new(const char *url)
if (!url_con)
return NULL;
+ url_con->fd = -1;
+ url_con->write_fd = -1;
+
url_con->curl_easy = curl_easy_init();
if (!url_con->curl_easy)
{
@@ -270,7 +274,20 @@ ecore_con_url_new(const char *url)
ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL);
- ecore_con_url_url_set(url_con, url);
+ if (!ecore_con_url_url_set(url_con, url))
+ {
+ ecore_con_url_free(url_con);
+ return NULL;
+ }
+
+ ret = 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));
+ ecore_con_url_free(url_con);
+ return NULL;
+ }
curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
_ecore_con_url_data_cb);
@@ -293,13 +310,6 @@ ecore_con_url_new(const char *url)
curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300);
curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING,
"gzip,deflate");
-
- url_con->fd = -1;
- url_con->write_fd = -1;
- url_con->additional_headers = NULL;
- url_con->response_headers = NULL;
-
return url_con;
#else
return NULL;
@@ -328,6 +338,7 @@ 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;
@@ -340,7 +351,14 @@ ecore_con_url_custom_new(const char *url, const char
*custom_request)
if (!url_con)
return NULL;
- curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request);
+ ret = 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));
+ ecore_con_url_free(url_con);
+ return NULL;
+ }
return url_con;
#else
@@ -362,6 +380,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
{
#ifdef HAVE_CURL
char *s;
+ CURLMcode ret;
if (!url_con)
return;
@@ -398,7 +417,10 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
{
url_con->active = EINA_FALSE;
- curl_multi_remove_handle(_curlm, url_con->curl_easy);
+ 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);
@@ -534,7 +556,7 @@ ecore_con_url_additional_header_add(Ecore_Con_Url *url_con,
const char *key,
#endif
}
-/*
+/**
* Cleans additional headers.
*
* Cleans additional headers associated with a connection object (previously
@@ -713,10 +735,11 @@ 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)
+ const char *password, Eina_Bool safe)
{
#ifdef HAVE_CURL
+ CURLcode ret;
+
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
@@ -733,13 +756,27 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const
char *username,
else
curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
CURLAUTH_ANY);
- curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
- curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
+ ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
+ if (ret != CURLE_OK)
+ {
+ ERR("Could not set username for HTTP authentication: %s",
+ curl_easy_strerror(ret));
+ return EINA_FALSE;
+ }
+
+ 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
#endif
+
return EINA_FALSE;
}
@@ -802,7 +839,7 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void
*data, size_t length,
url_con->headers = curl_slist_append(url_con->headers, tmp);
}
- sprintf(tmp, "Content-length: %zu", length);
+ sprintf(tmp, "Content-length: %zu", length);
url_con->headers = curl_slist_append(url_con->headers, tmp);
}
@@ -871,6 +908,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char
*filename,
char userpwd[4096];
FILE *fd;
struct stat file_info;
+ CURLcode ret;
if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
{
@@ -888,14 +926,21 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const
char *filename,
if (filename)
{
- char tmp[PATH_MAX];
-
- snprintf(tmp, PATH_MAX, "%s", filename);
-
if (stat(filename, &file_info))
return EINA_FALSE;
- fd = fopen(filename, "rb");
+ snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
+ ret = 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));
+ return EINA_FALSE;
+ }
+
+ char tmp[PATH_MAX];
+ snprintf(tmp, PATH_MAX, "%s", filename);
+
if (upload_dir)
snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
upload_dir, basename(tmp));
@@ -903,15 +948,22 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const
char *filename,
snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
basename(tmp));
- snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
+ 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_USERPWD, userpwd);
curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1);
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");
+ return EINA_FALSE;
+ }
curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd);
- ecore_con_url_url_set(url_con, url);
return _ecore_con_url_perform(url_con);
}
@@ -1218,6 +1270,7 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
int fd_max, fd;
int flags, still_running;
int completed_immediately = 0;
+ CURLMcode ret;
_url_con_list = eina_list_append(_url_con_list, url_con);
@@ -1241,7 +1294,14 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
FD_ZERO(&exc_set);
/* Stupid curl, why can't I get the fd to the current added job? */
- curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set, &fd_max);
+ ret = curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set,
+ &fd_max);
+ if (ret != CURLM_OK)
+ {
+ ERR("curl_multi_fdset failed: %s", curl_multi_strerror(ret));
+ return EINA_FALSE;
+ }
+
for (fd = 0; fd <= fd_max; fd++)
{
if (!FD_ISSET(fd, &_current_fd_set))
@@ -1260,7 +1320,11 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
{
long ms = 0;
- curl_multi_timeout(_curlm, &ms);
+ ret = curl_multi_timeout(_curlm, &ms);
+ if (ret != CURLM_OK)
+ ERR("curl_multi_timeout failed: %s",
+ curl_multi_strerror(ret));
+
if (ms == 0)
ms = 1000;
@@ -1279,7 +1343,12 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
{
/* Failed to set up an fd_handler */
ecore_timer_freeze(_curl_timeout);
- curl_multi_remove_handle(_curlm, url_con->curl_easy);
+
+ 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;
@@ -1343,6 +1412,7 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url
*url_con_to_match)
Ecore_Con_Url *url_con;
Ecore_Con_Event_Url_Complete *e;
CURLMsg *curlmsg;
+ CURLMcode ret;
int n_remaining;
int job_matched = 0;
@@ -1393,7 +1463,11 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url
*url_con_to_match)
_url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
}
- curl_multi_remove_handle(_curlm, url_con->curl_easy);
+ 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;
}
}
--
1.7.3.1
------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
Spend less time writing and rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel