[Libvir] PATCH 16/20: add a generic logging API

Daniel P. Berrange berrange at redhat.com
Fri Jun 22 02:16:38 UTC 2007


This patch adds a generic API for drivers to log warning / debug / info 
messages. The existing error APIs are not suitable for this purpose since
each time you set an error, it clears the previous one. This adds a public
API virSetLogFunc allowing applications to register a callback to receive
log messages. If none is registered, they are sent to the big void. It
adapts the QEMU driver to use this logging API instead of qemudLog and
qemudDebug(). It makes the qemud/qemud.c file register a logging callback
to receive the messages & send them onto syslog/stderr as needed.

There are other drivers (in particular src/xm_internal.c) where this
logging API will be useful too. I've not attempted to make them use it
yet though.

 include/libvirt/virterror.h |   24 ++++++++++++++++++
 qemud/conf.c                |   46 ++++++++++++++++++------------------
 qemud/driver.c              |   56 ++++++++++++++++++++++----------------------
 qemud/iptables.c            |    8 +++---
 qemud/qemud.c               |   36 ++++++++++++++++++++++++++++
 qemud/uuid.c                |    9 +++----
 src/internal.h              |    5 +++
 src/libvirt_sym.version     |    1 
 src/virterror.c             |   28 ++++++++++++++++++++++
 9 files changed, 155 insertions(+), 58 deletions(-)


Dan.
-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 
-------------- next part --------------
diff -r 183ad35bc411 include/libvirt/virterror.h
--- a/include/libvirt/virterror.h	Thu Jun 21 21:21:04 2007 -0400
+++ b/include/libvirt/virterror.h	Thu Jun 21 21:21:05 2007 -0400
@@ -158,6 +158,30 @@ void			virConnSetErrorFunc	(virConnectPt
 						 virErrorFunc handler);
 int			virConnCopyLastError	(virConnectPtr conn,
 						 virErrorPtr to);
+/**
+ * virLogLevel:
+ *
+ * Indicates the level of a log message
+ */
+typedef enum {
+  VIR_LOG_CRITICAL = 1,
+  VIR_LOG_ERROR,
+  VIR_LOG_WARN,
+  VIR_LOG_INFO,
+  VIR_LOG_DEBUG,
+} virLogLevel;
+
+  /**
+   * virLogFunc:
+   * @userData: user provided data for the log callback
+   * @level: virLogLevel constant for logging importance
+   * @msg: the message to be logged
+   */
+  typedef void (*virLogFunc) (void *userData, int level, const char *msg);
+
+  void virSetLogFunc(void *userData,
+		     virLogFunc handler);
+
 #ifdef __cplusplus
 }
 #endif
diff -r 183ad35bc411 qemud/conf.c
--- a/qemud/conf.c	Thu Jun 21 21:21:04 2007 -0400
+++ b/qemud/conf.c	Thu Jun 21 21:21:05 2007 -0400
@@ -372,14 +372,14 @@ static int qemudExtractVersionInfo(const
             if (errno == EINTR) {
                 goto rewait;
             }
-            qemudLog(QEMUD_ERR, "Unexpected exit status from qemu %d pid %lu", got, (unsigned long)child);
+            __virLogMessage(VIR_LOG_ERROR, "Unexpected exit status from qemu %d pid %lu", got, (unsigned long)child);
             ret = -1;
         }
         /* Check & log unexpected exit status, but don't fail,
          * as there's really no need to throw an error if we did
          * actually read a valid version number above */
         if (WEXITSTATUS(got) != 1) {
-            qemudLog(QEMUD_WARN, "Unexpected exit status '%d', qemu probably failed", got);
+            __virLogMessage(VIR_LOG_WARN, "Unexpected exit status '%d', qemu probably failed", got);
         }
 
         return ret;
