[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