[pacman-dev] [PATCH v2 4/7] Remove log_cb, add ALPM_EVENT_LOG instead

Olivier Brunel jjk at jjacky.com
Fri Jan 10 10:25:15 EST 2014


When ALPM emits a log message, it still goes through _alpm_log() but
instead of calling a specific log callback, it goes as an event.

Signed-off-by: Olivier Brunel <jjk at jjacky.com>
---
 lib/libalpm/alpm.h      | 37 +++++++++++++++++++++----------------
 lib/libalpm/handle.c    | 13 -------------
 lib/libalpm/handle.h    |  1 -
 lib/libalpm/log.c       | 14 +++++++++-----
 src/pacman/callback.c   | 36 ++++++++++++++++++------------------
 src/pacman/callback.h   |  4 ----
 src/pacman/conf.c       |  1 -
 src/util/cleanupdelta.c | 14 ++++++++------
 src/util/testdb.c       | 14 ++++++++------
 src/util/testpkg.c      | 14 ++++++++------
 10 files changed, 72 insertions(+), 76 deletions(-)

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 9379372..2234a77 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -261,16 +261,6 @@ typedef struct _alpm_siglist_t {
  * Logging facilities
  */
 
-/** Logging Levels */
-typedef enum _alpm_loglevel_t {
-	ALPM_LOG_ERROR    = 1,
-	ALPM_LOG_WARNING  = (1 << 1),
-	ALPM_LOG_DEBUG    = (1 << 2),
-	ALPM_LOG_FUNCTION = (1 << 3)
-} alpm_loglevel_t;
-
-typedef void (*alpm_cb_log)(alpm_loglevel_t, const char *, va_list);
-
 int alpm_logaction(alpm_handle_t *handle, const char *prefix,
 		const char *fmt, ...) __attribute__((format(printf, 3, 4)));
 
@@ -345,7 +335,9 @@ typedef enum _alpm_event_type_t {
 	/** Downloading missing keys into keyring. */
 	ALPM_EVENT_KEY_DOWNLOAD_START,
 	/** Key downloading is finished. */
-	ALPM_EVENT_KEY_DOWNLOAD_DONE
+	ALPM_EVENT_KEY_DOWNLOAD_DONE,
+	/** A log message was emitted; See alpm_event_log_t for arguments. */
+	ALPM_EVENT_LOG
 } alpm_event_type_t;
 
 /** Events.
@@ -412,6 +404,24 @@ typedef struct _alpm_event_database_missing_t {
 	const char *dbname;
 } alpm_event_database_missing_t;
 
+/** Log levels. */
+typedef enum _alpm_loglevel_t {
+	ALPM_LOG_ERROR    = 1,
+	ALPM_LOG_WARNING  = (1 << 1),
+	ALPM_LOG_DEBUG    = (1 << 2),
+	ALPM_LOG_FUNCTION = (1 << 3)
+} alpm_loglevel_t;
+
+typedef struct _alpm_event_log_t {
+	/** Type of event. */
+	alpm_event_type_t type;
+	/** Log level. */
+	alpm_loglevel_t level;
+	/** Message. */
+	const char *fmt;
+	va_list args;
+} alpm_event_log_t;
+
 /** Event callback. */
 typedef void (*alpm_cb_event)(alpm_event_t *);
 
@@ -487,11 +497,6 @@ char *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url);
  * @{
  */
 
-/** Returns the callback used for logging. */
-alpm_cb_log alpm_option_get_logcb(alpm_handle_t *handle);
-/** Sets the callback used for logging. */
-int alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb);
-
 /** Returns the callback used to report download progress. */
 alpm_cb_download alpm_option_get_dlcb(alpm_handle_t *handle);
 /** Sets the callback used to report download progress. */
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index 44457e6..1f35a79 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -132,12 +132,6 @@ int _alpm_handle_unlock(alpm_handle_t *handle)
 }
 
 
-alpm_cb_log SYMEXPORT alpm_option_get_logcb(alpm_handle_t *handle)
-{
-	CHECK_HANDLE(handle, return NULL);
-	return handle->logcb;
-}
-
 alpm_cb_download SYMEXPORT alpm_option_get_dlcb(alpm_handle_t *handle)
 {
 	CHECK_HANDLE(handle, return NULL);
@@ -258,13 +252,6 @@ int SYMEXPORT alpm_option_get_checkspace(alpm_handle_t *handle)
 	return handle->checkspace;
 }
 
