From 95b86825ed9bc857750c0b4fa65512fdc7014e19 Mon Sep 17 00:00:00 2001 From: Fufu Fang Date: Wed, 1 Sep 2021 03:53:19 +0100 Subject: [PATCH] Added minimum transfer size in TransferDataStruct --- Doxyfile | 2 +- src/link.c | 29 +++++++++++++++-------------- src/link.h | 16 ++++++++++------ src/log.h | 2 +- src/network.c | 6 +++--- src/sonic.c | 2 +- 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/Doxyfile b/Doxyfile index 0eba7a1..b01ca4c 100644 --- a/Doxyfile +++ b/Doxyfile @@ -901,7 +901,7 @@ EXCLUDE_PATTERNS = # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = CALLOC lprintf +EXCLUDE_SYMBOLS = CALLOC lprintf FREE # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include diff --git a/src/link.c b/src/link.c index d1b0ec9..4271071 100644 --- a/src/link.c +++ b/src/link.c @@ -113,7 +113,7 @@ static void Link_req_file_stat(Link * this_link) * * It gets freed in curl_multi_perform_once(); */ - TransferStruct *transfer = CALLOC(1, sizeof(TransferStruct)); + TransferStatusStruct *transfer = CALLOC(1, sizeof(TransferStatusStruct)); transfer->link = this_link; transfer->type = FILESTAT; @@ -434,12 +434,12 @@ void LinkTable_print(LinkTable * linktbl) } } -DataStruct Link_to_DataStruct(Link * head_link) +TransferDataStruct Link_to_TransferDataStruct(Link * head_link) { char *url = head_link->f_url; CURL *curl = Link_to_curl(head_link); - DataStruct buf; + TransferDataStruct buf; buf.size = 0; buf.data = NULL; @@ -493,7 +493,7 @@ LinkTable *LinkTable_new(const char *url) /* * start downloading the base URL */ - DataStruct buf = Link_to_DataStruct(linktbl->links[0]); + TransferDataStruct buf = Link_to_TransferDataStruct(linktbl->links[0]); if (buf.size == 0) { LinkTable_free(linktbl); return NULL; @@ -792,7 +792,7 @@ Link *path_to_Link(const char *path) } long -path_download(const char *path, char *output_buf, size_t size, +path_download(const char *path, char *output_buf, size_t req_size, off_t offset) { if (!path) { @@ -805,12 +805,12 @@ path_download(const char *path, char *output_buf, size_t size, } size_t start = offset; - size_t end = start + size; + size_t end = start + req_size; char range_str[64]; snprintf(range_str, sizeof(range_str), "%lu-%lu", start, end); lprintf(debug, "path_download(%s, %s);\n", path, range_str); - DataStruct buf; + TransferDataStruct buf; buf.size = 0; buf.data = NULL; @@ -818,7 +818,7 @@ path_download(const char *path, char *output_buf, size_t size, curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &buf); curl_easy_setopt(curl, CURLOPT_RANGE, range_str); - DataStruct header; + TransferDataStruct header; header.size = 0; header.data = NULL; curl_easy_setopt(curl, CURLOPT_HEADERDATA, (void *) &header); @@ -849,18 +849,19 @@ range requests\n"); return -ENOENT; } - double dl; - curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &dl); + curl_off_t recv; + curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &recv); - size_t recv = dl; - if (recv > size) { - recv = size; + /* The extra 1 byte is probably for '\0' */ + if (recv - 1 == (long int) req_size) { + recv--; + } else { + lprintf(error, "req_size: %lu, recv: %ld\n", req_size, recv); } memmove(output_buf, buf.data, recv); curl_easy_cleanup(curl); FREE(buf.data); - lprintf(debug, "recv: %lu bytes\n", recv); return recv; } diff --git a/src/link.h b/src/link.h index 7786d86..f2df00d 100644 --- a/src/link.h +++ b/src/link.h @@ -23,11 +23,15 @@ typedef enum { LINK_UNINITIALISED_FILE = 'U' } LinkType; -/** \brief for storing downloaded data in memory */ +/** \brief For storing transfer data */ typedef struct { + /** \brief The array to store the data */ char *data; + /** \brief The size of the array */ size_t size; -} DataStruct; + /** \brief The minium requested size */ + size_t min_req_size; +} TransferDataStruct; /** \brief specify the type of data transfer */ typedef enum { @@ -35,12 +39,12 @@ typedef enum { DATA = 'd' } TransferType; -/** \brief for storing the link being transferred, and metadata */ +/** \brief For storing transfer status and metadata */ typedef struct { TransferType type; int transferring; Link *link; -} TransferStruct; +} TransferStatusStruct; /** * \brief link table type @@ -145,9 +149,9 @@ LinkTable *LinkTable_disk_open(const char *dirn); /** * \brief Download a link's content to the memory - * \warning You MUST free the memory field in DataStruct after use! + * \warning You MUST free the memory field in TransferDataStruct after use! */ -DataStruct Link_to_DataStruct(Link * head_link); +TransferDataStruct Link_to_TransferDataStruct(Link * head_link); /** * \brief Allocate a LinkTable diff --git a/src/log.h b/src/log.h index 8126c11..7fa04b2 100644 --- a/src/log.h +++ b/src/log.h @@ -18,7 +18,7 @@ typedef enum { /** * \brief The default log level */ -#define DEFAULT_LOG_LEVEL fatal | error | warning | info +#define DEFAULT_LOG_LEVEL fatal | error | warning | info | debug /** * \brief Get the log level from the environment. diff --git a/src/network.c b/src/network.c index db60a84..10f3423 100644 --- a/src/network.c +++ b/src/network.c @@ -117,7 +117,7 @@ curl_process_msgs(CURLMsg * curl_msg, int n_running_curl, int n_mesgs) (void) n_mesgs; static volatile int slept = 0; if (curl_msg->msg == CURLMSG_DONE) { - TransferStruct *transfer; + TransferStatusStruct *transfer; CURL *curl = curl_msg->easy_handle; curl_easy_getinfo(curl_msg->easy_handle, CURLINFO_PRIVATE, &transfer); @@ -311,7 +311,7 @@ void transfer_blocking(CURL * curl) * We don't need to malloc here, as the transfer is finished before * the variable gets popped from the stack */ - volatile TransferStruct transfer; + volatile TransferStatusStruct transfer; transfer.type = DATA; transfer.transferring = 1; curl_easy_setopt(curl, CURLOPT_PRIVATE, &transfer); @@ -357,7 +357,7 @@ write_memory_callback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; - DataStruct *mem = (DataStruct *) userp; + TransferDataStruct *mem = (TransferDataStruct *) userp; mem->data = realloc(mem->data, mem->size + realsize + 1); if (!mem->data) { diff --git a/src/sonic.c b/src/sonic.c index 6cce979..3f3a5ac 100644 --- a/src/sonic.c +++ b/src/sonic.c @@ -332,7 +332,7 @@ static LinkTable *sonic_url_to_LinkTable(const char *url, /* * start downloading the base URL */ - DataStruct xml = Link_to_DataStruct(linktbl->links[0]); + TransferDataStruct xml = Link_to_TransferDataStruct(linktbl->links[0]); if (xml.size == 0) { LinkTable_free(linktbl); return NULL;