[lvm-devel] [PATCH 1/2] Add cmd logging for liblvm error reporting: All logging functions have an additional argument: The error code This makes the functions incompatible with the old ones.
Alasdair G Kergon
agk at redhat.com
Thu Jul 9 15:50:50 UTC 2009
This is the first patch I was thinking of for libdevmapper to
preserve compatibility.
Alasdair
Index: libdm/.exported_symbols
===================================================================
RCS file: /cvs/lvm2/LVM2/libdm/.exported_symbols,v
retrieving revision 1.37
diff -u -p -r1.37 .exported_symbols
--- libdm/.exported_symbols 17 Jun 2009 20:55:24 -0000 1.37
+++ libdm/.exported_symbols 9 Jul 2009 15:36:33 -0000
@@ -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
Index: libdm/libdevmapper.h
===================================================================
RCS file: /cvs/lvm2/LVM2/libdm/libdevmapper.h,v
retrieving revision 1.90
diff -u -p -r1.90 libdevmapper.h
--- libdm/libdevmapper.h 17 Jun 2009 20:55:24 -0000 1.90
+++ libdm/libdevmapper.h 9 Jul 2009 15:36:34 -0000
@@ -30,30 +30,40 @@
#include <stdio.h>
/*****************************************************************
- * 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)));
-
+void dm_log_init(dm_log_fn fn);
/*
- * 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.
+ * For backward-compatibility, indicate that dm_log_init() was used
+ * to set a non-default value of dm_log().
*/
-void dm_log_init(dm_log_fn fn);
-void dm_log_init_verbose(int level);
+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);
Index: libdm/libdm-common.c
===================================================================
RCS file: /cvs/lvm2/LVM2/libdm/libdm-common.c,v
retrieving revision 1.65
diff -u -p -r1.65 libdm-common.c
--- libdm/libdm-common.c 17 Jun 2009 20:55:24 -0000 1.65
+++ libdm/libdm-common.c 9 Jul 2009 15:36:35 -0000
@@ -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, cons
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)
Index: libdm/misc/dm-logging.h
===================================================================
RCS file: /cvs/lvm2/LVM2/libdm/misc/dm-logging.h,v
retrieving revision 1.1
diff -u -p -r1.1 dm-logging.h
--- libdm/misc/dm-logging.h 30 Oct 2008 17:54:12 -0000 1.1
+++ libdm/misc/dm-logging.h 9 Jul 2009 15:36:35 -0000
@@ -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 plog(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"
More information about the lvm-devel
mailing list