-int SYMEXPORT alpm_option_set_logcb(alpm_handle_t *handle, alpm_cb_log cb)
-{
-	CHECK_HANDLE(handle, return -1);
-	handle->logcb = cb;
-	return 0;
-}
-
 int SYMEXPORT alpm_option_set_dlcb(alpm_handle_t *handle, alpm_cb_download cb)
 {
 	CHECK_HANDLE(handle, return -1);
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index d767fb6..2acbfc8 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -63,7 +63,6 @@ struct __alpm_handle_t {
 #endif
 
 	/* callback functions */
-	alpm_cb_log logcb;          /* Log callback function */
 	alpm_cb_download dlcb;      /* Download callback function */
 	alpm_cb_totaldl totaldlcb;  /* Total download callback function */
 	alpm_cb_fetch fetchcb;      /* Download file callback function */
diff --git a/lib/libalpm/log.c b/lib/libalpm/log.c
index c4a9d84..b8fdea8 100644
--- a/lib/libalpm/log.c
+++ b/lib/libalpm/log.c
@@ -81,15 +81,19 @@ int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *prefix,
 
 void _alpm_log(alpm_handle_t *handle, alpm_loglevel_t flag, const char *fmt, ...)
 {
-	va_list args;
+	alpm_event_log_t event = {
+		.type = ALPM_EVENT_LOG,
+		.level = flag,
+		.fmt = fmt
+	};
 
-	if(handle == NULL || handle->logcb == NULL) {
+	if(handle == NULL || handle->eventcb == NULL) {
 		return;
 	}
 
-	va_start(args, fmt);
-	handle->logcb(flag, fmt, args);
-	va_end(args);
+	va_start(event.args, fmt);
+	EVENT(handle, &event);
+	va_end(event.args);
 }
 
 /* vim: set ts=2 sw=2 noet: */
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 8b67ffc..5a6961d 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -270,6 +270,24 @@ void cb_event(alpm_event_t *event)
 					((alpm_event_database_missing_t *) event)->dbname);
 			}
 			break;
+		case ALPM_EVENT_LOG:
+			{
+				alpm_event_log_t *e = (alpm_event_log_t *) event;
+				if(!e->fmt || strlen(e->fmt) == 0) {
+					break;
+				}
+
+				if(on_progress) {
+					char *string = NULL;
+					pm_vasprintf(&string, e->level, e->fmt, e->args);
+					if(string != NULL) {
+						output = alpm_list_add(output, string);
+					}
+				} else {
+					pm_vfprintf(stderr, e->level, e->fmt, e->args);
+				}
+			}
+			break;
 		/* all the simple done events, with fallthrough for each */
 		case ALPM_EVENT_FILECONFLICTS_DONE:
 		case ALPM_EVENT_CHECKDEPS_DONE:
@@ -777,22 +795,4 @@ void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total)
 	return;
 }
 
-/* Callback to handle notifications from the library */
-void cb_log(alpm_loglevel_t level, const char *fmt, va_list args)
-{
-	if(!fmt || strlen(fmt) == 0) {
-		return;
-	}
-
-	if(on_progress) {
-		char *string = NULL;
-		pm_vasprintf(&string, level, fmt, args);
-		if(string != NULL) {
-			output = alpm_list_add(output, string);
-		}
-	} else {
-		pm_vfprintf(stderr, level, fmt, args);
-	}
-}
-
 /* vim: set ts=2 sw=2 noet: */
diff --git a/src/pacman/callback.h b/src/pacman/callback.h
index cdc8ee7..31abb4e 100644
--- a/src/pacman/callback.h
+++ b/src/pacman/callback.h
@@ -40,10 +40,6 @@ void cb_dl_total(off_t total);
 /* callback to handle display of download progress */
 void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total);
 
-/* 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);
-
 #endif /* _PM_CALLBACK_H */
 
 /* vim: set ts=2 sw=2 noet: */
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 5450f3b..051481a 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -675,7 +675,6 @@ static int setup_libalpm(void)
 	}
 	config->handle = handle;
 
