summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libalpm/dload.c7
-rw-r--r--lib/libalpm/util.h4
2 files changed, 8 insertions, 3 deletions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 4347e5db..8be69e8a 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -92,7 +92,7 @@ static int curl_progress(void *filename, double dltotal, double dlnow,
(void)ultotal;
(void)ulnow;
- if(dltotal == 0 || prevprogress == dltotal) {
+ if(DOUBLE_EQ(dltotal, 0) || DOUBLE_EQ(prevprogress, dltotal)) {
return 0;
}
@@ -230,7 +230,7 @@ static int curl_download_internal(const char *url, const char *localpath,
/* time condition was met and we didn't download anything. we need to
* clean up the 0 byte .part file that's left behind. */
- if(bytes_dl == 0 && timecond == 1) {
+ if(DOUBLE_EQ(bytes_dl, 0) && timecond == 1) {
ret = 1;
unlink(tempfile);
goto cleanup;
@@ -249,7 +249,8 @@ static int curl_download_internal(const char *url, const char *localpath,
/* remote_size isn't necessarily the full size of the file, just what the
* server reported as remaining to download. compare it to what curl reported
* as actually being transferred during curl_easy_perform() */
- if((remote_size != -1 && bytes_dl != -1) && bytes_dl != remote_size) {
+ if(!DOUBLE_EQ(remote_size, -1) && !DOUBLE_EQ(bytes_dl, -1) &&
+ !DOUBLE_EQ(bytes_dl, remote_size)) {
pm_errno = PM_ERR_RETRIEVE;
_alpm_log(PM_LOG_ERROR, _("%s appears to be truncated: %jd/%jd bytes\n"),
filename, (intmax_t)bytes_dl, (intmax_t)remote_size);
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 9f0344fe..1816e360 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -36,6 +36,8 @@
#include <time.h>
#include <sys/stat.h> /* struct stat */
#include <archive.h> /* struct archive */
+#include <math.h> /* fabs */
+#include <float.h> /* DBL_EPSILON */
#ifdef ENABLE_NLS
#include <libintl.h> /* here so it doesn't need to be included elsewhere */
@@ -61,6 +63,8 @@
_alpm_log(PM_LOG_DEBUG, "returning error %d from %s : %s\n", err, __func__, alpm_strerrorlast()); \
return (ret); } while(0)
+#define DOUBLE_EQ(x, y) (fabs((x) - (y)) < DBL_EPSILON)
+
/**
* Used as a buffer/state holder for _alpm_archive_fgets().
*/