[pacman-dev] [PATCH] Add a fetch callback to allow front-end download support
Dan McGee
dpmcgee at gmail.com
Wed Jul 22 22:28:08 EDT 2009
On Sat, Apr 4, 2009 at 3:30 AM, Sebastian Nowicki<sebnow at gmail.com> wrote:
> I fixed the warnings and errors and tested it a bit more. Everything
> seems to be working fine. Using dynamic allocation for the xfercommand
> string removed the problem with PATH_MAX. The previously inlined
> functions are now separate functions as before, with minor changes due
> to the lack of macros from libalpm (see diff below).
So I finally got around to this. I made a few small changes, detailed
in the diff below, that I included in the final patch.
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 31e1f45..ce8c691 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -151,9 +151,6 @@ void alpm_option_add_ignoregrp(const char *grp);
void alpm_option_set_ignoregrps(alpm_list_t *ignoregrps);
int alpm_option_remove_ignoregrp(const char *grp);
-const char *alpm_option_get_xfercommand();
-void alpm_option_set_xfercommand(const char *cmd);
-
>>> You simply forgot to kill these here.
unsigned short alpm_option_get_nopassiveftp();
void alpm_option_set_nopassiveftp(unsigned short nopasv);
void alpm_option_set_usedelta(unsigned short usedelta);
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 9aa6141..6b163ce 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -267,12 +267,17 @@ static int download(const char *url, const char
*localpath,
time_t mtimeold, time_t *mtimenew) {
if(handle->fetchcb == NULL) {
#if defined(INTERNAL_DOWNLOAD)
- handle->fetchcb = download_internal;
+ return(download_internal(url, localpath, mtimeold, mtimenew));
#else
RET_ERR(PM_ERR_EXTERNAL_DOWNLOAD, -1);
#endif
+ } else {
+ int ret = handle->fetchcb(url, localpath, mtimeold, mtimenew);
+ if(ret == -1) {
+ RET_ERR(PM_ERR_EXTERNAL_DOWNLOAD, -1);
+ }
+ return(ret);
}
- return handle->fetchcb(url, localpath, mtimeold, mtimenew);
}
>>> Structuring the code this way ensures the correct pm_errno value will propagate up the call stack.
/*
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 2bf952a..2d3de98 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -73,7 +73,7 @@ typedef struct __config_t {
unsigned short cleanmethod; /* select -Sc behavior */
alpm_list_t *holdpkg;
alpm_list_t *syncfirst;
- char *xfercommand; /* external download command */
+ char *xfercommand;
} config_t;
/* Operations */
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 7cf1396..7cecd90 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -657,7 +657,7 @@ int download_with_xfercommand(const char *url,
const char *localpath,
/* cwd to the download directory */
getcwd(cwd, PATH_MAX);
if(chdir(localpath)) {
- pm_printf(PM_LOG_DEBUG, "could not chdir to %s\n", localpath);
+ pm_printf(PM_LOG_WARNING, "could not chdir to %s\n", localpath);
ret = -1;
goto cleanup;
}
@@ -666,7 +666,7 @@ int download_with_xfercommand(const char *url,
const char *localpath,
retval = system(parsedCmd);
if(retval == -1) {
- pm_printf(PM_LOG_DEBUG, "running XferCommand: fork failed!\n");
+ pm_printf(PM_LOG_WARNING, "running XferCommand: fork failed!\n");
>>> These two were warnings before; they are kind of a big deal.
ret = -1;
} else if(retval != 0) {
/* download failed */
-Dan
More information about the pacman-dev
mailing list