[libvirt] [PATCH] logging: make VIR_ERROR and friends preserve errno

Eric Blake eblake at redhat.com
Wed Feb 16 23:51:12 UTC 2011


Followup to commit 17e19add, and would have prevented the bug
independently fixed in commit 76c57a7c.

* src/util/logging.c (virLogMessage): Preserve errno, since
logging should be as unintrusive as possible.
---

Per list discussion, this is post-0.8.8 material.

 src/util/logging.c |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/util/logging.c b/src/util/logging.c
index c598195..9a3e659 100644
--- a/src/util/logging.c
+++ b/src/util/logging.c
@@ -1,7 +1,7 @@
 /*
  * logging.c: internal logging and debugging
  *
- * Copyright (C) 2008, 2010 Red Hat, Inc.
+ * Copyright (C) 2008, 2010, 2011 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -573,29 +573,38 @@ void virLogMessage(const char *category, int priority, const char *funcname,
     struct timeval cur_time;
     struct tm time_info;
     int len, fprio, i, ret;
+    int saved_errno = errno;

     if (!virLogInitialized)
         virLogStartup();

-    if (fmt == NULL)
-       return;
+    if (fmt == NULL) {
+        errno = saved_errno;
+        return;
+    }

     /*
      * check against list of specific logging patterns
      */
     fprio = virLogFiltersCheck(category);
     if (fprio == 0) {
-        if (priority < virLogDefaultPriority)
+        if (priority < virLogDefaultPriority) {
+            errno = saved_errno;
             return;
-    } else if (priority < fprio)
+        }
+    } else if (priority < fprio) {
+        errno = saved_errno;
         return;
+    }

     /*
      * serialize the error message, add level and timestamp
      */
     VIR_GET_VAR_STR(fmt, str);
-    if (str == NULL)
+    if (str == NULL) {
+        errno = saved_errno;
         return;
+    }
     gettimeofday(&cur_time, NULL);
     localtime_r(&cur_time.tv_sec, &time_info);

@@ -605,6 +614,7 @@ void virLogMessage(const char *category, int priority, const char *funcname,
     VIR_FREE(str);
     if (ret < 0) {
         /* apparently we're running out of memory */
+        errno = saved_errno;
         return;
     }

@@ -648,6 +658,7 @@ void virLogMessage(const char *category, int priority, const char *funcname,
     virLogUnlock();

     VIR_FREE(msg);
+    errno = saved_errno;
 }

 static int virLogOutputToFd(const char *category ATTRIBUTE_UNUSED,
-- 
1.7.4




More information about the libvir-list mailing list