diff options
Diffstat (limited to 'lib/libalpm/dload.c')
-rw-r--r-- | lib/libalpm/dload.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index c07040b5..f197d060 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -24,6 +24,7 @@ #include <errno.h> #include <string.h> #include <unistd.h> +#include <signal.h> #include <limits.h> /* the following two are needed on BSD for libfetch */ #if defined(HAVE_SYS_SYSLIMITS_H) @@ -35,14 +36,14 @@ #if defined(HAVE_LIBDOWNLOAD) #include <download.h> +#define fetchFreeURL downloadFreeURL +#define fetchLastErrCode downloadLastErrCode +#define fetchLastErrString downloadLastErrString +#define fetchParseURL downloadParseURL +#define fetchTimeout downloadTimeout +#define fetchXGet downloadXGet #elif defined(HAVE_LIBFETCH) #include <fetch.h> -#define downloadFreeURL fetchFreeURL -#define downloadLastErrCode fetchLastErrCode -#define downloadLastErrString fetchLastErrString -#define downloadParseURL fetchParseURL -#define downloadTimeout fetchTimeout -#define downloadXGet fetchXGet #endif /* libalpm */ @@ -86,7 +87,7 @@ static char *get_tempfile(const char *path, const char *filename) { static struct url *url_for_string(const char *url) { struct url *ret = NULL; - ret = downloadParseURL(url); + ret = fetchParseURL(url); if(!ret) { _alpm_log(PM_LOG_ERROR, _("url '%s' is invalid\n"), url); RET_ERR(PM_ERR_SERVER_BAD_URL, NULL); @@ -115,6 +116,7 @@ static int download_internal(const char *url, const char *localpath, size_t dl_thisfile = 0; char *tempfile, *destfile, *filename; int ret = 0; + struct sigaction new_action, old_action; struct url *fileurl = url_for_string(url); if(!fileurl) { @@ -142,23 +144,29 @@ static int download_internal(const char *url, const char *localpath, dl_thisfile = 0; } - /* libdownload does not reset the error code, reset it in - * the case of previous errors */ - downloadLastErrCode = 0; + /* libfetch does not reset the error code */ + fetchLastErrCode = 0; /* 10s timeout - TODO make a config option */ - downloadTimeout = 10000; + fetchTimeout = 10000; - dlf = downloadXGet(fileurl, &ust, (handle->nopassiveftp ? "" : "p")); + /* ignore any SIGPIPE signals- these may occur if our FTP socket dies or + * something along those lines. Store the old signal handler first. */ + new_action.sa_handler = SIG_IGN; + sigemptyset(&new_action.sa_mask); + sigaction(SIGPIPE, NULL, &old_action); + sigaction(SIGPIPE, &new_action, NULL); - if(downloadLastErrCode != 0 || dlf == NULL) { + dlf = fetchXGet(fileurl, &ust, (handle->nopassiveftp ? "" : "p")); + + if(fetchLastErrCode != 0 || dlf == NULL) { const char *host = _("disk"); if(strcmp(SCHEME_FILE, fileurl->scheme) != 0) { host = fileurl->host; } - pm_errno = PM_ERR_LIBDOWNLOAD; + pm_errno = PM_ERR_LIBFETCH; _alpm_log(PM_LOG_ERROR, _("failed retrieving file '%s' from %s : %s\n"), - filename, host, downloadLastErrString); + filename, host, fetchLastErrString); ret = -1; goto cleanup; } else { @@ -204,9 +212,9 @@ static int download_internal(const char *url, const char *localpath, char buffer[PM_DLBUF_LEN]; while((nread = fread(buffer, 1, PM_DLBUF_LEN, dlf)) > 0) { if(ferror(dlf)) { - pm_errno = PM_ERR_LIBDOWNLOAD; + pm_errno = PM_ERR_LIBFETCH; _alpm_log(PM_LOG_ERROR, _("error downloading '%s': %s\n"), - filename, downloadLastErrString); + filename, fetchLastErrString); ret = -1; goto cleanup; } @@ -239,6 +247,9 @@ static int download_internal(const char *url, const char *localpath, ret = 0; cleanup: + /* restore any existing SIGPIPE signal handler */ + sigaction(SIGPIPE, &old_action, NULL); + FREE(tempfile); FREE(destfile); if(localf != NULL) { @@ -247,7 +258,7 @@ cleanup: if(dlf != NULL) { fclose(dlf); } - downloadFreeURL(fileurl); + fetchFreeURL(fileurl); return(ret); } #endif |