From 7e7274b002956a377d1f02c97d2ba96f4da1de59 Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Fri, 10 Jul 2009 09:59:37 +0000 Subject: [PATCH] Add dm_log_with_errno and dm_log_with_errno_init, deprecating the old Change plog to use dm_log_with_errno unless deprecated dm_log_init was used. Rename plog macro to LOG_LINE and use in dm_dump_memory_debug. --- WHATS_NEW_DM | 3 +++ lib/log/log.h | 14 +++++------ lib/log/lvm-logging.h | 2 +- libdm/.exported_symbols | 3 +++ libdm/libdevmapper.h | 45 +++++++++++++++++++++++------------ libdm/libdm-common.c | 52 +++++++++++++++++++++++++++++++++++------ libdm/misc/dm-logging.h | 9 ++++++- libdm/mm/dbg_malloc.c | 6 ++--- po/pogen.h | 3 +++ 9 files changed, 103 insertions(+), 34 deletions(-) diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM index d6a03cfb9..0b3c62029 100644 --- a/WHATS_NEW_DM +++ b/WHATS_NEW_DM @@ -1,5 +1,8 @@ Version 1.02.34 - ================================ + Rename plog macro to LOG_LINE and use in dm_dump_memory_debug. + Change plog to use dm_log_with_errno unless deprecated dm_log_init was used. + Add dm_log_with_errno and dm_log_with_errno_init, deprecating the old fns. Fix whitespace in linear target line to fix identical table line detection. Add device number to more log messages during activation. diff --git a/lib/log/log.h b/lib/log/log.h index 09a75ad70..110f1b0e9 100644 --- a/lib/log/log.h +++ b/lib/log/log.h @@ -50,17 +50,17 @@ #define _LOG_ERR 3 #define _LOG_FATAL 2 -#define log_debug(x...) plog(_LOG_DEBUG, x) -#define log_info(x...) plog(_LOG_INFO, x) -#define log_notice(x...) plog(_LOG_NOTICE, x) -#define log_warn(x...) plog(_LOG_WARN | _LOG_STDERR, x) -#define log_err(x...) plog(_LOG_ERR, x) -#define log_fatal(x...) plog(_LOG_FATAL, x) +#define log_debug(x...) LOG_LINE(_LOG_DEBUG, x) +#define log_info(x...) LOG_LINE(_LOG_INFO, x) +#define log_notice(x...) LOG_LINE(_LOG_NOTICE, x) +#define log_warn(x...) LOG_LINE(_LOG_WARN | _LOG_STDERR, x) +#define log_err(x...) LOG_LINE(_LOG_ERR, x) +#define log_fatal(x...) LOG_LINE(_LOG_FATAL, x) #define stack log_debug("") /* Backtrace on error */ #define log_very_verbose(args...) log_info(args) #define log_verbose(args...) log_notice(args) -#define log_print(args...) plog(_LOG_WARN, args) +#define log_print(args...) LOG_LINE(_LOG_WARN, args) #define log_error(args...) log_err(args) /* System call equivalents */ diff --git a/lib/log/lvm-logging.h b/lib/log/lvm-logging.h index 70693eaf7..d267e2336 100644 --- a/lib/log/lvm-logging.h +++ b/lib/log/lvm-logging.h @@ -19,7 +19,7 @@ void print_log(int level, const char *file, int line, const char *format, ...) __attribute__ ((format(printf, 4, 5))); -#define plog(l, x...) print_log(l, __FILE__, __LINE__ , ## x) +#define LOG_LINE(l, x...) print_log(l, __FILE__, __LINE__ , ## x) #include "log.h" diff --git a/libdm/.exported_symbols b/libdm/.exported_symbols index f5d3852ce..bea4a55b8 100644 --- a/libdm/.exported_symbols +++ b/libdm/.exported_symbols @@ -6,6 +6,9 @@ dm_fclose dm_get_library_version dm_log dm_log_init +dm_log_is_non_default +dm_log_with_errno +dm_log_with_errno_init dm_log_init_verbose dm_task_create dm_task_destroy diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h index 3cecf4c1b..69faa80e6 100644 --- a/libdm/libdevmapper.h +++ b/libdm/libdevmapper.h @@ -30,30 +30,40 @@ #include /***************************************************************** - * The first section of this file provides direct access to the - * individual device-mapper ioctls. + * The first section of this file provides direct access to the + * individual device-mapper ioctls. Since it is quite laborious to + * build the ioctl arguments for the device-mapper, people are + * encouraged to use this library. ****************************************************************/ /* - * Since it is quite laborious to build the ioctl - * arguments for the device-mapper people are - * encouraged to use this library. - * - * You will need to build a struct dm_task for - * each ioctl command you want to execute. + * The library user may wish to register their own + * logging function. By default errors go to stderr. + * Use dm_log_with_errno_init(NULL) to restore the default log fn. */ +typedef void (*dm_log_with_errno_fn) (int level, const char *file, int line, + int dm_errno, const char *f, ...) + __attribute__ ((format(printf, 5, 6))); + +void dm_log_with_errno_init(dm_log_with_errno_fn fn); +void dm_log_init_verbose(int level); + +/* + * Original version of this function. + * dm_errno is set to 0. + * + * Deprecated: Use the _with_errno_ versions above instead. + */ typedef void (*dm_log_fn) (int level, const char *file, int line, const char *f, ...) __attribute__ ((format(printf, 4, 5))); - -/* - * The library user may wish to register their own - * logging function, by default errors go to stderr. - * Use dm_log_init(NULL) to restore the default log fn. - */ void dm_log_init(dm_log_fn fn); -void dm_log_init_verbose(int level); +/* + * For backward-compatibility, indicate that dm_log_init() was used + * to set a non-default value of dm_log(). + */ +int dm_log_is_non_default(void); enum { DM_DEVICE_CREATE, @@ -87,6 +97,11 @@ enum { DM_DEVICE_SET_GEOMETRY }; +/* + * You will need to build a struct dm_task for + * each ioctl command you want to execute. + */ + struct dm_task; struct dm_task *dm_task_create(int type); diff --git a/libdm/libdm-common.c b/libdm/libdm-common.c index 924692339..c44b794c1 100644 --- a/libdm/libdm-common.c +++ b/libdm/libdm-common.c @@ -42,10 +42,12 @@ static int _verbose = 0; * Library users can provide their own logging * function. */ -static void _default_log(int level, const char *file __attribute((unused)), - int line __attribute((unused)), const char *f, ...) + +static void _default_log_line(int level, + const char *file __attribute((unused)), + int line __attribute((unused)), int dm_errno, + const char *f, va_list ap) { - va_list ap; int use_stderr = level & _LOG_STDERR; level &= ~_LOG_STDERR; @@ -53,22 +55,41 @@ static void _default_log(int level, const char *file __attribute((unused)), if (level > _LOG_WARN && !_verbose) return; - va_start(ap, f); - if (level < _LOG_WARN) vfprintf(stderr, f, ap); else vfprintf(use_stderr ? stderr : stdout, f, ap); - va_end(ap); - if (level < _LOG_WARN) fprintf(stderr, "\n"); else fprintf(use_stderr ? stderr : stdout, "\n"); } +static void _default_log_with_errno(int level, + const char *file __attribute((unused)), + int line __attribute((unused)), int dm_errno, + const char *f, ...) +{ + va_list ap; + + va_start(ap, f); + _default_log_line(level, file, line, dm_errno, f, ap); + va_end(ap); +} + +static void _default_log(int level, const char *file, + int line, const char *f, ...) +{ + va_list ap; + + va_start(ap, f); + _default_log_line(level, file, line, 0, f, ap); + va_end(ap); +} + dm_log_fn dm_log = _default_log; +dm_log_with_errno_fn dm_log_with_errno = _default_log_with_errno; void dm_log_init(dm_log_fn fn) { @@ -76,6 +97,23 @@ void dm_log_init(dm_log_fn fn) dm_log = fn; else dm_log = _default_log; + + dm_log_with_errno = _default_log_with_errno; +} + +int dm_log_is_non_default(void) +{ + return (dm_log == _default_log) ? 0 : 1; +} + +void dm_log_with_errno_init(dm_log_with_errno_fn fn) +{ + if (fn) + dm_log_with_errno = fn; + else + dm_log_with_errno = _default_log_with_errno; + + dm_log = _default_log; } void dm_log_init_verbose(int level) diff --git a/libdm/misc/dm-logging.h b/libdm/misc/dm-logging.h index b25bc55bb..d2f235917 100644 --- a/libdm/misc/dm-logging.h +++ b/libdm/misc/dm-logging.h @@ -19,8 +19,15 @@ #include "libdevmapper.h" extern dm_log_fn dm_log; +extern dm_log_with_errno_fn dm_log_with_errno; -#define plog(l, x...) dm_log(l, __FILE__, __LINE__, ## x) +#define LOG_LINE(l, x...) \ + do { \ + if (dm_log_is_non_default()) \ + dm_log(l, __FILE__, __LINE__, ## x); \ + else \ + dm_log_with_errno(l, __FILE__, __LINE__, 0, ## x); \ + } while (0) #include "log.h" diff --git a/libdm/mm/dbg_malloc.c b/libdm/mm/dbg_malloc.c index ef53fc51b..24ddc37c9 100644 --- a/libdm/mm/dbg_malloc.c +++ b/libdm/mm/dbg_malloc.c @@ -205,9 +205,9 @@ int dm_dump_memory_debug(void) } str[sizeof(str) - 1] = '\0'; - dm_log(_LOG_INFO, mb->file, mb->line, - "block %d at %p, size %" PRIsize_t "\t [%s]", - mb->id, mb->magic, mb->length, str); + LOG_LINE(_LOG_INFO, mb->file, mb->line, + "block %d at %p, size %" PRIsize_t "\t [%s]", + mb->id, mb->magic, mb->length, str); tot += mb->length; } diff --git a/po/pogen.h b/po/pogen.h index 2be92ba70..6ab815451 100644 --- a/po/pogen.h +++ b/po/pogen.h @@ -21,3 +21,6 @@ #define print_log(level, file, line, format, args...) print_log(format, args) #define dm_log(level, file, line, format, args...) dm_log(format, args) +#define dm_log_with_errno(level, file, line, format, dm_errno, args...) \ + dm_log(format, args) +