-	alpm_option_set_logcb(handle, cb_log);
 	alpm_option_set_dlcb(handle, cb_dl_progress);
 	alpm_option_set_eventcb(handle, cb_event);
 	alpm_option_set_questioncb(handle, cb_question);
diff --git a/src/util/cleanupdelta.c b/src/util/cleanupdelta.c
index b57b203..558e03d 100644
--- a/src/util/cleanupdelta.c
+++ b/src/util/cleanupdelta.c
@@ -35,17 +35,19 @@ static void cleanup(int signum)
 	exit(signum);
 }
 
-__attribute__((format(printf, 2, 0)))
-static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
+static void output_cb(alpm_event_log_t *event)
 {
-	if(strlen(fmt)) {
-		switch(level) {
+	if(event->type != ALPM_EVENT_LOG) {
+		return;
+	}
+	if(strlen(event->fmt)) {
+		switch(event->level) {
 			case ALPM_LOG_ERROR: printf("error: "); break;
 			case ALPM_LOG_WARNING: printf("warning: "); break;
 			/* case ALPM_LOG_DEBUG: printf("debug: "); break; */
 			default: return;
 		}
-		vprintf(fmt, args);
+		vprintf(event->fmt, event->args);
 	}
 }
 
@@ -126,7 +128,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* let us get log messages from libalpm */
-	alpm_option_set_logcb(handle, output_cb);
+	alpm_option_set_eventcb(handle, (alpm_cb_event) output_cb);
 
 	checkdbs(dbnames);
 	alpm_list_free(dbnames);
diff --git a/src/util/testdb.c b/src/util/testdb.c
index 53cdb3c..8940e3b 100644
--- a/src/util/testdb.c
+++ b/src/util/testdb.c
@@ -39,16 +39,18 @@ static void cleanup(int signum)
 	exit(signum);
 }
 
-__attribute__((format(printf, 2, 0)))
-static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
+static void output_cb(alpm_event_log_t *event)
 {
-	if(strlen(fmt)) {
-		switch(level) {
+	if(event->type != ALPM_EVENT_LOG) {
+		return;
+	}
+	if(strlen(event->fmt)) {
+		switch(event->level) {
 			case ALPM_LOG_ERROR: printf("error: "); break;
 			case ALPM_LOG_WARNING: printf("warning: "); break;
 			default: return;
 		}
-		vprintf(fmt, args);
+		vprintf(event->fmt, event->args);
 	}
 }
 
@@ -282,7 +284,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* let us get log messages from libalpm */
-	alpm_option_set_logcb(handle, output_cb);
+	alpm_option_set_eventcb(handle, (alpm_cb_event) output_cb);
 
 	if(!dbnames) {
 		errors = check_localdb();
diff --git a/src/util/testpkg.c b/src/util/testpkg.c
index cc7d9c2..39807fe 100644
--- a/src/util/testpkg.c
+++ b/src/util/testpkg.c
@@ -23,18 +23,20 @@
 
 #include <alpm.h>
 
-__attribute__((format(printf, 2, 0)))
-static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
+static void output_cb(alpm_event_log_t *event)
 {
-	if(fmt[0] == '\0') {
+	if(event->type != ALPM_EVENT_LOG) {
 		return;
 	}
-	switch(level) {
+	if(event->fmt[0] == '\0') {
+		return;
+	}
+	switch(event->level) {
 		case ALPM_LOG_ERROR: printf("error: "); break;
 		case ALPM_LOG_WARNING: printf("warning: "); break;
 		default: return; /* skip other messages */
 	}
-	vprintf(fmt, args);
+	vprintf(event->fmt, event->args);
 }
 
 int main(int argc, char *argv[])
@@ -59,7 +61,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* let us get log messages from libalpm */
-	alpm_option_set_logcb(handle, output_cb);
+	alpm_option_set_eventcb(handle, (alpm_cb_event) output_cb);
 
 	/* set gpgdir to default */
 	alpm_option_set_gpgdir(handle, GPGDIR);
-- 
1.8.5.2



More information about the pacman-dev mailing list