[PATCH 5/6] Provide an internal function to dump the log buffer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



An old virLogDump() function was left in the logging code but commented
out, this resurrects it, fixes the callback function used and the
internal code
* src/util/logging.c src/util/logging.h: provide and expose virLogDump()
* src/libvirt_private.syms: exports it as a private symbol

Signed-off-by: Daniel Veillard <veillard@xxxxxxxxxx>
---
 src/libvirt_private.syms |    1 +
 src/util/logging.c       |   64 ++++++++++++++++++++++++---------------------
 src/util/logging.h       |   12 ++++++++
 3 files changed, 47 insertions(+), 30 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 5e63a12..cec2762 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -541,6 +541,7 @@ virRegisterStorageDriver;
 # logging.h
 virLogDefineFilter;
 virLogDefineOutput;
+virLogDump;
 virLogGetDefaultPriority;
 virLogGetFilters;
 virLogGetNbFilters;
diff --git a/src/util/logging.c b/src/util/logging.c
index b946285..d339750 100644
--- a/src/util/logging.c
+++ b/src/util/logging.c
@@ -277,50 +277,54 @@ static void virLogStr(const char *str, int len) {
     virLogUnlock();
 }
 
-#if 0
+
 /*
- * Output the ring buffer
+ * virLogDump:
+ * @data: user data passed as first argument to @f
+ * @f: function used to dump the buffer content
+ *
+ * Output the ring buffer through the given function @f, which may be
+ * called multiple times to fully emit the buffer content
+ *
+ * Returns 0 in case of success, -1 in case of error.
  */
-static int virLogDump(void *data, virLogOutputFunc f) {
-    int ret = 0, tmp;
+int
+virLogDump(void *data, virLogDumpFunc f) {
+    int ret = 0, tmp, len;
 
     if ((virLogLen == 0) || (f == NULL))
         return 0;
     virLogLock();
-    if (virLogStart + virLogLen < LOG_BUFFER_SIZE) {
-push_end:
-        virLogBuffer[virLogStart + virLogLen] = 0;
-        tmp = f(data, &virLogBuffer[virLogStart], virLogLen);
-        if (tmp < 0) {
-            ret = -1;
-            goto error;
-        }
-        ret += tmp;
-        virLogStart += tmp;
-        virLogLen -= tmp;
-    } else {
-        tmp = LOG_BUFFER_SIZE - virLogStart;
-        ret = f(data, &virLogBuffer[virLogStart], tmp);
-        if (ret < 0) {
-            ret = -1;
-            goto error;
-        }
-        if (ret < tmp) {
-            virLogStart += ret;
-            virLogLen -= ret;
+    while (virLogLen > 0) {
+        if (virLogStart + virLogLen < LOG_BUFFER_SIZE) {
+            virLogBuffer[virLogStart + virLogLen] = 0;
+            tmp = f(data, &virLogBuffer[virLogStart], virLogLen);
+            if (tmp <= 0) {
+                ret = -1;
+                goto error;
+            }
+            ret += tmp;
+            virLogStart += tmp;
+            virLogLen -= tmp;
         } else {
-            virLogStart = 0;
+            len = LOG_BUFFER_SIZE - virLogStart;
+            virLogBuffer[LOG_BUFFER_SIZE] = 0;
+            tmp = f(data, &virLogBuffer[virLogStart], len);
+            if (tmp <= 0) {
+                ret = -1;
+                goto error;
+            }
             virLogLen -= tmp;
-            /* dump the second part */
-            if (virLogLen > 0)
-                goto push_end;
+            if (tmp < len)
+                virLogStart += tmp;
+            else
+                virLogStart = 0;
         }
     }
 error:
     virLogUnlock();
     return ret;
 }
-#endif
 
 /**
  * virLogSetDefaultPriority:
diff --git a/src/util/logging.h b/src/util/logging.h
index 2e2734e..df70aca 100644
--- a/src/util/logging.h
+++ b/src/util/logging.h
@@ -133,5 +133,17 @@ extern int virLogParseOutputs(const char *output);
 extern void virLogMessage(const char *category, int priority,
                           const char *funcname, long long linenr, int flags,
                           const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(6, 7);
+/**
+ * virLogDumpFunc:
+ * @data: user argument
+ * @buf: the buffer
+ * @len: the lenght of the buffer in bytes without the terminating zero
+ *
+ * Callback function used to dump the log buffer
+ *
+ * Returns the number of bytes written or -1 in case of error
+ */
+typedef int (*virLogDumpFunc) (void *data, const char *buf, int len);
 
+extern int virLogDump(void *data, virLogDumpFunc f);
 #endif
--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]