aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/core/download.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/lib/core/download.c b/src/lib/core/download.c
index d3cbd93..397f1f6 100644
--- a/src/lib/core/download.c
+++ b/src/lib/core/download.c
@@ -11,10 +11,15 @@ size_t download_writer(void *fp, size_t size, size_t nmemb, void *stream) {
}
long download(char *url, const char *filename, char **errmsg) {
+ SYSDEBUG("%s", "ARGS follow");
+ SYSDEBUG("url=%s", url);
+ SYSDEBUG("filename=%s", filename);
+ SYSDEBUG("errmsg=%s (NULL is OK)", *errmsg);
long http_code = -1;
char user_agent[STASIS_NAME_MAX] = {0};
snprintf(user_agent, sizeof(user_agent), "stasis/%s", STASIS_VERSION);
+ SYSDEBUG("%s", "Setting timeout");
long timeout = 30L;
const char *timeout_str = getenv("STASIS_DOWNLOAD_TIMEOUT");
if (timeout_str) {
@@ -24,6 +29,7 @@ long download(char *url, const char *filename, char **errmsg) {
}
}
+ SYSDEBUG("%s", "Setting max_retries");
ssize_t max_retries = 5;
const char *max_retries_str = getenv("STASIS_DOWNLOAD_RETRY_MAX");
if (max_retries_str) {
@@ -33,6 +39,7 @@ long download(char *url, const char *filename, char **errmsg) {
}
}
+ SYSDEBUG("%s", "Setting max_retry_seconds");
ssize_t max_retry_seconds = 3;
const char *max_retry_seconds_str = getenv("STASIS_DOWNLOAD_RETRY_SECONDS");
if (max_retry_seconds_str) {
@@ -43,12 +50,15 @@ long download(char *url, const char *filename, char **errmsg) {
}
+ SYSDEBUG("%s", "Initializing curl context");
curl_global_init(CURL_GLOBAL_ALL);
CURL *c = curl_easy_init();
for (ssize_t retry = 0; retry < max_retries; retry++) {
if (retry) {
fprintf(stderr, "[RETRY %zu/%zu] %s: %s\n", retry + 1, max_retries, *errmsg, url);
}
+
+ SYSDEBUG("%s", "Configuring curl");
curl_easy_setopt(c, CURLOPT_URL, url);
curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, download_writer);
FILE *fp = fopen(filename, "wb");
@@ -64,13 +74,19 @@ long download(char *url, const char *filename, char **errmsg) {
curl_easy_setopt(c, CURLOPT_CONNECTTIMEOUT, timeout);
SYSDEBUG("curl_easy_perform(): \n\turl=%s\n\tfilename=%s\n\tuser agent=%s\n\ttimeout=%zu", url, filename, user_agent, timeout);
- CURLcode curl_code = curl_easy_perform(c);
+ const CURLcode curl_code = curl_easy_perform(c);
SYSDEBUG("curl status code: %d", curl_code);
if (curl_code != CURLE_OK) {
+ SYSDEBUG("curl failed with code: %s", curl_easy_strerror(curl_code));
const size_t errmsg_maxlen = 256;
if (!*errmsg) {
+ SYSDEBUG("%s", "allocating memory for error message");
*errmsg = calloc(errmsg_maxlen, sizeof(char));
+ if (!*errmsg) {
+ SYSERROR("%s", "unable to allocate memory for error message");
+ goto cleanup;
+ }
}
snprintf(*errmsg, errmsg_maxlen, "%s", curl_easy_strerror(curl_code));
curl_easy_reset(c);
@@ -79,6 +95,8 @@ long download(char *url, const char *filename, char **errmsg) {
continue;
}
+ cleanup:
+ SYSDEBUG("%s", "Cleaning up");
// Data written. Clean up.
fclose(fp);