@@ -2189,13 +2189,13 @@ qemudReadFile(const char *path,
     int ret = 0;
 
     if (!(fh = fopen(path, "r"))) {
-        qemudLog(QEMUD_WARN, "Failed to open file '%s': %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to open file '%s': %s",
                  path, strerror(errno));
         goto error;
     }
 
     if (fstat(fileno(fh), &st) < 0) {
-        qemudLog(QEMUD_WARN, "Failed to stat file '%s': %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to stat file '%s': %s",
                  path, strerror(errno));
         goto error;
     }
@@ -2206,12 +2206,12 @@ qemudReadFile(const char *path,
     }
 
     if (st.st_size >= maxlen) {
-        qemudLog(QEMUD_WARN, "File '%s' is too large", path);
+        __virLogMessage(VIR_LOG_WARN, "File '%s' is too large", path);
         goto error;
     }
 
     if ((ret = fread(buf, st.st_size, 1, fh)) != 1) {
-        qemudLog(QEMUD_WARN, "Failed to read config file '%s': %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to read config file '%s': %s",
                  path, strerror(errno));
         goto error;
     }
@@ -2274,19 +2274,19 @@ checkLinkPointsTo(const char *checkLink,
             break;
 
         case EINVAL:
-            qemudLog(QEMUD_WARN, "Autostart file '%s' is not a symlink",
+            __virLogMessage(VIR_LOG_WARN, "Autostart file '%s' is not a symlink",
                      checkLink);
             break;
 
         default:
-            qemudLog(QEMUD_WARN, "Failed to read autostart symlink '%s': %s",
+            __virLogMessage(VIR_LOG_WARN, "Failed to read autostart symlink '%s': %s",
                      checkLink, strerror(errno));
             break;
         }
 
         goto failed;
     } else if (n >= PATH_MAX) {
-        qemudLog(QEMUD_WARN, "Symlink '%s' contents too long to fit in buffer",
+        __virLogMessage(VIR_LOG_WARN, "Symlink '%s' contents too long to fit in buffer",
                  checkLink);
         goto failed;
     }
@@ -2303,7 +2303,7 @@ checkLinkPointsTo(const char *checkLink,
         dir[PATH_MAX] = '\0';
 
         if (!(p = strrchr(dir, '/'))) {
-            qemudLog(QEMUD_WARN, "Symlink path '%s' is not absolute", checkLink);
+            __virLogMessage(VIR_LOG_WARN, "Symlink path '%s' is not absolute", checkLink);
             goto failed;
         }
 
@@ -2313,7 +2313,7 @@ checkLinkPointsTo(const char *checkLink,
         *p = '\0';
 
         if (qemudMakeConfigPath(dir, dest, NULL, tmp, PATH_MAX) < 0) {
-            qemudLog(QEMUD_WARN, "Path '%s/%s' is too long", dir, dest);
+            __virLogMessage(VIR_LOG_WARN, "Path '%s/%s' is too long", dir, dest);
             goto failed;
         }
 
@@ -2323,14 +2323,14 @@ checkLinkPointsTo(const char *checkLink,
 
     /* canonicalize both paths */
     if (!realpath(dest, real)) {
-        qemudLog(QEMUD_WARN, "Failed to expand path '%s' :%s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to expand path '%s' :%s",
                  dest, strerror(errno));
         strncpy(real, dest, PATH_MAX);
         real[PATH_MAX] = '\0';
     }
 
     if (!realpath(checkDest, checkReal)) {
-        qemudLog(QEMUD_WARN, "Failed to expand path '%s' :%s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to expand path '%s' :%s",
                  checkDest, strerror(errno));
         strncpy(checkReal, checkDest, PATH_MAX);
         checkReal[PATH_MAX] = '\0';
@@ -2338,7 +2338,7 @@ checkLinkPointsTo(const char *checkLink,
 
     /* compare */
     if (strcmp(checkReal, real) != 0) {
-        qemudLog(QEMUD_WARN, "Autostart link '%s' is not a symlink to '%s', ignoring",
+        __virLogMessage(VIR_LOG_WARN, "Autostart link '%s' is not a symlink to '%s', ignoring",
                  checkLink, checkReal);
         goto failed;
     }
@@ -2360,20 +2360,20 @@ qemudLoadConfig(struct qemud_driver *dri
 
     if (!(def = qemudParseVMDef(driver, xml, file))) {
         virErrorPtr err = virGetLastError();
-        qemudLog(QEMUD_WARN, "Error parsing QEMU guest config '%s' : %s",
+        __virLogMessage(VIR_LOG_WARN, "Error parsing QEMU guest config '%s' : %s",
                  path, err->message);
         return NULL;
     }
 
     if (!compareFileToNameSuffix(file, def->name, ".xml")) {
-        qemudLog(QEMUD_WARN, "QEMU guest config filename '%s' does not match guest name '%s'",
+        __virLogMessage(VIR_LOG_WARN, "QEMU guest config filename '%s' does not match guest name '%s'",
                  path, def->name);
         qemudFreeVMDef(def);
         return NULL;
     }
 
     if (!(vm = qemudAssignVMDef(driver, def))) {
-        qemudLog(QEMUD_WARN, "Failed to load QEMU guest config '%s': out of memory", path);
+        __virLogMessage(VIR_LOG_WARN, "Failed to load QEMU guest config '%s': out of memory", path);
         qemudFreeVMDef(def);
         return NULL;
     }
@@ -2400,20 +2400,20 @@ qemudLoadNetworkConfig(struct qemud_driv
 
     if (!(def = qemudParseNetworkDef(driver, xml, file))) {
         virErrorPtr err = virGetLastError();
-        qemudLog(QEMUD_WARN, "Error parsing network config '%s' : %s",
+        __virLogMessage(VIR_LOG_WARN, "Error parsing network config '%s' : %s",
                  path, err->message);
         return NULL;
     }
 
     if (!compareFileToNameSuffix(file, def->name, ".xml")) {
-        qemudLog(QEMUD_WARN, "Network config filename '%s' does not match network name '%s'",
+        __virLogMessage(VIR_LOG_WARN, "Network config filename '%s' does not match network name '%s'",
                  path, def->name);
         qemudFreeNetworkDef(def);
         return NULL;
     }
 
     if (!(network = qemudAssignNetworkDef(driver, def))) {
-        qemudLog(QEMUD_WARN, "Failed to load network config '%s': out of memory", path);
+        __virLogMessage(VIR_LOG_WARN, "Failed to load network config '%s': out of memory", path);
         qemudFreeNetworkDef(def);
         return NULL;
     }
@@ -2440,7 +2440,7 @@ int qemudScanConfigDir(struct qemud_driv
     if (!(dir = opendir(configDir))) {
         if (errno == ENOENT)
             return 0;
-        qemudLog(QEMUD_ERR, "Failed to open dir '%s': %s",
+        __virLogMessage(VIR_LOG_ERROR, "Failed to open dir '%s': %s",
                  configDir, strerror(errno));
         return -1;
     }
@@ -2457,13 +2457,13 @@ int qemudScanConfigDir(struct qemud_driv
             continue;
 
         if (qemudMakeConfigPath(configDir, entry->d_name, NULL, path, PATH_MAX) < 0) {
-            qemudLog(QEMUD_WARN, "Config filename '%s/%s' is too long",
+            __virLogMessage(VIR_LOG_WARN, "Config filename '%s/%s' is too long",
                      configDir, entry->d_name);
             continue;
         }
 
         if (qemudMakeConfigPath(autostartDir, entry->d_name, NULL, autostartLink, PATH_MAX) < 0) {
-            qemudLog(QEMUD_WARN, "Autostart link path '%s/%s' is too long",
+            __virLogMessage(VIR_LOG_WARN, "Autostart link path '%s/%s' is too long",
                      autostartDir, entry->d_name);
             continue;
         }
diff -r 183ad35bc411 qemud/driver.c
--- a/qemud/driver.c	Thu Jun 21 21:21:04 2007 -0400
+++ b/qemud/driver.c	Thu Jun 21 21:21:05 2007 -0400
@@ -62,7 +62,7 @@ static int qemudSetCloseExec(int fd) {
         goto error;
     return 0;
  error:
-    qemudLog(QEMUD_ERR, "Failed to set close-on-exec file descriptor flag");
+    __virLogMessage(VIR_LOG_ERROR, "Failed to set close-on-exec file descriptor flag");
     return -1;
 }
 
@@ -76,7 +76,7 @@ static int qemudSetNonBlock(int fd) {
         goto error;
     return 0;
  error:
-    qemudLog(QEMUD_ERR, "Failed to set non-blocking file descriptor flag");
+    __virLogMessage(VIR_LOG_ERROR, "Failed to set non-blocking file descriptor flag");
     return -1;
 }
 
@@ -114,8 +114,8 @@ void qemudAutostartConfigs(struct qemud_
             !qemudIsActiveNetwork(network) &&
             qemudStartNetworkDaemon(driver, network) < 0) {
             virErrorPtr err = virGetLastError();
-            qemudLog(QEMUD_ERR, "Failed to autostart network '%s': %s",
-                     network->def->name, err->message);
+            __virLogMessage(VIR_LOG_ERROR, "Failed to autostart network '%s': %s",
+                            network->def->name, err ? err->message : "");
         }
 
         network = next;
@@ -129,8 +129,8 @@ void qemudAutostartConfigs(struct qemud_
             !qemudIsActiveVM(vm) &&
             qemudStartVMDaemon(driver, vm) < 0) {
             virErrorPtr err = virGetLastError();
-            qemudLog(QEMUD_ERR, "Failed to autostart VM '%s': %s",
-                     vm->def->name, err->message);
+            __virLogMessage(VIR_LOG_ERROR, "Failed to autostart VM '%s': %s",
+                            vm->def->name, err ? err->message : "");
         }
 
         vm = next;
@@ -157,7 +157,7 @@ int qemudStartup(void) {
             goto out_of_memory;
     } else {
         if (!(pw = getpwuid(uid))) {
-            qemudLog(QEMUD_ERR, "Failed to find user record for uid '%d': %s",
+            __virLogMessage(VIR_LOG_ERROR, "Failed to find user record for uid '%d': %s",
                      uid, strerror(errno));
             goto out_of_memory;
         }
@@ -166,7 +166,7 @@ int qemudStartup(void) {
             goto snprintf_error;
 
         if (asprintf (&base, "%s/.libvirt/qemu", pw->pw_dir) == -1) {
-            qemudLog (QEMUD_ERR, "out of memory in asprintf");
+            __virLogMessage (VIR_LOG_ERROR, "out of memory in asprintf");
             goto out_of_memory;
         }
     }
@@ -194,11 +194,11 @@ int qemudStartup(void) {
     return 0;
 
  snprintf_error:
-    qemudLog(QEMUD_ERR, "Resulting path to long for buffer in qemudInitPaths()");
+    __virLogMessage(VIR_LOG_ERROR, "Resulting path to long for buffer in qemudInitPaths()");
     return -1;
 
  out_of_memory:
-    qemudLog (QEMUD_ERR, "qemudStartup: out of memory");
+    __virLogMessage (VIR_LOG_ERROR, "qemudStartup: out of memory");
     if (base) free (base);
     free(qemu_driver);
     qemu_driver = NULL;
@@ -208,8 +208,8 @@ int qemudReload(void) {
 int qemudReload(void) {
     qemudScanConfigs(qemu_driver);
 
-     if (qemu_driver->iptables) {
-        qemudLog(QEMUD_INFO, "Reloading iptables rules");
+    if (qemu_driver->iptables) {
+        __virLogMessage(VIR_LOG_INFO, "Reloading iptables rules");
         iptablesReloadRules(qemu_driver->iptables);
     }
 
@@ -561,7 +561,7 @@ static int qemudWaitForMonitor(struct qe
         /* Log, but ignore failures to write logfile for VM */
         if (errno == EINTR)
             goto retry;
-        qemudLog(QEMUD_WARN, "Unable to log VM console data: %s",
+        __virLogMessage(VIR_LOG_WARN, "Unable to log VM console data: %s",
                  strerror(errno));
     }
 
@@ -666,15 +666,15 @@ int qemudStartVMDaemon(struct qemud_driv
     tmp = argv;
     while (*tmp) {
         if (write(vm->logfile, *tmp, strlen(*tmp)) < 0)
-            qemudLog(QEMUD_WARN, "Unable to write argv to logfile %d: %s",
+            __virLogMessage(VIR_LOG_WARN, "Unable to write argv to logfile %d: %s",
                      errno, strerror(errno));
         if (write(vm->logfile, " ", 1) < 0)
-            qemudLog(QEMUD_WARN, "Unable to write argv to logfile %d: %s",
+            __virLogMessage(VIR_LOG_WARN, "Unable to write argv to logfile %d: %s",
                      errno, strerror(errno));
         tmp++;
     }
     if (write(vm->logfile, "\n", 1) < 0)
-        qemudLog(QEMUD_WARN, "Unable to write argv to logfile %d: %s",
+        __virLogMessage(VIR_LOG_WARN, "Unable to write argv to logfile %d: %s",
                  errno, strerror(errno));
 
     if (qemudExec(argv, &vm->pid, &vm->stdout, &vm->stderr) == 0) {
@@ -747,7 +747,7 @@ static int qemudVMData(struct qemud_driv
             /* Log, but ignore failures to write logfile for VM */
             if (errno == EINTR)
                 goto retry;
-            qemudLog(QEMUD_WARN, "Unable to log VM console data: %s",
+            __virLogMessage(VIR_LOG_WARN, "Unable to log VM console data: %s",
                      strerror(errno));
         }
     }
@@ -760,7 +760,7 @@ int qemudShutdownVMDaemon(struct qemud_d
     if (!qemudIsActiveVM(vm))
         return 0;
 
-    qemudLog(QEMUD_INFO, "Shutting down VM '%s'", vm->def->name);
+    __virLogMessage(VIR_LOG_INFO, "Shutting down VM '%s'", vm->def->name);
 
     kill(vm->pid, SIGTERM);
 
@@ -771,7 +771,7 @@ int qemudShutdownVMDaemon(struct qemud_d
     virEventRemoveHandle(vm->stderr);
 
     if (close(vm->logfile) < 0)
-        qemudLog(QEMUD_WARN, "Unable to close logfile %d: %s", errno, strerror(errno));
+        __virLogMessage(VIR_LOG_WARN, "Unable to close logfile %d: %s", errno, strerror(errno));
     close(vm->stdout);
     close(vm->stderr);
     if (vm->monitor != -1)
@@ -784,7 +784,7 @@ int qemudShutdownVMDaemon(struct qemud_d
     if (waitpid(vm->pid, NULL, WNOHANG) != vm->pid) {
         kill(vm->pid, SIGKILL);
         if (waitpid(vm->pid, NULL, 0) != vm->pid) {
-            qemudLog(QEMUD_WARN, "Got unexpected pid, damn");
+            __virLogMessage(VIR_LOG_WARN, "Got unexpected pid, damn");
         }
     }
 
@@ -1221,13 +1221,13 @@ int qemudStartNetworkDaemon(struct qemud
  err_delbr1:
     if (network->def->ipAddress[0] &&
         (err = brSetInterfaceUp(driver->brctl, network->bridge, 0))) {
-        qemudLog(QEMUD_WARN, "Failed to bring down bridge '%s' : %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to bring down bridge '%s' : %s",
                  network->bridge, strerror(err));
     }
 
  err_delbr:
     if ((err = brDeleteBridge(driver->brctl, network->bridge))) {
-        qemudLog(QEMUD_WARN, "Failed to delete bridge '%s' : %s\n",
+        __virLogMessage(VIR_LOG_WARN, "Failed to delete bridge '%s' : %s\n",
                  network->bridge, strerror(err));
     }
 
@@ -1239,7 +1239,7 @@ int qemudShutdownNetworkDaemon(struct qe
                                struct qemud_network *network) {
     int err;
 
-    qemudLog(QEMUD_INFO, "Shutting down network '%s'", network->def->name);
+    __virLogMessage(VIR_LOG_INFO, "Shutting down network '%s'", network->def->name);
 
     if (!qemudIsActiveNetwork(network))
         return 0;
@@ -1251,12 +1251,12 @@ int qemudShutdownNetworkDaemon(struct qe
 
     if (network->def->ipAddress[0] &&
         (err = brSetInterfaceUp(driver->brctl, network->bridge, 0))) {
-        qemudLog(QEMUD_WARN, "Failed to bring down bridge '%s' : %s\n",
+        __virLogMessage(VIR_LOG_WARN, "Failed to bring down bridge '%s' : %s\n",
                  network->bridge, strerror(err));
     }
 
     if ((err = brDeleteBridge(driver->brctl, network->bridge))) {
-        qemudLog(QEMUD_WARN, "Failed to delete bridge '%s' : %s\n",
+        __virLogMessage(VIR_LOG_WARN, "Failed to delete bridge '%s' : %s\n",
                  network->bridge, strerror(err));
     }
 
@@ -1264,7 +1264,7 @@ int qemudShutdownNetworkDaemon(struct qe
         waitpid(network->dnsmasqPid, NULL, WNOHANG) != network->dnsmasqPid) {
         kill(network->dnsmasqPid, SIGKILL);
         if (waitpid(network->dnsmasqPid, NULL, 0) != network->dnsmasqPid)
-            qemudLog(QEMUD_WARN, "Got unexpected pid for dnsmasq\n");
+            __virLogMessage(VIR_LOG_WARN, "Got unexpected pid for dnsmasq\n");
     }
 
     network->bridge[0] = '\0';
@@ -2084,7 +2084,7 @@ int qemudDomainUndefine(virDomainPtr dom
         return -1;
 
     if (unlink(vm->autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR)
-        qemudLog(QEMUD_WARN, "Failed to delete autostart link '%s': %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to delete autostart link '%s': %s",
                  vm->autostartLink, strerror(errno));
 
     vm->configFile[0] = '\0';
@@ -2346,7 +2346,7 @@ int qemudNetworkUndefine(virNetworkPtr n
         return -1;
 
     if (unlink(network->autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR)
-        qemudLog(QEMUD_WARN, "Failed to delete autostart link '%s': %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to delete autostart link '%s': %s",
                  network->autostartLink, strerror(errno));
 
     network->configFile[0] = '\0';
diff -r 183ad35bc411 qemud/iptables.c
--- a/qemud/iptables.c	Thu Jun 21 21:21:04 2007 -0400
+++ b/qemud/iptables.c	Thu Jun 21 21:21:05 2007 -0400
@@ -36,6 +36,8 @@
 #include <sys/stat.h>
 #include <sys/wait.h>
 
+#include <libvirt/virterror.h>
+#include "../src/internal.h"
 #include "internal.h"
 
 enum {
@@ -578,7 +580,7 @@ iptRulesReload(iptRules *rules)
         rule->argv[rule->flipflop] = (char *) "--delete";
 
         if ((retval = iptablesSpawn(WITH_ERRORS, rule->argv)))
-            qemudLog(QEMUD_WARN, "Failed to remove iptables rule '%s' from chain '%s' in table '%s': %s",
+            __virLogMessage(VIR_LOG_WARN, "Failed to remove iptables rule '%s' from chain '%s' in table '%s': %s",
                      rule->rule, rules->chain, rules->table, strerror(errno));
 
         rule->argv[rule->flipflop] = orig;
@@ -586,12 +588,12 @@ iptRulesReload(iptRules *rules)
 
     if ((retval = iptablesAddRemoveChain(rules, REMOVE)) ||
         (retval = iptablesAddRemoveChain(rules, ADD)))
-        qemudLog(QEMUD_WARN, "Failed to re-create chain '%s' in table '%s': %s",
+        __virLogMessage(VIR_LOG_WARN, "Failed to re-create chain '%s' in table '%s': %s",
                  rules->chain, rules->table, strerror(retval));
 
     for (i = 0; i < rules->nrules; i++)
         if ((retval = iptablesSpawn(WITH_ERRORS, rules->rules[i].argv)))
-            qemudLog(QEMUD_WARN, "Failed to add iptables rule '%s' to chain '%s' in table '%s': %s",
+            __virLogMessage(VIR_LOG_WARN, "Failed to add iptables rule '%s' to chain '%s' in table '%s': %s",
                      rules->rules[i].rule, rules->chain, rules->table, strerror(retval));
 }
 
diff -r 183ad35bc411 qemud/qemud.c
--- a/qemud/qemud.c	Thu Jun 21 21:21:04 2007 -0400
+++ b/qemud/qemud.c	Thu Jun 21 21:21:05 2007 -0400
@@ -262,6 +262,41 @@ static int qemudSetNonBlock(int fd) {
     return -1;
 }
 
+static void qemudLogHandler(void *data ATTRIBUTE_UNUSED,
+                            int level, const char *msg)
+{
+    if (godaemon) {
+        int sysprio = -1;
+        switch (level) {
+        case VIR_LOG_CRITICAL:
+            sysprio = LOG_CRIT;
+            break;
+        case VIR_LOG_ERROR:
+            sysprio = LOG_ERR;
+            break;
+        case VIR_LOG_WARN:
+            sysprio = LOG_WARNING;
+            break;
+        case VIR_LOG_INFO:
+            sysprio = LOG_INFO;
+            break;
+        case VIR_LOG_DEBUG:
+            sysprio = LOG_DEBUG;
+            break;
+        default:
+            break;
+        }
+        if (sysprio != -1)
+            syslog(sysprio, "%s", msg);
+    } else {
+        if ((level == VIR_LOG_DEBUG ||
+             level == VIR_LOG_INFO) &&
+            !verbose)
+            return;
+        fprintf(stderr, "%s\n", msg);
+    }
+}
+
 void qemudLog(int priority, const char *fmt, ...)
 {
     va_list args;
@@ -708,6 +743,7 @@ static struct qemud_server *qemudInitial
     if (roSockname[0] != '\0' && qemudListenUnix(server, roSockname, 1) < 0)
         goto cleanup;
 
+    virSetLogFunc(NULL, qemudLogHandler);
     virStateInitialize();
 
     if (!remote) /* qemud only */ {
diff -r 183ad35bc411 qemud/uuid.c
--- a/qemud/uuid.c	Thu Jun 21 21:21:04 2007 -0400
+++ b/qemud/uuid.c	Thu Jun 21 21:21:05 2007 -0400
@@ -32,7 +32,8 @@
 #include <time.h>
 #include <unistd.h>
 
-#include "internal.h"
+#include <libvirt/virterror.h>
+#include "../src/internal.h"
 
 static int
 virUUIDGenerateRandomBytes(unsigned char *buf,
@@ -81,9 +82,9 @@ virUUIDGenerate(unsigned char *uuid)
     int err;
 
     if ((err = virUUIDGenerateRandomBytes(uuid, VIR_UUID_RAW_LEN)))
-        qemudLog(QEMUD_WARN,
-                 "Falling back to pseudorandom UUID, "
-                 "failed to generate random bytes: %s", strerror(err));
+        __virLogMessage(VIR_LOG_WARN,
+                        "Falling back to pseudorandom UUID, "
+                        "failed to generate random bytes: %s", strerror(err));
 
     return virUUIDGeneratePseudoRandomBytes(uuid, VIR_UUID_RAW_LEN);
 }
diff -r 183ad35bc411 src/internal.h
--- a/src/internal.h	Thu Jun 21 21:21:04 2007 -0400
+++ b/src/internal.h	Thu Jun 21 21:21:05 2007 -0400
@@ -189,6 +189,11 @@ void __virRaiseError(virConnectPtr conn,
 		     int int1, int int2, const char *msg, ...)
   ATTRIBUTE_FORMAT(printf, 12, 13);
 const char *__virErrorMsg(virErrorNumber error, const char *info);
+
+void __virLogMessage(int level,
+                     const char *msg,
+                     ...)
+  ATTRIBUTE_FORMAT(printf, 2, 3);
 
 /************************************************************************
  *									*
diff -r 183ad35bc411 src/libvirt_sym.version
--- a/src/libvirt_sym.version	Thu Jun 21 21:21:04 2007 -0400
+++ b/src/libvirt_sym.version	Thu Jun 21 21:21:05 2007 -0400
@@ -52,6 +52,7 @@
 	virConnCopyLastError;
 	virConnResetLastError;
 	virDefaultErrorFunc;
+	virSetLogFunc;
 	virNodeGetInfo;
 	virConnectGetCapabilities;
 
diff -r 183ad35bc411 src/virterror.c
--- a/src/virterror.c	Thu Jun 21 21:21:04 2007 -0400
+++ b/src/virterror.c	Thu Jun 21 21:21:05 2007 -0400
@@ -638,6 +638,34 @@ __virErrorMsg(virErrorNumber error, cons
     return (errmsg);
 }
 
+static virLogFunc logHandler = NULL;
+static void *logUserData = NULL;
+
+void virSetLogFunc(void *userData,
+                   virLogFunc handler) {
+    logHandler = handler;
+    logUserData = userData;
+}
+
+
+void __virLogMessage(int level,
+                     const char *msg,
+                     ...) {
+    char *str;
+
+    if (!logHandler)
+        return;
+
+    VIR_GET_VAR_STR(msg, str);
+
+    if (str) {
+        logHandler(logUserData, level, str);
+        free(str);
+    } else {
+        logHandler(logUserData, VIR_LOG_CRITICAL, _("Cannot allocate memory for formatting log message"));
+    }
+}
+
 /*
  * vim: set tabstop=4:
  * vim: set shiftwidth=4:


More information about the libvir-list mailing list