summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2021-04-25 20:03:54 +0200
committerAllan McRae <allan@archlinux.org>2021-05-01 04:08:14 +0200
commite7fa35baa22bf6710a904815456d3ff679005fc7 (patch)
treec988537bbc720da5fce7de30c39e73f6e67a16a0 /src
parent523c393e9e6175e632d355c9440abb0be164a362 (diff)
downloadpacman-e7fa35baa22bf6710a904815456d3ff679005fc7.tar.gz
pacman-e7fa35baa22bf6710a904815456d3ff679005fc7.tar.xz
add front-end provided context to callbacks
Our callbacks require front-ends to maintain state in order to provide reasonable output. The new download callback in particular requires much more complex state information to be saved. Without the ability to provide context, state must be saved globally, which may not be possible for all front-ends. Scripting language bindings in particular have no way to register per-handle callbacks without some form of context. Implements: FS#12721 Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/pacman/callback.c18
-rw-r--r--src/pacman/callback.h14
-rw-r--r--src/pacman/conf.c18
-rw-r--r--src/util/testpkg.c7
4 files changed, 33 insertions, 24 deletions
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 9628779a..c3563af3 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -232,8 +232,9 @@ static int number_length(size_t n)
}
/* callback to handle messages/notifications from libalpm transactions */
-void cb_event(alpm_event_t *event)
+void cb_event(void *ctx, alpm_event_t *event)
{
+ (void)ctx;
if(config->print) {
console_cursor_move_end();
return;
@@ -436,8 +437,9 @@ void cb_event(alpm_event_t *event)
}
/* callback to handle questions from libalpm transactions (yes/no) */
-void cb_question(alpm_question_t *question)
+void cb_question(void *ctx, alpm_question_t *question)
{
+ (void)ctx;
if(config->print) {
switch(question->type) {
case ALPM_QUESTION_INSTALL_IGNOREPKG:
@@ -558,8 +560,8 @@ void cb_question(alpm_question_t *question)
}
/* callback to handle display of transaction progress */
-void cb_progress(alpm_progress_t event, const char *pkgname, int percent,
- size_t howmany, size_t current)
+void cb_progress(void *ctx, alpm_progress_t event, const char *pkgname,
+ int percent, size_t howmany, size_t current)
{
static int prevpercent;
static size_t prevcurrent;
@@ -573,6 +575,8 @@ void cb_progress(alpm_progress_t event, const char *pkgname, int percent,
const unsigned short cols = getcols();
+ (void)ctx;
+
if(config->noprogressbar || cols == 0) {
return;
}
@@ -1067,8 +1071,9 @@ static void dload_complete_event(const char *filename, alpm_download_event_compl
}
/* Callback to handle display of download progress */
-void cb_download(const char *filename, alpm_download_event_type_t event, void *data)
+void cb_download(void *ctx, const char *filename, alpm_download_event_type_t event, void *data)
{
+ (void)ctx;
if(event == ALPM_DOWNLOAD_INIT) {
dload_init_event(filename, data);
} else if(event == ALPM_DOWNLOAD_PROGRESS) {
@@ -1082,8 +1087,9 @@ void cb_download(const char *filename, alpm_download_event_type_t event, void *d
}
/* Callback to handle notifications from the library */
-void cb_log(alpm_loglevel_t level, const char *fmt, va_list args)
+void cb_log(void *ctx, alpm_loglevel_t level, const char *fmt, va_list args)
{
+ (void)ctx;
if(!fmt || strlen(fmt) == 0) {
return;
}
diff --git a/src/pacman/callback.h b/src/pacman/callback.h
index 8ac9d960..83cf8cdd 100644
--- a/src/pacman/callback.h
+++ b/src/pacman/callback.h
@@ -26,22 +26,22 @@
#include <alpm.h>
/* callback to handle messages/notifications from libalpm */
-void cb_event(alpm_event_t *event);
+void cb_event(void *ctx, alpm_event_t *event);
/* callback to handle questions from libalpm (yes/no) */
-void cb_question(alpm_question_t *question);
+void cb_question(void *ctx, alpm_question_t *question);
/* callback to handle display of progress */
-void cb_progress(alpm_progress_t event, const char *pkgname, int percent,
- size_t howmany, size_t remain);
+void cb_progress(void *ctx, alpm_progress_t event, const char *pkgname,
+ int percent, size_t howmany, size_t remain);
/* callback to handle display of download progress */
-void cb_download(const char *filename, alpm_download_event_type_t event,
+void cb_download(void *ctx, const char *filename, alpm_download_event_type_t event,
void *data);
/* callback to handle messages/notifications from pacman library */
-__attribute__((format(printf, 2, 0)))
-void cb_log(alpm_loglevel_t level, const char *fmt, va_list args);
+__attribute__((format(printf, 3, 0)))
+void cb_log(void *ctx, alpm_loglevel_t level, const char *fmt, va_list args);
/* specify if multibar UI should move completed bars to the top of the screen */
void multibar_move_completed_up(bool value);
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 0f0c2cfb..12fee64c 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -278,8 +278,8 @@ static int systemvp(const char *file, char *const argv[])
}
/** External fetch callback */
-static int download_with_xfercommand(const char *url, const char *localpath,
- int force)
+static int download_with_xfercommand(void *ctx, const char *url,
+ const char *localpath, int force)
{
int ret = 0, retval;
int usepart = 0;
@@ -289,6 +289,8 @@ static int download_with_xfercommand(const char *url, const char *localpath,
const char **argv;
size_t i;
+ (void)ctx;
+
if(!config->xfercommand_argv) {
return -1;
}
@@ -843,11 +845,11 @@ static int setup_libalpm(void)
}
config->handle = handle;
- alpm_option_set_logcb(handle, cb_log);
- alpm_option_set_dlcb(handle, cb_download);
- alpm_option_set_eventcb(handle, cb_event);
- alpm_option_set_questioncb(handle, cb_question);
- alpm_option_set_progresscb(handle, cb_progress);
+ alpm_option_set_logcb(handle, cb_log, NULL);
+ alpm_option_set_dlcb(handle, cb_download, NULL);
+ alpm_option_set_eventcb(handle, cb_event, NULL);
+ alpm_option_set_questioncb(handle, cb_question, NULL);
+ alpm_option_set_progresscb(handle, cb_progress, NULL);
if(config->op == PM_OP_FILES) {
alpm_option_set_dbext(handle, ".files");
@@ -894,7 +896,7 @@ static int setup_libalpm(void)
}
if(config->xfercommand) {
- alpm_option_set_fetchcb(handle, download_with_xfercommand);
+ alpm_option_set_fetchcb(handle, download_with_xfercommand, NULL);
} else if(!(alpm_capabilities() & ALPM_CAPABILITY_DOWNLOADER)) {
pm_printf(ALPM_LOG_WARNING, _("no '%s' configured\n"), "XferCommand");
}
diff --git a/src/util/testpkg.c b/src/util/testpkg.c
index 28dcdc50..26600a9d 100644
--- a/src/util/testpkg.c
+++ b/src/util/testpkg.c
@@ -24,9 +24,10 @@
#include <alpm.h>
#include "util.h" /* For Localization */
-__attribute__((format(printf, 2, 0)))
-static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
+__attribute__((format(printf, 3, 0)))
+static void output_cb(void *ctx, alpm_loglevel_t level, const char *fmt, va_list args)
{
+ (void)ctx;
if(fmt[0] == '\0') {
return;
}
@@ -64,7 +65,7 @@ int main(int argc, char *argv[])
}
/* let us get log messages from libalpm */
- alpm_option_set_logcb(handle, output_cb);
+ alpm_option_set_logcb(handle, output_cb, NULL);
/* set gpgdir to default */
alpm_option_set_gpgdir(handle, GPGDIR);