#include "uuid.h"
#include "domain_conf.h"
#include "datatypes.h"
+#include "logging.h"
/* For storing short-lived temporary files. */
#define TEMPDIR LOCAL_STATE_DIR "/cache/libvirt"
static int umlShutdown(void);
-/* umlDebug statements should be changed to use this macro instead. */
-#define DEBUG(fmt,...) VIR_DEBUG(__FILE__, fmt, __VA_ARGS__)
-#define DEBUG0(msg) VIR_DEBUG(__FILE__, "%s", msg)
-
-#define umlLog(level, msg...) fprintf(stderr, msg)
+#define umlLog(level, msg, ...) \
+ virLogMessage(__FILE__, level, __func__, __LINE__, 0, msg, __VA_ARGS__)
static void umlDriverLock(struct uml_driver *driver)
{
goto error;
return 0;
error:
- umlLog(UML_ERR,
+ umlLog(VIR_LOG_ERROR,
"%s", _("Failed to set close-on-exec file descriptor flag\n"));
return -1;
}
!virDomainIsActive(driver->domains.objs[i]) &&
umlStartVMDaemon(conn, driver, driver->domains.objs[i]) < 0) {
virErrorPtr err = virGetLastError();
- umlLog(UML_ERR, _("Failed to autostart VM '%s': %s\n"),
+ umlLog(VIR_LOG_ERROR, _("Failed to autostart VM '%s': %s\n"),
driver->domains.objs[i]->def->name, err->message);
}
}
uml_driver->nextvmid = 1;
if (!(pw = getpwuid(uid))) {
- umlLog(UML_ERR, _("Failed to find user record for uid '%d': %s\n"),
+ umlLog(VIR_LOG_ERROR, _("Failed to find user record for uid '%d': %s\n"),
uid, strerror(errno));
goto error;
}
if ((uml_driver->inotifyFD = inotify_init()) < 0) {
- umlLog(UML_ERR, "%s", _("cannot initialize inotify"));
+ umlLog(VIR_LOG_ERROR, "%s", _("cannot initialize inotify"));
goto error;
}
if (virFileMakePath(uml_driver->monitorDir) < 0) {
- umlLog(UML_ERR, _("Failed to create monitor directory %s: %s"),
+ umlLog(VIR_LOG_ERROR, _("Failed to create monitor directory %s: %s"),
uml_driver->monitorDir, strerror(errno));
goto error;
}
return 0;
out_of_memory:
- umlLog (UML_ERR,
+ umlLog (VIR_LOG_ERROR,
"%s", _("umlStartup: out of memory\n"));
error:
tmp = progenv;
while (*tmp) {
if (safewrite(logfd, *tmp, strlen(*tmp)) < 0)
- umlLog(UML_WARN, _("Unable to write envv to logfile %d: %s\n"),
+ umlLog(VIR_LOG_WARN, _("Unable to write envv to logfile %d: %s\n"),
errno, strerror(errno));
if (safewrite(logfd, " ", 1) < 0)
- umlLog(UML_WARN, _("Unable to write envv to logfile %d: %s\n"),
+ umlLog(VIR_LOG_WARN, _("Unable to write envv to logfile %d: %s\n"),
errno, strerror(errno));
tmp++;
}
tmp = argv;
while (*tmp) {
if (safewrite(logfd, *tmp, strlen(*tmp)) < 0)
- umlLog(UML_WARN, _("Unable to write argv to logfile %d: %s\n"),
+ umlLog(VIR_LOG_WARN, _("Unable to write argv to logfile %d: %s\n"),
errno, strerror(errno));
if (safewrite(logfd, " ", 1) < 0)
- umlLog(UML_WARN, _("Unable to write argv to logfile %d: %s\n"),
+ umlLog(VIR_LOG_WARN, _("Unable to write argv to logfile %d: %s\n"),
errno, strerror(errno));
tmp++;
}
if (safewrite(logfd, "\n", 1) < 0)
- umlLog(UML_WARN, _("Unable to write argv to logfile %d: %s\n"),
+ umlLog(VIR_LOG_WARN, _("Unable to write argv to logfile %d: %s\n"),
errno, strerror(errno));
vm->monitor = -1;
/* Cleanup intermediate proces */
if (waitpid(pid, NULL, 0) != pid)
- umlLog(UML_WARN, _("failed to wait on process: %d: %s\n"),
+ umlLog(VIR_LOG_WARN, _("failed to wait on process: %d: %s\n"),
pid, strerror(errno));
for (i = 0 ; argv[i] ; i++)
vm->monitor = -1;
if ((ret = waitpid(vm->pid, NULL, 0)) != vm->pid) {
- umlLog(UML_WARN,
+ umlLog(VIR_LOG_WARN,
_("Got unexpected pid %d != %d\n"),
ret, vm->pid);
}
#include "virterror_internal.h"
#include "datatypes.h"
+#include "logging.h"
virError virLastErr = /* the last error */
{ .code = 0, .domain = 0, .message = NULL, .level = VIR_ERR_NONE,
}} \
}
+static virLogPriority virErrorLevelPriority(virErrorLevel level) {
+ switch (level) {
+ case VIR_ERR_NONE:
+ return(VIR_LOG_INFO);
+ case VIR_ERR_WARNING:
+ return(VIR_LOG_WARN);
+ case VIR_ERR_ERROR:
+ return(VIR_LOG_ERROR);
+ }
+ return(VIR_LOG_ERROR);
+}
+
+static const char *virErrorDomainName(virErrorDomain domain) {
+ const char *dom = "unknown";
+ switch (domain) {
+ case VIR_FROM_NONE:
+ dom = "";
+ break;
+ case VIR_FROM_XEN:
+ dom = "Xen ";
+ break;
+ case VIR_FROM_XML:
+ dom = "XML ";
+ break;
+ case VIR_FROM_XEND:
+ dom = "Xen Daemon ";
+ break;
+ case VIR_FROM_XENSTORE:
+ dom = "Xen Store ";
+ break;
+ case VIR_FROM_XEN_INOTIFY:
+ dom = "Xen Inotify ";
+ break;
+ case VIR_FROM_DOM:
+ dom = "Domain ";
+ break;
+ case VIR_FROM_RPC:
+ dom = "XML-RPC ";
+ break;
+ case VIR_FROM_QEMU:
+ dom = "QEMU ";
+ break;
+ case VIR_FROM_NET:
+ dom = "Network ";
+ break;
+ case VIR_FROM_TEST:
+ dom = "Test ";
+ break;
+ case VIR_FROM_REMOTE:
+ dom = "Remote ";
+ break;
+ case VIR_FROM_SEXPR:
+ dom = "S-Expr ";
+ break;
+ case VIR_FROM_PROXY:
+ dom = "PROXY ";
+ break;
+ case VIR_FROM_CONF:
+ dom = "Config ";
+ break;
+ case VIR_FROM_OPENVZ:
+ dom = "OpenVZ ";
+ break;
+ case VIR_FROM_XENXM:
+ dom = "Xen XM ";
+ break;
+ case VIR_FROM_STATS_LINUX:
+ dom = "Linux Stats ";
+ break;
+ case VIR_FROM_LXC:
+ dom = "Linux Container ";
+ break;
+ case VIR_FROM_STORAGE:
+ dom = "Storage ";
+ break;
+ case VIR_FROM_NETWORK:
+ dom = "Network Config ";
+ break;
+ case VIR_FROM_DOMAIN:
+ dom = "Domain Config ";
+ break;
+ case VIR_FROM_NODEDEV:
+ dom = "Node Device ";
+ break;
+ case VIR_FROM_UML:
+ dom = "UML ";
+ break;
+ }
+ return(dom);
+}
+
/*
* virGetLastError:
*
lvl = _("error");
break;
}
- switch (err->domain) {
- case VIR_FROM_NONE:
- dom = "";
- break;
- case VIR_FROM_XEN:
- dom = "Xen ";
- break;
- case VIR_FROM_XML:
- dom = "XML ";
- break;
- case VIR_FROM_XEND:
- dom = "Xen Daemon ";
- break;
- case VIR_FROM_XENSTORE:
- dom = "Xen Store ";
- break;
- case VIR_FROM_XEN_INOTIFY:
- dom = "Xen Inotify ";
- break;
- case VIR_FROM_DOM:
- dom = "Domain ";
- break;
- case VIR_FROM_RPC:
- dom = "XML-RPC ";
- break;
- case VIR_FROM_QEMU:
- dom = "QEMU ";
- break;
- case VIR_FROM_NET:
- dom = "Network ";
- break;
- case VIR_FROM_TEST:
- dom = "Test ";
- break;
- case VIR_FROM_REMOTE:
- dom = "Remote ";
- break;
- case VIR_FROM_SEXPR:
- dom = "S-Expr ";
- break;
- case VIR_FROM_PROXY:
- dom = "PROXY ";
- break;
- case VIR_FROM_CONF:
- dom = "Config ";
- break;
- case VIR_FROM_OPENVZ:
- dom = "OpenVZ ";
- break;
- case VIR_FROM_XENXM:
- dom = "Xen XM ";
- break;
- case VIR_FROM_STATS_LINUX:
- dom = "Linux Stats ";
- break;
- case VIR_FROM_LXC:
- dom = "Linux Container ";
- break;
- case VIR_FROM_STORAGE:
- dom = "Storage ";
- break;
- case VIR_FROM_NETWORK:
- dom = "Network Config ";
- break;
- case VIR_FROM_DOMAIN:
- dom = "Domain Config ";
- break;
- case VIR_FROM_NODEDEV:
- dom = "Node Device ";
- break;
- case VIR_FROM_UML:
- dom = "UML ";
- break;
- }
+ dom = virErrorDomainName(err->domain);
if ((err->dom != NULL) && (err->code != VIR_ERR_INVALID_DOMAIN)) {
domain = err->dom->name;
} else if ((err->net != NULL) && (err->code != VIR_ERR_INVALID_NETWORK)) {
VIR_GET_VAR_STR(msg, str);
}
+ /*
+ * Hook up the error or warning to the logging facility
+ * TODO: pass function name and lineno
+ */
+ virLogMessage(virErrorDomainName(domain), virErrorLevelPriority(level),
+ NULL, 0, 1, "%s", str);
+
/*
* Save the information about the error
*/