Error messages, I like them. I don't like them to be thrown away.A nice feature of virterror is that it'll throw away errors under the following conditions:
(1) You are in virConnectOpen, and (2) You pass a non-NULL virConnectPtr to __virRaiseError.libvirt has a lot of errors which meet those conditions - the attached patch fixes the ones I could find.
It also fixes qemuOpenConnection so that it doesn't try to open a Unix socket with random stack data.
It also adds error messages in some useful places where previously there was an error, but no message.
Rich. -- Emerging Technologies, Red Hat http://et.redhat.com/~rjones/ 64 Baker Street, London, W1U 7DF Mobile: +44 7866 314 421 Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 3798903 Directors: Michael Cunningham (USA), Charlie Peters (USA) and David Owens (Ireland)
diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/proxy_internal.c libvirt-open-errors/src/proxy_internal.c --- libvirt-cvs/src/proxy_internal.c 2007-05-01 13:55:02.000000000 +0100 +++ libvirt-open-errors/src/proxy_internal.c 2007-05-01 14:29:04.000000000 +0100 @@ -544,7 +544,7 @@ fd = virProxyOpenClientSocket(PROXY_SOCKET_PATH); if (fd < 0) { - virProxyError(conn, VIR_ERR_NO_XEN, PROXY_SOCKET_PATH); + virProxyError(NULL, VIR_ERR_NO_XEN, PROXY_SOCKET_PATH); return(-1); } priv->proxy = fd; @@ -554,7 +554,7 @@ req.len = sizeof(req); ret = xenProxyCommand(conn, &req, NULL, 1); if ((ret < 0) || (req.command != VIR_PROXY_NONE)) { - virProxyError(conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__); + virProxyError(NULL, VIR_ERR_OPERATION_FAILED, __FUNCTION__); xenProxyClose(conn); return(-1); } diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/qemu_internal.c libvirt-open-errors/src/qemu_internal.c --- libvirt-cvs/src/qemu_internal.c 2007-05-01 13:55:02.000000000 +0100 +++ libvirt-open-errors/src/qemu_internal.c 2007-05-01 14:49:17.000000000 +0100 @@ -146,7 +146,7 @@ int ret, pid, status; if (!proxyPath) { - fprintf(stderr, "failed to find qemu\n"); + qemuError (NULL, NULL, VIR_ERR_INVALID_ARG, "no proxyPath"); return(-1); } @@ -231,6 +231,7 @@ retry: fd = socket(PF_UNIX, SOCK_STREAM, 0); if (fd < 0) { + qemuError (NULL, NULL, VIR_ERR_SYSTEM_ERROR, "socket"); return VIR_DRV_OPEN_ERROR; } @@ -256,6 +257,10 @@ usleep(5000 * trials * trials); goto retry; } + __virRaiseError (NULL, NULL, NULL, + VIR_FROM_QEMU, VIR_ERR_SYSTEM_ERROR, VIR_ERR_ERROR, + "connect", NULL, NULL, errno, 0, + "connect: %s: %s", path, strerror (errno)); return VIR_DRV_OPEN_ERROR; } @@ -346,34 +351,43 @@ int autostart = 0; if (uri->server != NULL) { + qemuError (NULL, NULL, VIR_ERR_INTERNAL_ERROR, __FUNCTION__); return VIR_DRV_OPEN_ERROR; } - if (!strcmp(uri->path, "/system")) { + if (strcmp(uri->path, "/system") == 0) { if (readonly) { if (snprintf(path, sizeof(path), "%s/run/libvirt/qemud-sock-ro", LOCAL_STATE_DIR) >= (int)sizeof(path)) { + qemuError (NULL, NULL, VIR_ERR_INVALID_ARG, __FUNCTION__); return VIR_DRV_OPEN_ERROR; } } else { if (snprintf(path, sizeof(path), "%s/run/libvirt/qemud-sock", LOCAL_STATE_DIR) >= (int)sizeof(path)) { + qemuError (NULL, NULL, VIR_ERR_INVALID_ARG, __FUNCTION__); return VIR_DRV_OPEN_ERROR; } } - } else if (!strcmp(uri->path, "/session")) { + } else if (strcmp(uri->path, "/session") == 0) { struct passwd *pw; int uid; if ((uid = geteuid()) < 0) { + qemuError (NULL, NULL, VIR_ERR_SYSTEM_ERROR, "geteuid"); return VIR_DRV_OPEN_ERROR; } - if (!(pw = getpwuid(uid))) + if (!(pw = getpwuid(uid))) { + qemuError (NULL, NULL, VIR_ERR_SYSTEM_ERROR, "getpwuid"); return VIR_DRV_OPEN_ERROR; + } if (snprintf(path, sizeof(path), "@%s/.libvirt/qemud-sock", pw->pw_dir) == sizeof(path)) { return VIR_DRV_OPEN_ERROR; } autostart = 1; + } else { + qemuError (NULL, NULL, VIR_ERR_INVALID_ARG, "path should be /system or /session - for example, qemu:///session"); + return VIR_DRV_OPEN_ERROR; } return qemuOpenClientUNIX(conn, path, autostart); } @@ -395,7 +409,7 @@ uri = xmlParseURI(name); if (uri == NULL) { - qemuError(conn, NULL, VIR_ERR_NO_SUPPORT, name); + qemuError(NULL, NULL, VIR_ERR_NO_SUPPORT, name); return VIR_DRV_OPEN_DECLINED; } @@ -409,7 +423,7 @@ /* Create per-connection private data. */ priv = conn->privateData = malloc (sizeof *priv); if (!priv) { - qemuError (conn, NULL, VIR_ERR_NO_MEMORY, __FUNCTION__); + qemuError (NULL, NULL, VIR_ERR_NO_MEMORY, __FUNCTION__); return VIR_DRV_OPEN_ERROR; } diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/test.c libvirt-open-errors/src/test.c --- libvirt-cvs/src/test.c 2007-05-01 13:55:02.000000000 +0100 +++ libvirt-open-errors/src/test.c 2007-05-01 14:21:14.000000000 +0100 @@ -562,7 +562,7 @@ if (ret == 0) { nodeInfo->nodes = l; } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu numa nodes")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node cpu numa nodes")); goto error; } @@ -570,7 +570,7 @@ if (ret == 0) { nodeInfo->sockets = l; } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu sockets")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node cpu sockets")); goto error; } @@ -578,7 +578,7 @@ if (ret == 0) { nodeInfo->cores = l; } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu cores")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node cpu cores")); goto error; } @@ -586,7 +586,7 @@ if (ret == 0) { nodeInfo->threads = l; } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu threads")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node cpu threads")); goto error; } @@ -597,14 +597,14 @@ nodeInfo->cpus = l; } } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node active cpu")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node active cpu")); goto error; } ret = virXPathLong("string(/node/cpu/mhz[1])", ctxt, &l); if (ret == 0) { nodeInfo->mhz = l; } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node cpu mhz")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node cpu mhz")); goto error; } @@ -619,7 +619,7 @@ if (ret == 0) { nodeInfo->memory = l; } else if (ret == -2) { - testError(conn, NULL, VIR_ERR_XML_ERROR, _("node memory")); + testError(NULL, NULL, VIR_ERR_XML_ERROR, _("node memory")); goto error; } @@ -717,7 +717,7 @@ uri = xmlParseURI(name); if (uri == NULL) { - testError(conn, NULL, VIR_ERR_NO_SUPPORT, name); + testError(NULL, NULL, VIR_ERR_NO_SUPPORT, name); return VIR_DRV_OPEN_DECLINED; } @@ -730,7 +730,7 @@ if (!uri->path || uri->path[0] == '\0' || (uri->path[0] == '/' && uri->path[1] == '\0')) { - testError (conn, NULL, VIR_ERR_INVALID_ARG, + testError (NULL, NULL, VIR_ERR_INVALID_ARG, _("testOpen: supply a path or use test:///default")); return VIR_DRV_OPEN_ERROR; } @@ -743,7 +743,7 @@ /* Allocate per-connection private data. */ priv = conn->privateData = malloc (sizeof (struct _testPrivate)); if (!priv) { - testError(conn, NULL, VIR_ERR_NO_MEMORY, _("allocating private data")); + testError(NULL, NULL, VIR_ERR_NO_MEMORY, _("allocating private data")); return VIR_DRV_OPEN_ERROR; } priv->handle = -1; diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/xend_internal.c libvirt-open-errors/src/xend_internal.c --- libvirt-cvs/src/xend_internal.c 2007-05-01 13:55:03.000000000 +0100 +++ libvirt-open-errors/src/xend_internal.c 2007-05-01 14:34:35.000000000 +0100 @@ -894,7 +894,7 @@ pent = gethostbyname(host); if (pent == NULL) { if (inet_aton(host, &ip) == 0) { - virXendError(conn, VIR_ERR_UNKNOWN_HOST, host); + virXendError(NULL, VIR_ERR_UNKNOWN_HOST, host); errno = ESRCH; return (-1); } @@ -1960,14 +1960,14 @@ */ uri = xmlParseURI(name); if (uri == NULL) { - virXendError(conn, VIR_ERR_NO_SUPPORT, name); + virXendError(NULL, VIR_ERR_NO_SUPPORT, name); goto failed; } if (uri->scheme == NULL) { /* It should be a file access */ if (uri->path == NULL) { - virXendError(conn, VIR_ERR_NO_SUPPORT, name); + virXendError(NULL, VIR_ERR_NO_SUPPORT, name); goto failed; } ret = xenDaemonOpen_unix(conn, uri->path); @@ -1985,7 +1985,7 @@ if (ret == -1) goto failed; } else { - virXendError(conn, VIR_ERR_NO_SUPPORT, name); + virXendError(NULL, VIR_ERR_NO_SUPPORT, name); goto failed; } } diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/xen_unified.c libvirt-open-errors/src/xen_unified.c --- libvirt-cvs/src/xen_unified.c 2007-05-01 13:55:02.000000000 +0100 +++ libvirt-open-errors/src/xen_unified.c 2007-05-01 14:52:55.000000000 +0100 @@ -95,7 +95,7 @@ /* Allocate per-connection private data. */ priv = malloc (sizeof *priv); if (!priv) { - xenUnifiedError (conn, VIR_ERR_NO_MEMORY, "allocating private data"); + xenUnifiedError (NULL, VIR_ERR_NO_MEMORY, "allocating private data"); return VIR_DRV_OPEN_ERROR; } conn->privateData = priv; diff -urN --exclude=CVS --exclude=.git --exclude='*.pem' --exclude=demoCA --exclude=.gitignore --exclude='*.orig' --exclude='*.bak' libvirt-cvs/src/xs_internal.c libvirt-open-errors/src/xs_internal.c --- libvirt-cvs/src/xs_internal.c 2007-05-01 13:55:03.000000000 +0100 +++ libvirt-open-errors/src/xs_internal.c 2007-05-01 14:37:30.000000000 +0100 @@ -340,7 +340,7 @@ #endif /* ! PROXY */ if (priv->xshandle == NULL) { - virXenStoreError(conn, VIR_ERR_NO_XEN, + virXenStoreError(NULL, VIR_ERR_NO_XEN, _("failed to connect to Xen Store")); return (-1); }
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature