Somehow the patch didn't make it, I'm pasting it here below: diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 57ea880..363ceee 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -82,6 +82,17 @@ int alpm_logaction(char *fmt, ...); typedef void (*alpm_cb_download)(const char *filename, off_t xfered, off_t total); typedef void (*alpm_cb_totaldl)(off_t total); +/** A callback for downloading files + * @param url the URL of the file to be downloaded + * @param localpath the directory to which the file should be downloaded + * @param mtimeold the modification time of the file previously downloaded + * @param mtimenew the modification time of the newly downloaded file. + * This should be set by the callback. + * @return 0 on success, 1 if the modification times are identical, -1 on + * error. + */ +typedef int (*alpm_cb_fetch)(const char *url, const char *localpath, + time_t mtimeold, time_t *mtimenew); /* * Options @@ -93,6 +104,9 @@ void alpm_option_set_logcb(alpm_cb_log cb); alpm_cb_download alpm_option_get_dlcb(); void alpm_option_set_dlcb(alpm_cb_download cb); +alpm_cb_fetch alpm_option_get_fetchcb(); +void alpm_option_set_fetchcb(alpm_cb_fetch cb); + alpm_cb_totaldl alpm_option_get_totaldlcb(); void alpm_option_set_totaldlcb(alpm_cb_totaldl cb); diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 5b0a691..c0c9bf7 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -352,12 +352,15 @@ static int download(const char *url, const char *localpath, int ret; /* We have a few things to take into account here. - * 1. If we have both internal/external available, choose based on + * 1. If we have a fetch callback, use it + * 2. If we have both internal/external available, choose based on * whether xfercommand is populated. - * 2. If we only have external available, we should first check + * 3. If we only have external available, we should first check * if a command was provided before we drop into download_external. */ - if(handle->xfercommand == NULL) { + if(handle->fetchcb != NULL) { + return handle->fetchcb(url, localpath, mtimeold, mtimenew); + } else if(handle->xfercommand == NULL) { #if defined(INTERNAL_DOWNLOAD) ret = download_internal(url, localpath, mtimeold, mtimenew); #else diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c index 813f439..48edab8 100644 --- a/lib/libalpm/handle.c +++ b/lib/libalpm/handle.c @@ -105,6 +105,15 @@ alpm_cb_download SYMEXPORT alpm_option_get_dlcb() return handle->dlcb; } +alpm_cb_fetch SYMEXPORT alpm_option_get_fetchcb() +{ + if (handle == NULL) { + pm_errno = PM_ERR_HANDLE_NULL; + return NULL; + } + return handle->fetchcb; +} + alpm_cb_totaldl SYMEXPORT alpm_option_get_totaldlcb() { if (handle == NULL) { @@ -258,6 +267,15 @@ void SYMEXPORT alpm_option_set_dlcb(alpm_cb_download cb) handle->dlcb = cb; } +void SYMEXPORT alpm_option_set_fetchcb(alpm_cb_fetch cb) +{ + if (handle == NULL) { + pm_errno = PM_ERR_HANDLE_NULL; + return; + } + handle->fetchcb = cb; +} + void SYMEXPORT alpm_option_set_totaldlcb(alpm_cb_totaldl cb) { if (handle == NULL) { diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h index ad7666d..85aaf55 100644 --- a/lib/libalpm/handle.h +++ b/lib/libalpm/handle.h @@ -39,6 +39,7 @@ typedef struct _pmhandle_t { /* callback functions */ alpm_cb_log logcb; /* Log callback function */ alpm_cb_download dlcb; /* Download callback function */ + alpm_cb_fetch fetchcb; /* Download file callback function */ alpm_cb_totaldl totaldlcb; /* Total download callback function */ /* filesystem paths */ -- ------------------- Dario Freddi KDE Developer GPG Key Signature: 511A9A3B