[Libguestfs] [PATCH libldm 09/12] Move devmapper logging functionality into a single place.

Mykola Ivanets stenavin at gmail.com
Tue May 15 20:38:16 UTC 2018


Custom device mapper logging is initialized during libdm library
initialization in one place.
---
 src/ldm.c | 87 +++++++++++++++++++++++++------------------------------
 1 file changed, 40 insertions(+), 47 deletions(-)

diff --git a/src/ldm.c b/src/ldm.c
index f31a0aa..16934d6 100644
--- a/src/ldm.c
+++ b/src/ldm.c
@@ -236,6 +236,41 @@ ldm_error_get_type(void)
     return etype;
 }
 
+/* We catch log messages generated by device mapper with errno != 0 and store
+ * them here */
+static int _dm_err_last_level = 0;
+static const char *_dm_err_last_file = NULL;
+static int _dm_err_last_line = 0;
+static int _dm_err_last_errno = 0;
+static char *_dm_err_last_msg = NULL;
+
+static void
+_dm_log_fn(const int level, const char * const file, const int line,
+           const int dm_errno, const char *f, ...)
+{
+    if (dm_errno == 0) return;
+
+    _dm_err_last_level = level;
+    _dm_err_last_file = file;
+    _dm_err_last_line = line;
+
+    /* device-mapper doesn't set dm_errno usefully (it only seems to use
+     * EUNCLASSIFIED), so we capture errno directly and cross our fingers */
+    _dm_err_last_errno = errno;
+
+    if (_dm_err_last_msg) {
+        free(_dm_err_last_msg);
+        _dm_err_last_msg = NULL;
+    }
+
+    va_list ap;
+    va_start(ap, f);
+    if (vasprintf(&_dm_err_last_msg, f, ap) == -1) {
+        g_error("vasprintf");
+    }
+    va_end(ap);
+}
+
 /* Macros for exporting object properties */
 
 #define EXPORT_PROP_STRING(object, klass, property)                            \
@@ -287,6 +322,9 @@ ldm_dispose(GObject * const object)
     if (ldm->priv->disk_groups) {
         g_array_unref(ldm->priv->disk_groups); ldm->priv->disk_groups = NULL;
     }
+
+    /* Restore default logging function. */
+    dm_log_with_errno_init(NULL);
 }
 
 static void
@@ -295,6 +333,8 @@ ldm_init(LDM * const o)
     o->priv = LDM_GET_PRIVATE(o);
     bzero(o->priv, sizeof(*o->priv));
 
+    /* Provide our logging function. */
+    dm_log_with_errno_init(_dm_log_fn);
     dm_set_name_mangling_mode(DM_STRING_MANGLING_AUTO);
     dm_set_uuid_prefix(DM_UUID_PREFIX);
 }
@@ -2430,14 +2470,6 @@ _dm_vol_uuid(const LDMVolumePrivate * const vol)
     return dm_uuid;
 }
 
-/* We catch log messages generated by device mapper with errno != 0 and store
- * them here */
-static int _dm_err_last_level = 0;
-static const char *_dm_err_last_file = NULL;
-static int _dm_err_last_line = 0;
-static int _dm_err_last_errno = 0;
-static char *_dm_err_last_msg = NULL;
-
 struct dm_target {
     guint64 start;
     guint64 size;
@@ -3005,33 +3037,6 @@ out:
     return name;
 }
 
-static void
-_dm_log_fn(const int level, const char * const file, const int line,
-           const int dm_errno, const char *f, ...)
-{
-    if (dm_errno == 0) return;
-
-    _dm_err_last_level = level;
-    _dm_err_last_file = file;
-    _dm_err_last_line = line;
-
-    /* device-mapper doesn't set dm_errno usefully (it only seems to use
-     * EUNCLASSIFIED), so we capture errno directly and cross our fingers */
-    _dm_err_last_errno = errno;
-
-    if (_dm_err_last_msg) {
-        free(_dm_err_last_msg);
-        _dm_err_last_msg = NULL;
-    }
-
-    va_list ap;
-    va_start(ap, f);
-    if (vasprintf(&_dm_err_last_msg, f, ap) == -1) {
-        g_error("vasprintf");
-    }
-    va_end(ap);
-}
-
 GString *
 ldm_volume_dm_get_name(const LDMVolume * const o)
 {
@@ -3046,10 +3051,6 @@ ldm_volume_dm_create(const LDMVolume * const o, GString **created,
 
     const LDMVolumePrivate * const vol = o->priv;
 
-    /* We should really store the previous logging function and restore it
-     * afterwards, but the API doesn't allow this. */
-    dm_log_with_errno_init(_dm_log_fn);
-
     /* Check if the device already exists */
     GString *uuid = _dm_vol_uuid(vol);
     if (_dm_find_tree_node_by_uuid(uuid->str, NULL, NULL, err)) {
@@ -3082,8 +3083,6 @@ ldm_volume_dm_create(const LDMVolume * const o, GString **created,
         g_error("Unexpected volume type: %u", vol->type);
     }
 
-    dm_log_with_errno_init(NULL);
-
     gboolean r = name != NULL;
     
     if (created)
@@ -3102,10 +3101,6 @@ ldm_volume_dm_remove(const LDMVolume * const o, GString **removed,
 
     const LDMVolumePrivate * const vol = o->priv;
 
-    /* We should really store the previous logging function and restore it
-     * afterwards, but the API doesn't allow this. */
-    dm_log_with_errno_init(_dm_log_fn);
-
     gboolean r = FALSE;
 
     struct dm_tree *tree = NULL;
@@ -3151,7 +3146,5 @@ out:
     else if (name)
         g_string_free(name, TRUE);
 
-    dm_log_with_errno_init(NULL);
-
     return r;
 }
-- 
2.17.0




More information about the Libguestfs mailing list