[pacman-dev] [PATCH] Revert "Remove log_cb, add ALPM_EVENT_LOG instead"

Andrew Gregory andrew.gregory.8 at gmail.com
Sun Sep 28 21:45:35 UTC 2014


Moving logging to the event callback caused warnings
under clang due to non-literal format strings and
silenced all log messages when --print was used.

This reverts commit cd793c5ab7689cc8cbc18277375b368060e5acfe.

Signed-off-by: Andrew Gregory <andrew.gregory.8 at gmail.com>

Conflicts:
	lib/libalpm/alpm.h
	src/pacman/callback.c
---

Making sure this doesn't fall through the cracks prior
to 4.2.  Previous discussion here:
https://lists.archlinux.org/pipermail/pacman-dev/2014-June/019136.html

 lib/libalpm/alpm.h      | 36 +++++++++++++++---------------------
 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, 75 insertions(+), 72 deletions(-)

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 751fa63..1cfd4f5 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -343,6 +343,16 @@ 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)));
 
@@ -431,8 +441,6 @@ typedef enum _alpm_event_type_t {
 	ALPM_EVENT_KEY_DOWNLOAD_START,
 	/** Key downloading is finished. */
 	ALPM_EVENT_KEY_DOWNLOAD_DONE,
-	/** A log message was emitted; See alpm_event_log_t for arguments. */
-	ALPM_EVENT_LOG,
 	/** A .pacnew file was created; See alpm_event_pacnew_created_t for arguments. */
 	ALPM_EVENT_PACNEW_CREATED,
 	/** A .pacsave file was created; See alpm_event_pacsave_created_t for
@@ -502,24 +510,6 @@ 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;
-
 typedef struct _alpm_event_pkgdownload_t {
 	/** Type of event. */
 	alpm_event_type_t type;
@@ -571,7 +561,6 @@ typedef union _alpm_event_t {
 	alpm_event_delta_patch_t delta_patch;
 	alpm_event_scriptlet_info_t scriptlet_info;
 	alpm_event_database_missing_t database_missing;
-	alpm_event_log_t log;
 	alpm_event_pkgdownload_t pkgdownload;
 	alpm_event_pacnew_created_t pacnew_created;
 	alpm_event_pacsave_created_t pacsave_created;
@@ -749,6 +738,11 @@ 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 7652d1f..0d8ea34 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -143,6 +143,12 @@ 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);
@@ -263,6 +269,13 @@ 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 85c64f6..9cd3a21 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -63,6 +63,7 @@ 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 aac55e7..d232bcc 100644
--- a/lib/libalpm/log.c
+++ b/lib/libalpm/log.c
@@ -81,19 +81,15 @@ 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, ...)
 {
-	alpm_event_log_t event = {
-		.type = ALPM_EVENT_LOG,
-		.level = flag,
-		.fmt = fmt
-	};
+	va_list args;
 
-	if(handle == NULL || handle->eventcb == NULL) {
+	if(handle == NULL || handle->logcb == NULL) {
 		return;
 	}
 
-	va_start(event.args, fmt);
-	EVENT(handle, &event);
-	va_end(event.args);
+	va_start(args, fmt);
+	handle->logcb(flag, fmt, args);
+	va_end(args);
 }
 
 /* vim: set noet: */
diff --git a/src/pacman/callback.c b/src/pacman/callback.c
index 1d68db4..4993382 100644
--- a/src/pacman/callback.c
+++ b/src/pacman/callback.c
@@ -281,24 +281,6 @@ void cb_event(alpm_event_t *event)
 					event->database_missing.dbname);
 			}
 			break;
-		case ALPM_EVENT_LOG:
-			{
-				alpm_event_log_t *e = &event->log;
-				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;
 		case ALPM_EVENT_PACNEW_CREATED:
 			{
 				alpm_event_pacnew_created_t *e = &event->pacnew_created;
@@ -862,4 +844,22 @@ 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 noet: */
diff --git a/src/pacman/callback.h b/src/pacman/callback.h
index e4941fc..5480c73 100644
--- a/src/pacman/callback.h
+++ b/src/pacman/callback.h
@@ -39,6 +39,10 @@ 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 noet: */
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 0e483f7..8b298cc 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -684,6 +684,7 @@ 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 190e2c7..4a67fc3 100644
--- a/src/util/cleanupdelta.c
+++ b/src/util/cleanupdelta.c
@@ -35,19 +35,17 @@ static void cleanup(int signum)
 	exit(signum);
 }
 
-static void output_cb(alpm_event_log_t *event)
+__attribute__((format(printf, 2, 0)))
+static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
 {
-	if(event->type != ALPM_EVENT_LOG) {
-		return;
-	}
-	if(strlen(event->fmt)) {
-		switch(event->level) {
+	if(strlen(fmt)) {
+		switch(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(event->fmt, event->args);
+		vprintf(fmt, args);
 	}
 }
 
@@ -128,7 +126,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* let us get log messages from libalpm */
-	alpm_option_set_eventcb(handle, (alpm_cb_event) output_cb);
+	alpm_option_set_logcb(handle, output_cb);
 
 	checkdbs(dbnames);
 	alpm_list_free(dbnames);
diff --git a/src/util/testdb.c b/src/util/testdb.c
index 4d1fd4c..e3b331a 100644
--- a/src/util/testdb.c
+++ b/src/util/testdb.c
@@ -39,18 +39,16 @@ static void cleanup(int signum)
 	exit(signum);
 }
 
-static void output_cb(alpm_event_log_t *event)
+__attribute__((format(printf, 2, 0)))
+static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
 {
-	if(event->type != ALPM_EVENT_LOG) {
-		return;
-	}
-	if(strlen(event->fmt)) {
-		switch(event->level) {
+	if(strlen(fmt)) {
+		switch(level) {
 			case ALPM_LOG_ERROR: printf("error: "); break;
 			case ALPM_LOG_WARNING: printf("warning: "); break;
 			default: return;
 		}
-		vprintf(event->fmt, event->args);
+		vprintf(fmt, args);
 	}
 }
 
@@ -284,7 +282,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* let us get log messages from libalpm */
-	alpm_option_set_eventcb(handle, (alpm_cb_event) output_cb);
+	alpm_option_set_logcb(handle, output_cb);
 
 	if(!dbnames) {
 		errors = check_localdb();
diff --git a/src/util/testpkg.c b/src/util/testpkg.c
index 39807fe..cc7d9c2 100644
--- a/src/util/testpkg.c
+++ b/src/util/testpkg.c
@@ -23,20 +23,18 @@
 
 #include <alpm.h>
 
-static void output_cb(alpm_event_log_t *event)
+__attribute__((format(printf, 2, 0)))
+static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args)
 {
-	if(event->type != ALPM_EVENT_LOG) {
+	if(fmt[0] == '\0') {
 		return;
 	}
-	if(event->fmt[0] == '\0') {
-		return;
-	}
-	switch(event->level) {
+	switch(level) {
 		case ALPM_LOG_ERROR: printf("error: "); break;
 		case ALPM_LOG_WARNING: printf("warning: "); break;
 		default: return; /* skip other messages */
 	}
-	vprintf(event->fmt, event->args);
+	vprintf(fmt, args);
 }
 
 int main(int argc, char *argv[])
@@ -61,7 +59,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* let us get log messages from libalpm */
-	alpm_option_set_eventcb(handle, (alpm_cb_event) output_cb);
+	alpm_option_set_logcb(handle, output_cb);
 
 	/* set gpgdir to default */
 	alpm_option_set_gpgdir(handle, GPGDIR);
-- 
2.1.1


More information about the pacman-dev mailing list