diff options
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | lib/libalpm/dload.c | 29 | ||||
-rw-r--r-- | scripts/repo-add.sh.in | 16 |
3 files changed, 36 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac index 1e9ab35b..9f3445dd 100644 --- a/configure.ac +++ b/configure.ac @@ -184,11 +184,11 @@ GCC_VISIBILITY_CC GCC_GNU89_INLINE_CC # Host-dependant definitions -SIZECMD="stat -c %s" +SIZECMD="stat -L -c %s" SEDINPLACE="sed -i" case "${host_os}" in *bsd*) - SIZECMD="stat -f %z" + SIZECMD="stat -L -f %z" SEDINPLACE="sed -i ''" ;; cygwin*) @@ -197,7 +197,7 @@ case "${host_os}" in ;; darwin*) host_os_darwin=yes - SIZECMD="/usr/bin/stat -f %z" + SIZECMD="/usr/bin/stat -L -f %z" SEDINPLACE="/usr/bin/sed -i ''" ;; esac diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index f8fb09fe..8b3226bd 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -76,6 +76,15 @@ static char *get_tempfile(const char *path, const char *filename) { return(tempfile); } +static const char *gethost(struct url *fileurl) +{ + const char *host = _("disk"); + if(strcmp(SCHEME_FILE, fileurl->scheme) != 0) { + host = fileurl->host; + } + return(host); +} + static int download_internal(const char *url, const char *localpath, time_t mtimeold, time_t *mtimenew) { fetchIO *dlf = NULL; @@ -83,7 +92,8 @@ static int download_internal(const char *url, const char *localpath, struct url_stat ust; struct stat st; int chk_resume = 0, ret = 0; - size_t dl_thisfile = 0, nread = 0; + size_t dl_thisfile = 0; + ssize_t nread = 0; char *tempfile, *destfile, *filename; struct sigaction new_action, old_action; struct url *fileurl; @@ -149,13 +159,9 @@ static int download_internal(const char *url, const char *localpath, } if(fetchLastErrCode != 0 || dlf == NULL) { - const char *host = _("disk"); - if(strcmp(SCHEME_FILE, fileurl->scheme) != 0) { - host = fileurl->host; - } pm_errno = PM_ERR_LIBFETCH; _alpm_log(PM_LOG_ERROR, _("failed retrieving file '%s' from %s : %s\n"), - filename, host, fetchLastErrString); + filename, gethost(fileurl), fetchLastErrString); ret = -1; goto cleanup; } else { @@ -208,8 +214,17 @@ static int download_internal(const char *url, const char *localpath, } /* did the transfer complete normally? */ + if (nread == -1) { + /* not PM_ERR_LIBFETCH here because libfetch error string might be empty */ + pm_errno = PM_ERR_RETRIEVE; + _alpm_log(PM_LOG_ERROR, _("failed retrieving file '%s' from %s\n"), + filename, gethost(fileurl)); + ret = -1; + goto cleanup; + } + if (ust.size != -1 && dl_thisfile < ust.size) { - pm_errno = PM_ERR_LIBFETCH; + pm_errno = PM_ERR_RETRIEVE; _alpm_log(PM_LOG_ERROR, _("%s appears to be truncated: %jd/%jd bytes\n"), filename, (intmax_t)dl_thisfile, (intmax_t)ust.size); ret = -1; diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index 6aa7fe73..bcbd3b37 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -306,9 +306,14 @@ check_repo_db() fi if [ -f "$REPO_DB_FILE" ]; then - if ! bsdtar -tqf "$REPO_DB_FILE" '*/desc' 2>&1 >/dev/null; then - error "$(gettext "Repository file '%s' is not a proper pacman database.")" "$REPO_DB_FILE" - exit 1 + # there are two situations we can have here- a DB with some entries, + # or a DB with no contents at all. + if ! bsdtar -tqf "$REPO_DB_FILE" '*/desc' >/dev/null 2>&1; then + # check empty case + if [ -n "$(bsdtar -tqf "$REPO_DB_FILE" '*' 2>/dev/null)" ]; then + error "$(gettext "Repository file '%s' is not a proper pacman database.")" "$REPO_DB_FILE" + exit 1 + fi fi msg "$(gettext "Extracting database to a temporary location...")" bsdtar -xf "$REPO_DB_FILE" -C "$tmpdir" @@ -472,8 +477,9 @@ if [ $success -eq 1 ]; then if [ -n "$(ls)" ]; then bsdtar -c${TAR_OPT}f "$filename" * else - # the database will be moved to .old below, and there will be no new one to replace it - error "$(gettext "All packages have been removed from the database. Deleting '%s'.")" "$REPO_DB_FILE" + # we have no packages remaining? zip up some emptyness + warning "$(gettext "No packages remain, creating empty database.")" + bsdtar -c${TAR_OPT}f "$filename" -T /dev/null fi cd "$startdir" |