[pacman-dev] [PATCH] Revert "Remove log_cb, add ALPM_EVENT_LOG instead"
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@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
On 29/09/14 07:45, Andrew Gregory wrote:
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@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
Completely forgot about this. I am happy for the to be reverted. If a complete solution to make logging an even happens later, I will be happy to include it. Allan
participants (2)
-
Allan McRae
-
Andrew Gregory