]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
Add a metadata parameter to virLog{, V}Message
authorMiloslav Trmač <mitr@redhat.com>
Wed, 17 Oct 2012 18:17:14 +0000 (20:17 +0200)
committerEric Blake <eblake@redhat.com>
Thu, 15 Nov 2012 02:08:31 +0000 (19:08 -0700)
... and update all users.  No change in functionality, the parameter
will be used later.

The metadata representation is as minimal as possible, but requires
the caller to allocate an array on stack explicitly.

The alternative of using varargs in the virLogMessage() callers:
* Would not allow the caller to optionally omit some metadata elements,
  except by having two calls to virLogMessage.
* Would not be as type-safe (e.g. using int vs. size_t), and the compiler
  wouldn't be able to do type checking
* Depending on parameter order:
  a) virLogMessage(..., message format, message params...,
                   metadata..., NULL)
     can not be portably implemented (parse_printf_format() is a glibc
     function)
  b) virLogMessage(..., metadata..., NULL,
                   message format, message params...)
     would prevent usage of ATTRIBUTE_FMT_PRINTF and the associated
     compiler checking.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>
src/util/logging.c
src/util/logging.h
src/util/viraudit.c
src/util/virterror.c

index 2df9e2763a128c2d6ba12c13803412596db9b7b5..b8dd8b47602b85e91ba6ad862da2108445482932 100644 (file)
@@ -729,6 +729,7 @@ virLogVersionString(const char **rawmsg,
  * @filename: file where the message was emitted
  * @linenr: line where the message was emitted
  * @funcname: the function emitting the (debug) message
+ * @metadata: NULL or metadata array, terminated by an item with NULL key
  * @fmt: the string format
  * @...: the arguments
  *
@@ -741,13 +742,14 @@ virLogMessage(virLogSource source,
               const char *filename,
               int linenr,
               const char *funcname,
+              virLogMetadataPtr metadata,
               const char *fmt, ...)
 {
     va_list ap;
     va_start(ap, fmt);
     virLogVMessage(source, priority,
                    filename, linenr, funcname,
-                   fmt, ap);
+                   metadata, fmt, ap);
     va_end(ap);
 }
 
@@ -759,6 +761,7 @@ virLogMessage(virLogSource source,
  * @filename: file where the message was emitted
  * @linenr: line where the message was emitted
  * @funcname: the function emitting the (debug) message
+ * @metadata: NULL or metadata array, terminated by an item with NULL key
  * @fmt: the string format
  * @vargs: format args
  *
@@ -771,6 +774,7 @@ virLogVMessage(virLogSource source,
                const char *filename,
                int linenr,
                const char *funcname,
+               virLogMetadataPtr metadata ATTRIBUTE_UNUSED,
                const char *fmt,
                va_list vargs)
 {
index c67377f0d2c5091e27333b81fcf7c51d3bcfe77f..024814fdf11c7a78a9de0d6416013f662c153b78 100644 (file)
@@ -61,7 +61,7 @@ typedef enum {
  */
 # ifdef ENABLE_DEBUG
 #  define VIR_DEBUG_INT(src, filename, linenr, funcname, ...)           \
-    virLogMessage(src, VIR_LOG_DEBUG, filename, linenr, funcname, __VA_ARGS__)
+    virLogMessage(src, VIR_LOG_DEBUG, filename, linenr, funcname, NULL, __VA_ARGS__)
 # else
 /**
  * virLogEatParams:
@@ -78,11 +78,11 @@ static inline void virLogEatParams(virLogSource unused, ...)
 # endif /* !ENABLE_DEBUG */
 
 # define VIR_INFO_INT(src, filename, linenr, funcname, ...)             \
-    virLogMessage(src, VIR_LOG_INFO, filename, linenr, funcname, __VA_ARGS__)
+    virLogMessage(src, VIR_LOG_INFO, filename, linenr, funcname, NULL, __VA_ARGS__)
 # define VIR_WARN_INT(src, filename, linenr, funcname, ...)             \
-    virLogMessage(src, VIR_LOG_WARN, filename, linenr, funcname, __VA_ARGS__)
+    virLogMessage(src, VIR_LOG_WARN, filename, linenr, funcname, NULL, __VA_ARGS__)
 # define VIR_ERROR_INT(src, filename, linenr, funcname, ...)            \
-    virLogMessage(src, VIR_LOG_ERROR, filename, linenr, funcname, __VA_ARGS__)
+    virLogMessage(src, VIR_LOG_ERROR, filename, linenr, funcname, NULL, __VA_ARGS__)
 
 # define VIR_DEBUG(...)                                                 \
     VIR_DEBUG_INT(VIR_LOG_FROM_FILE, __FILE__, __LINE__, __func__, __VA_ARGS__)
@@ -93,6 +93,16 @@ static inline void virLogEatParams(virLogSource unused, ...)
 # define VIR_ERROR(...)                                                 \
     VIR_ERROR_INT(VIR_LOG_FROM_FILE, __FILE__, __LINE__, __func__, __VA_ARGS__)
 
+
+struct _virLogMetadata {
+    const char *key;
+    const char *s;              /* String value, or NULL to use "i" */
+    int i;
+};
+
+typedef struct _virLogMetadata virLogMetadata;
+typedef struct _virLogMetadata *virLogMetadataPtr;
+
 /**
  * virLogOutputFunc:
  * @src: the src for the message
@@ -164,14 +174,16 @@ extern void virLogMessage(virLogSource src,
                           const char *filename,
                           int linenr,
                           const char *funcname,
-                          const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(6, 7);
+                          virLogMetadataPtr metadata,
+                          const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(7, 8);
 extern void virLogVMessage(virLogSource src,
                            virLogPriority priority,
                            const char *filename,
                            int linenr,
                            const char *funcname,
+                           virLogMetadataPtr metadata,
                            const char *fmt,
-                           va_list vargs) ATTRIBUTE_FMT_PRINTF(6, 0);
+                           va_list vargs) ATTRIBUTE_FMT_PRINTF(7, 0);
 extern int virLogSetBufferSize(int size);
 extern void virLogEmergencyDumpAll(int signum);
 #endif
index 61f09ebd82aa2e77c5b6090e13df22b47a568d5a..9bdc5ed9938eabe418b3fa4affb6273739f48325 100644 (file)
@@ -106,11 +106,11 @@ void virAuditSend(const char *filename,
         if (success)
             virLogMessage(VIR_LOG_FROM_AUDIT, VIR_LOG_INFO,
                           filename, linenr, funcname,
-                          "success=yes %s", str);
+                          NULL, "success=yes %s", str);
         else
             virLogMessage(VIR_LOG_FROM_AUDIT, VIR_LOG_WARN,
                           filename, linenr, funcname,
-                          "success=no %s", str);
+                          NULL, "success=no %s", str);
     }
 
 #if HAVE_AUDIT
index e49e320ff83d84fd07edde2b5776a6192a2eb21e..213188e2156b3935a689f8aa0b44dd3544534ae4 100644 (file)
@@ -679,7 +679,7 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
     virLogMessage(virErrorLogPriorityFilter ? VIR_LOG_FROM_FILE : VIR_LOG_FROM_ERROR,
                   priority,
                   filename, linenr, funcname,
-                  "%s", str);
+                  NULL, "%s", str);
 
     errno = save_errno;
 }