summaryrefslogtreecommitdiff
path: root/lib/libalpm/sync.c
diff options
context:
space:
mode:
authorDave Reisner <dreisner@archlinux.org>2011-09-07 16:01:43 -0400
committerDan McGee <dan@archlinux.org>2011-09-11 19:09:04 -0500
commitd8eacae7bc1465b725e6b1c3b7ad8c27c52437f4 (patch)
tree48ae4bfe0603802c0f298f4da01cd108b090b668 /lib/libalpm/sync.c
parentbefddfc3e6a1f61b0bb2b6c377f3a394a7620b81 (diff)
downloadpacman-d8eacae7bc1465b725e6b1c3b7ad8c27c52437f4.tar.xz
make compute_download_size consider .part files
Check for the existance of a partial download of a package file before jumping to delta calculations. Currently, if there were 10MiB remaining in a 100MiB the values passed to the front end do not reflect this. Refactored from an old patch originally by Dan. Signed-off-by: Dave Reisner <dreisner@archlinux.org> Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/sync.c')
-rw-r--r--lib/libalpm/sync.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index e2562c08..717ba7ce 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -284,7 +284,8 @@ alpm_list_t SYMEXPORT *alpm_find_group_pkgs(alpm_list_t *dbs,
*/
static int compute_download_size(alpm_pkg_t *newpkg)
{
- char *fpath;
+ const char *fname;
+ char *fpath, *fnamepart = NULL;
off_t size = 0;
alpm_handle_t *handle = newpkg->handle;
@@ -295,11 +296,26 @@ static int compute_download_size(alpm_pkg_t *newpkg)
}
ASSERT(newpkg->filename != NULL, RET_ERR(handle, ALPM_ERR_PKG_INVALID_NAME, -1));
- fpath = _alpm_filecache_find(handle, newpkg->filename);
+ fname = newpkg->filename;
+ fpath = _alpm_filecache_find(handle, fname);
+ /* downloaded file exists, so there's nothing to grab */
if(fpath) {
- FREE(fpath);
size = 0;
+ goto finish;
+ }
+
+ CALLOC(fnamepart, strlen(fname) + 6, sizeof(char), return -1);
+ sprintf(fnamepart, "%s.part", fname);
+ fpath = _alpm_filecache_find(handle, fnamepart);
+ if(fpath) {
+ struct stat st;
+ if(stat(fpath, &st) == 0) {
+ /* subtract the size of the .part file */
+ _alpm_log(handle, ALPM_LOG_DEBUG, "using (package - .part) size\n");
+ size = newpkg->size - st.st_size;
+ size = size < 0 ? 0 : size;
+ }
} else if(handle->usedelta) {
off_t dltsize;
@@ -319,11 +335,16 @@ static int compute_download_size(alpm_pkg_t *newpkg)
size = newpkg->size;
}
+finish:
_alpm_log(handle, ALPM_LOG_DEBUG, "setting download size %jd for pkg %s\n",
(intmax_t)size, newpkg->name);
newpkg->infolevel |= INFRQ_DSIZE;
newpkg->download_size = size;
+
+ FREE(fpath);
+ FREE(fnamepart);
+
return 0;
}