summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac6
-rw-r--r--lib/libalpm/dload.c29
-rw-r--r--scripts/repo-add.sh.in16
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"