Re: [libvirt] [PATCH]: pass flags to all virDomain*DefParse* functions
by Guido Günther
On Thu, Jan 08, 2009 at 05:02:14PM +0100, Jim Meyering wrote:
[..snip..]
> Hi Guido,
>
> libvirt doesn't build right now, because of this:
>
> xm_internal.c:2288: error: too few arguments to function 'virDomainDefParseString'
> xm_internal.c:2530: error: too few arguments to function 'virDomainDeviceDefParse'
> xm_internal.c:2619: error: too few arguments to function 'virDomainDeviceDefParse'
> xend_internal.c:3860: error: too few arguments to function 'virDomainDeviceDefParse'
> xend_internal.c:3950: error: too few arguments to function 'virDomainDeviceDefParse'
Thought I had tested this with the Xen driver enabled, but seems I
didn't. Sorry! Attached patch fixes the build and passes "make check".
Thanks for pointing this out!
-- Guido
15 years, 10 months
[libvirt] [PATCH]: pass flags to all virDomain*DefParse* functions
by Guido Günther
On Thu, Dec 04, 2008 at 02:16:06PM +0100, Daniel Veillard wrote:
> On Thu, Dec 04, 2008 at 01:15:23PM +0100, Guido Günther wrote:
> > On Thu, Dec 04, 2008 at 10:56:25AM +0000, Daniel P. Berrange wrote:
> > > On Wed, Dec 03, 2008 at 06:20:12PM +0100, Guido G?nther wrote:
> > > > On Sun, Nov 30, 2008 at 12:43:48PM +0100, Guido Günther wrote:
> > > > > >From 87db4a698ed9b49294c0f94137fc6beef13bd4e8 Mon Sep 17 00:00:00 2001
> > > > > From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx(a)sigxcpu.org>
> > > > > Date: Tue, 25 Nov 2008 13:02:43 +0100
> > > > > Subject: [PATCH] differentiate between active and inactive configs
> > > > >
> > > > > by honoring the VIR_DOMAIN_XML_INACTIVE flag.
> > > > O.k. to commit this part as a start so you can readily use it vor lxc?
> > >
> > > ACK, assuming 'make check' still passes.
> > It does here, sure. Patch Applied now. I've added the flag to the
> > functions currently needed for qemu but if nobody objects I'd like to
> > add them to:
> >
> > virDomainDeviceDefParse
> > virDomainDefParseString
> > virDomainHostdevSubsysUsbDefParseXML
> > virDomainDiskDefParseXML
> > virDomainFSDefParseXML
> > virDomainNetDefParseXML
> > virDomainInputDefParseXML
> > virDomainSoundDefParseXML
> > virDomainHostdevDefParseXML
> > virDomainChrDefParseXML
>
> I'm about to release an intermediate 0.5.1 release with the bug and
> small improvement fixes since 0.5.0, I assume the more generic patch
> can wait after that, but that sounds right to me in principle.
Attached patch adds a flag parameter to the above functions and passes
VIR_DOMAIN_XML_INACTIVE from the upper levels. I see two advantages in
this:
* symmetric interfaces to the XML parsing functions (why has
virDomainDefParseFile a flags argument while virDomainDefParseString
hasn't)
* other drivers can use this very easily (IIRC lxc has some use for it)
otherwise there's not too much gain so I'm a bit undecided if this is
actually necessary.
-- Guido
15 years, 10 months
[libvirt] [PATCH] poll: don't return uninitialized
by Jim Meyering
Daniel Berrange fixed this yesterday.
http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=commitdiff;h=74e2d5b2fd5
It's in gnulib now, along with a change to make
the cpp nesting a little more readable.
This pulls the update poll.c into libvirt:
Thu Jan 8 09:48:04 CET 2009 Daniel P. Berrange <berrange(a)redhat.com>
poll: don't return uninitialized
* gnulib/lib/poll.c (poll) [WIN32_NATIVE]: Initialize "rc".
[sync from gnulib also adjusts cpp indentation to reflect nesting.]
>From 212721560f3f2bcf7329c48417e0ba24243fc554 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Thu, 8 Jan 2009 09:49:53 +0100
Subject: [PATCH] poll: don't return uninitialized
* gnulib/lib/poll.c (poll) [WIN32_NATIVE]: Initialize "rc".
[sync from gnulib also adjusts cpp indentation to reflect nesting.]
---
gnulib/lib/poll.c | 54 ++++++++++++++++++++++++++--------------------------
1 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/gnulib/lib/poll.c b/gnulib/lib/poll.c
index 87ddf3c..da9c9f2 100644
--- a/gnulib/lib/poll.c
+++ b/gnulib/lib/poll.c
@@ -1,7 +1,7 @@
/* Emulation for poll(2)
Contributed by Paolo Bonzini.
- Copyright 2001, 2002, 2003, 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright 2001-2003, 2006-2009 Free Software Foundation, Inc.
This file is part of gnulib.
@@ -29,35 +29,35 @@
#include <assert.h>
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
-#define WIN32_NATIVE
-#include <winsock2.h>
-#include <windows.h>
-#include <io.h>
-#include <stdio.h>
-#include <conio.h>
+# define WIN32_NATIVE
+# include <winsock2.h>
+# include <windows.h>
+# include <io.h>
+# include <stdio.h>
+# include <conio.h>
#else
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/select.h>
-#include <unistd.h>
+# include <sys/time.h>
+# include <sys/socket.h>
+# include <sys/select.h>
+# include <unistd.h>
#endif
#ifdef HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
+# include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_FILIO_H
-#include <sys/filio.h>
+# include <sys/filio.h>
#endif
#include <time.h>
#ifndef INFTIM
-#define INFTIM (-1)
+# define INFTIM (-1)
#endif
/* BeOS does not have MSG_PEEK. */
#ifndef MSG_PEEK
-#define MSG_PEEK 0
+# define MSG_PEEK 0
#endif
#ifdef WIN32_NATIVE
@@ -92,9 +92,9 @@ typedef enum _FILE_INFORMATION_CLASS {
typedef DWORD (WINAPI *PNtQueryInformationFile)
(HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
-#ifndef PIPE_BUF
-#define PIPE_BUF 512
-#endif
+# ifndef PIPE_BUF
+# define PIPE_BUF 512
+# endif
/* Compute revents values for file handle H. */
@@ -234,7 +234,7 @@ compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
int r;
int socket_errno;
-#if defined __MACH__ && defined __APPLE__
+# if defined __MACH__ && defined __APPLE__
/* There is a bug in Mac OS X that causes it to ignore MSG_PEEK
for some kinds of descriptors. Detect if this descriptor is a
connected socket, a server socket, or something else using a
@@ -243,11 +243,11 @@ compute_revents (int fd, int sought, fd_set *rfds, fd_set *wfds, fd_set *efds)
socket_errno = (r < 0) ? errno : 0;
if (r == 0 || socket_errno == ENOTSOCK)
ioctl (fd, FIONREAD, &r);
-#else
+# else
char data[64];
r = recv (fd, data, sizeof (data), MSG_PEEK);
socket_errno = (r < 0) ? errno : 0;
-#endif
+# endif
if (r == 0)
happened |= POLLHUP;
@@ -288,7 +288,7 @@ poll (pfd, nfd, timeout)
int maxfd, rc;
nfds_t i;
-#ifdef _SC_OPEN_MAX
+# ifdef _SC_OPEN_MAX
static int sc_open_max = -1;
if (nfd < 0
@@ -299,15 +299,15 @@ poll (pfd, nfd, timeout)
errno = EINVAL;
return -1;
}
-#else /* !_SC_OPEN_MAX */
-#ifdef OPEN_MAX
+# else /* !_SC_OPEN_MAX */
+# ifdef OPEN_MAX
if (nfd < 0 || nfd > OPEN_MAX)
{
errno = EINVAL;
return -1;
}
-#endif /* OPEN_MAX -- else, no check is needed */
-#endif /* !_SC_OPEN_MAX */
+# endif /* OPEN_MAX -- else, no check is needed */
+# endif /* !_SC_OPEN_MAX */
/* EFAULT is not necessary to implement, but let's do it in the
simplest case. */
@@ -405,7 +405,7 @@ poll (pfd, nfd, timeout)
BOOL poll_again;
MSG msg;
char sockbuf[256];
- int rc;
+ int rc = 0;
nfds_t i;
if (nfd < 0 || timeout < -1)
--
1.6.1.121.g866a4a
15 years, 10 months
[libvirt] PATCH: Thread-safe error reporting public API
by Daniel P. Berrange
The current public API for error reporting consists of
- A global error object
- A per-connection error object
Some functions always set errors on the global object. Other functions
always set errors on the per-connection object, except when they set
errors on the global object. Both have built-in race conditions if they
are accessed from multiple threads because of the time between the API
call raising the error, and the caller querying it.
The solution to this is to do away with all of the existing error objects
and replace them with a per-thread error object. Well, except we can't
do away with existing objects because of ABI compatability. This turns
out to not be such a bad problem after all....
So with this patch...
virterror.c gets ability to track a per-thread virErrorPtr instance. This
object is stored in a thread local variable via pthread_{get,set}specific.
It is allocated when first required, and deleted when the thread exits
Every single API will *always* set the virErrorPtr object associated with
its current thread.
In the public virterror.h we add
virErrorPtr virThreadGetLastError (void);
int virThreadCopyLastError (virErrorPtr to);
void virThreadResetLastError (void);
This provides a guarenteed thread-safe public API for fetching error
information. All the other existing APIs have docs updated to recommend
against their use.
In libvirt.c, in any exit paths which result in an error code, we copy
the per-thread virErrorPtr object into either the global error object
or per-connection object as applicable for the scenario. This gives us
100% backwards compatability. NB, we hold a lock when doing this so
that these are race-free when setting them.
At the start of every API call, we call virThreadResetLastError() and
at any exit path with an error, if the error object is not set, then
we set a generic error message. This means that if the internal driver
code is broken and forgets to raise an error, the caller will still
at least see a generic error report.
Finally, virCopyLastError and virConnCopyLastError were not correctly
strdup'ing the char * fields. This meant that if the original error
was cleared, you'd get a use-after-free error, shortly followed by
a double-free error if the first didn't kill you. This patch also
fixes those two methods to correctly strdup the char *.
As for language bindings, they should *all* be updated to use the
virThreadGetLastError() method, and *never* call virGetLastError()
or the virConnGetLastError() calls.
With this patch applied, assuming all the per-hypervisor drivers are
thread-safe (they are except for Xen which is still TODO), then the
public API for virConectPtr is also (almost[1]) guarenteed to be thread-
safe.
include/libvirt/virterror.h | 7
src/datatypes.c | 11
src/datatypes.h | 15
src/libvirt.c | 3729 ++++++++++++++++++++++++++++++--------------
src/libvirt_sym.version.in | 8
src/virterror.c | 281 +++
src/virterror_internal.h | 4
7 files changed, 2902 insertions(+), 1153 deletions(-)
Daniel
[1] We need to fix lots of stupid internal mistakes like strerror()
vs strerror_r() - these were already a problem even with libvirt
being single-threaded on virConnectPtr, because the app using
libvirt could be threaded. More on this later...
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
--- a/include/libvirt/virterror.h
+++ b/include/libvirt/virterror.h
@@ -187,6 +187,13 @@ void virConnSetErrorFunc (virConnectPt
virErrorFunc handler);
int virConnCopyLastError (virConnectPtr conn,
virErrorPtr to);
+
+
+virErrorPtr virThreadGetLastError (void);
+int virThreadCopyLastError (virErrorPtr to);
+void virThreadResetLastError (void);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/src/datatypes.c b/src/datatypes.c
--- a/src/datatypes.c
+++ b/src/datatypes.c
@@ -192,8 +192,6 @@ virReleaseConnect(virConnectPtr conn) {
virHashFree(conn->nodeDevices, (virHashDeallocator) virNodeDeviceFree);
virResetError(&conn->err);
- if (virLastErr.conn == conn)
- virLastErr.conn = NULL;
xmlFreeURI(conn->uri);
@@ -320,10 +318,6 @@ virReleaseDomain(virDomainPtr domain) {
virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
_("domain missing from connection hash table"));
- if (conn->err.dom == domain)
- conn->err.dom = NULL;
- if (virLastErr.dom == domain)
- virLastErr.dom = NULL;
domain->magic = -1;
domain->id = -1;
VIR_FREE(domain->name);
@@ -456,11 +450,6 @@ virReleaseNetwork(virNetworkPtr network)
virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
_("network missing from connection hash table"));
- if (conn->err.net == network)
- conn->err.net = NULL;
- if (virLastErr.net == network)
- virLastErr.net = NULL;
-
network->magic = -1;
VIR_FREE(network->name);
VIR_FREE(network);
diff --git a/src/datatypes.h b/src/datatypes.h
--- a/src/datatypes.h
+++ b/src/datatypes.h
@@ -95,6 +95,10 @@
* Internal structure associated to a connection
*/
struct _virConnect {
+ /* All the variables from here, until the 'lock' declaration
+ * are setup at time of connection open, and never changed
+ * since. Thus no need to lock when accessing them
+ */
unsigned int magic; /* specific value to check */
int flags; /* a set of connection flags */
xmlURIPtr uri; /* connection URI */
@@ -114,11 +118,6 @@ struct _virConnect {
void * storagePrivateData;
void * devMonPrivateData;
- /* Per-connection error. */
- virError err; /* the last error */
- virErrorFunc handler; /* associated handlet */
- void *userData; /* the user data */
-
/*
* The lock mutex must be acquired before accessing/changing
* any of members following this point, or changing the ref
@@ -126,6 +125,12 @@ struct _virConnect {
* this connection
*/
PTHREAD_MUTEX_T (lock);
+
+ /* Per-connection error. */
+ virError err; /* the last error */
+ virErrorFunc handler; /* associated handlet */
+ void *userData; /* the user data */
+
virHashTablePtr domains; /* hash table for known domains */
virHashTablePtr networks; /* hash table for known domains */
virHashTablePtr storagePools;/* hash table for known storage pools */
diff --git a/src/libvirt.c b/src/libvirt.c
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -778,6 +778,8 @@ virGetVersion(unsigned long *libVer, con
#endif
if (*typeVer == 0) {
virLibConnError(NULL, VIR_ERR_NO_SUPPORT, type);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
}
@@ -791,6 +793,8 @@ do_open (const char *name,
{
int i, res;
virConnectPtr ret;
+
+ virThreadResetLastError();
ret = virGetConnect();
if (ret == NULL)
@@ -945,17 +949,8 @@ failed:
failed:
if (ret->driver) ret->driver->close (ret);
- /* If no global error was set, copy any error set
- in the connection object we're about to dispose of */
- if (virLastErr.code == VIR_ERR_OK) {
- memcpy(&virLastErr, &ret->err, sizeof(ret->err));
- memset(&ret->err, 0, sizeof(ret->err));
- }
-
- /* Still no error set, then raise a generic error */
- if (virLastErr.code == VIR_ERR_OK)
- virLibConnError (NULL, VIR_ERR_INTERNAL_ERROR,
- _("unable to open connection"));
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
virUnrefConnect(ret);
@@ -1050,8 +1045,16 @@ virConnectClose(virConnectPtr conn)
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn))
- return (-1);
+ virThreadResetLastError();
+
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
if (conn->networkDriver)
conn->networkDriver->close (conn);
@@ -1061,8 +1064,11 @@ virConnectClose(virConnectPtr conn)
conn->deviceMonitor->close (conn);
conn->driver->close (conn);
- if (virUnrefConnect(conn) < 0)
- return (-1);
+ if (virUnrefConnect(conn) < 0) {
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
return (0);
}
@@ -1073,12 +1079,22 @@ int
int
virDrvSupportsFeature (virConnectPtr conn, int feature)
{
+ int ret;
DEBUG("conn=%p, feature=%d", conn, feature);
- if (!VIR_IS_CONNECT(conn))
- return (-1);
-
- return VIR_DRV_SUPPORTS_FEATURE (conn->driver, conn, feature);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ ret = VIR_DRV_SUPPORTS_FEATURE (conn->driver, conn, feature);
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return ret;
}
/**
@@ -1098,8 +1114,12 @@ virConnectGetType(virConnectPtr conn)
const char *ret;
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
@@ -1128,20 +1148,32 @@ virConnectGetVersion(virConnectPtr conn,
{
DEBUG("conn=%p, hvVer=%p", conn, hvVer);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
}
if (hvVer == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->version)
- return conn->driver->version (conn, hvVer);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->version) {
+ int ret = conn->driver->version (conn, hvVer);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -1162,15 +1194,27 @@ virConnectGetHostname (virConnectPtr con
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return NULL;
- }
-
- if (conn->driver->getHostname)
- return conn->driver->getHostname (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return NULL;
+ }
+
+ if (conn->driver->getHostname) {
+ char *ret = conn->driver->getHostname (conn);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -1193,26 +1237,37 @@ virConnectGetURI (virConnectPtr conn)
virConnectGetURI (virConnectPtr conn)
{
char *name;
-
- DEBUG("conn=%p", conn);
-
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ DEBUG("conn=%p", conn);
+
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
/* Drivers may override getURI, but if they don't then
* we provide a default implementation.
*/
- if (conn->driver->getURI)
- return conn->driver->getURI (conn);
+ if (conn->driver->getURI) {
+ name = conn->driver->getURI (conn);
+ if (!name)
+ goto error;
+ }
name = (char *)xmlSaveUri(conn->uri);
if (!name) {
virLibConnError (conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
- return NULL;
+ goto error;
}
return name;
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return NULL;
}
/**
@@ -1232,15 +1287,26 @@ virConnectGetMaxVcpus(virConnectPtr conn
{
DEBUG("conn=%p, type=%s", conn, type);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->getMaxVcpus)
- return conn->driver->getMaxVcpus (conn, type);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+
+ if (conn->driver->getMaxVcpus) {
+ int ret = conn->driver->getMaxVcpus (conn, type);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -1259,20 +1325,31 @@ virConnectListDomains(virConnectPtr conn
{
DEBUG("conn=%p, ids=%p, maxids=%d", conn, ids, maxids);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
}
if ((ids == NULL) || (maxids < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->listDomains)
- return conn->driver->listDomains (conn, ids, maxids);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->listDomains) {
+ int ret = conn->driver->listDomains (conn, ids, maxids);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -1289,15 +1366,26 @@ virConnectNumOfDomains(virConnectPtr con
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->numOfDomains)
- return conn->driver->numOfDomains (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ goto error;
+ }
+
+ if (conn->driver->numOfDomains) {
+ int ret = conn->driver->numOfDomains (conn);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -1320,8 +1408,12 @@ virDomainGetConnect (virDomainPtr dom)
{
DEBUG("dom=%p", dom);
+ virThreadResetLastError();
+
if (!VIR_IS_DOMAIN (dom)) {
virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
return dom->conn;
@@ -1348,23 +1440,35 @@ virDomainCreateXML(virConnectPtr conn, c
{
DEBUG("conn=%p, xmlDesc=%s, flags=%d", conn, xmlDesc, flags);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (xmlDesc == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->driver->domainCreateXML)
- return conn->driver->domainCreateXML (conn, xmlDesc, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainCreateXML) {
+ virDomainPtr ret;
+ ret = conn->driver->domainCreateXML (conn, xmlDesc, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -1404,19 +1508,32 @@ virDomainLookupByID(virConnectPtr conn,
{
DEBUG("conn=%p, id=%d", conn, id);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (id < 0) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->driver->domainLookupByID)
- return conn->driver->domainLookupByID (conn, id);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainLookupByID) {
+ virDomainPtr ret;
+ ret = conn->driver->domainLookupByID (conn, id);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -1435,19 +1552,32 @@ virDomainLookupByUUID(virConnectPtr conn
{
DEBUG("conn=%p, uuid=%s", conn, uuid);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (uuid == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->driver->domainLookupByUUID)
- return conn->driver->domainLookupByUUID (conn, uuid);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainLookupByUUID) {
+ virDomainPtr ret;
+ ret = conn->driver->domainLookupByUUID (conn, uuid);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -1470,14 +1600,17 @@ virDomainLookupByUUIDString(virConnectPt
DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (uuidstr == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
-
+ goto error;
}
/* XXX: sexpr_uuid() also supports 'xxxx-xxxx-xxxx-xxxx' format.
* We needn't it here. Right?
@@ -1495,12 +1628,17 @@ virDomainLookupByUUIDString(virConnectPt
if (ret!=VIR_UUID_BUFLEN) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
for (i = 0; i < VIR_UUID_BUFLEN; i++)
uuid[i] = raw[i] & 0xFF;
return virDomainLookupByUUID(conn, &uuid[0]);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return NULL;
}
/**
@@ -1518,19 +1656,32 @@ virDomainLookupByName(virConnectPtr conn
{
DEBUG("conn=%p, name=%s", conn, name);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (name == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->driver->domainLookupByName)
- return conn->driver->domainLookupByName (conn, name);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainLookupByName) {
+ virDomainPtr dom;
+ dom = conn->driver->domainLookupByName (conn, name);
+ if (!dom)
+ goto error;
+ return dom;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -1552,21 +1703,34 @@ virDomainDestroy(virDomainPtr domain)
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
- if (conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->domainDestroy)
- return conn->driver->domainDestroy (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ conn = domain->conn;
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainDestroy) {
+ int ret;
+ ret = conn->driver->domainDestroy (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -1584,12 +1748,18 @@ virDomainFree(virDomainPtr domain)
{
DEBUG("domain=%p", domain);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (virUnrefDomain(domain) < 0)
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (virUnrefDomain(domain) < 0) {
+ virThreadSetGlobalError();
+ return -1;
+ }
return(0);
}
@@ -1611,21 +1781,34 @@ virDomainSuspend(virDomainPtr domain)
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainSuspend)
- return conn->driver->domainSuspend (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainSuspend) {
+ int ret;
+ ret = conn->driver->domainSuspend (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -1645,21 +1828,34 @@ virDomainResume(virDomainPtr domain)
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainResume)
- return conn->driver->domainResume (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainResume) {
+ int ret;
+ ret = conn->driver->domainResume (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -1682,18 +1878,22 @@ virDomainSave(virDomainPtr domain, const
virConnectPtr conn;
DEBUG("domain=%p, to=%s", domain, to);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
}
conn = domain->conn;
if (to == NULL) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
/*
@@ -1716,10 +1916,19 @@ virDomainSave(virDomainPtr domain, const
}
- if (conn->driver->domainSave)
- return conn->driver->domainSave (domain, to);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->driver->domainSave) {
+ int ret;
+ ret = conn->driver->domainSave (domain, to);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -1738,17 +1947,21 @@ virDomainRestore(virConnectPtr conn, con
char filepath[4096];
DEBUG("conn=%p, from=%s", conn, from);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ goto error;
}
if (from == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
/*
@@ -1759,21 +1972,36 @@ virDomainRestore(virConnectPtr conn, con
unsigned int len, t;
t = strlen(from);
- if (getcwd(filepath, sizeof(filepath) - (t + 3)) == NULL)
- return (-1);
+ if (getcwd(filepath, sizeof(filepath) - (t + 3)) == NULL) {
+ virLibConnError(conn, VIR_ERR_SYSTEM_ERROR,
+ _("cannot get working directory"));
+ goto error;
+ }
len = strlen(filepath);
/* that should be covered by getcwd() semantic, but be 100% sure */
- if (len > sizeof(filepath) - (t + 3))
- return (-1);
+ if (len > sizeof(filepath) - (t + 3)) {
+ virLibConnError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("path too long"));
+ goto error;
+ }
filepath[len] = '/';
strcpy(&filepath[len + 1], from);
from = &filepath[0];
}
- if (conn->driver->domainRestore)
- return conn->driver->domainRestore (conn, from);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->driver->domainRestore) {
+ int ret;
+ ret = conn->driver->domainRestore (conn, from);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -1796,18 +2024,22 @@ virDomainCoreDump(virDomainPtr domain, c
virConnectPtr conn;
DEBUG("domain=%p, to=%s, flags=%d", domain, to, flags);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
}
conn = domain->conn;
if (to == NULL) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
/*
@@ -1818,22 +2050,37 @@ virDomainCoreDump(virDomainPtr domain, c
unsigned int len, t;
t = strlen(to);
- if (getcwd(filepath, sizeof(filepath) - (t + 3)) == NULL)
- return (-1);
+ if (getcwd(filepath, sizeof(filepath) - (t + 3)) == NULL) {
+ virLibDomainError(domain, VIR_ERR_SYSTEM_ERROR,
+ _("cannot get current directory"));
+ goto error;
+ }
len = strlen(filepath);
/* that should be covered by getcwd() semantic, but be 100% sure */
- if (len > sizeof(filepath) - (t + 3))
- return (-1);
+ if (len > sizeof(filepath) - (t + 3)) {
+ virLibDomainError(domain, VIR_ERR_INTERNAL_ERROR,
+ _("path too long"));
+ goto error;
+ }
filepath[len] = '/';
strcpy(&filepath[len + 1], to);
to = &filepath[0];
}
- if (conn->driver->domainCoreDump)
- return conn->driver->domainCoreDump (domain, to, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->driver->domainCoreDump) {
+ int ret;
+ ret = conn->driver->domainCoreDump (domain, to, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -1856,21 +2103,34 @@ virDomainShutdown(virDomainPtr domain)
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainShutdown)
- return conn->driver->domainShutdown (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainShutdown) {
+ int ret;
+ ret = conn->driver->domainShutdown (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -1891,21 +2151,34 @@ virDomainReboot(virDomainPtr domain, uns
virConnectPtr conn;
DEBUG("domain=%p, flags=%u", domain, flags);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainReboot)
- return conn->driver->domainReboot (domain, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainReboot) {
+ int ret;
+ ret = conn->driver->domainReboot (domain, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -1923,8 +2196,12 @@ virDomainGetName(virDomainPtr domain)
{
DEBUG("domain=%p", domain);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
return (domain->name);
@@ -1944,12 +2221,18 @@ virDomainGetUUID(virDomainPtr domain, un
{
DEBUG("domain=%p, uuid=%p", domain, uuid);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (uuid == NULL) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return (-1);
}
@@ -1974,20 +2257,29 @@ virDomainGetUUIDString(virDomainPtr doma
unsigned char uuid[VIR_UUID_BUFLEN];
DEBUG("domain=%p, buf=%p", domain, buf);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (buf == NULL) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
if (virDomainGetUUID(domain, &uuid[0]))
- return (-1);
+ goto error;
virUUIDFormat(uuid, buf);
return (0);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
+ return -1;
}
/**
@@ -2003,8 +2295,12 @@ virDomainGetID(virDomainPtr domain)
{
DEBUG("domain=%p", domain);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return ((unsigned int) -1);
}
return (domain->id);
@@ -2025,17 +2321,30 @@ virDomainGetOSType(virDomainPtr domain)
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (NULL);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainGetOSType)
- return conn->driver->domainGetOSType (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (NULL);
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainGetOSType) {
+ char *ret;
+ ret = conn->driver->domainGetOSType (domain);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return NULL;
}
@@ -2055,17 +2364,30 @@ virDomainGetMaxMemory(virDomainPtr domai
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (0);
}
conn = domain->conn;
- if (conn->driver->domainGetMaxMemory)
- return conn->driver->domainGetMaxMemory (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->driver->domainGetMaxMemory) {
+ unsigned long ret;
+ ret = conn->driver->domainGetMaxMemory (domain);
+ if (ret == 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return 0;
}
@@ -2087,28 +2409,37 @@ virDomainSetMaxMemory(virDomainPtr domai
virConnectPtr conn;
DEBUG("domain=%p, memory=%lu", domain, memory);
- if (domain == NULL) {
- TODO
- return (-1);
- }
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
}
if (memory < 4096) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- conn = domain->conn;
-
- if (conn->driver->domainSetMaxMemory)
- return conn->driver->domainSetMaxMemory (domain, memory);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainSetMaxMemory) {
+ int ret;
+ ret = conn->driver->domainSetMaxMemory (domain, memory);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -2130,29 +2461,38 @@ virDomainSetMemory(virDomainPtr domain,
virConnectPtr conn;
DEBUG("domain=%p, memory=%lu", domain, memory);
- if (domain == NULL) {
- TODO
- return (-1);
- }
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
}
if (memory < 4096) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainSetMemory)
- return conn->driver->domainSetMemory (domain, memory);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainSetMemory) {
+ int ret;
+ ret = conn->driver->domainSetMemory (domain, memory);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -2173,23 +2513,36 @@ virDomainGetInfo(virDomainPtr domain, vi
virConnectPtr conn;
DEBUG("domain=%p, info=%p", domain, info);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (info == NULL) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
memset(info, 0, sizeof(virDomainInfo));
conn = domain->conn;
- if (conn->driver->domainGetInfo)
- return conn->driver->domainGetInfo (domain, info);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->driver->domainGetInfo) {
+ int ret;
+ ret = conn->driver->domainGetInfo (domain, info);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -2210,17 +2563,30 @@ virDomainGetXMLDesc(virDomainPtr domain,
virConnectPtr conn;
DEBUG("domain=%p, flags=%d", domain, flags);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (NULL);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainDumpXML)
- return conn->driver->domainDumpXML (domain, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (NULL);
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainDumpXML) {
+ char *ret;
+ ret = conn->driver->domainDumpXML (domain, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return NULL;
}
@@ -2289,14 +2655,18 @@ virDomainMigrate (virDomainPtr domain,
DEBUG("domain=%p, dconn=%p, flags=%lu, dname=%s, uri=%s, bandwidth=%lu",
domain, dconn, flags, dname, uri, bandwidth);
+ virThreadResetLastError();
+
if (!VIR_IS_DOMAIN (domain)) {
virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
conn = domain->conn; /* Source connection. */
if (!VIR_IS_CONNECT (dconn)) {
virLibConnError (conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return NULL;
+ goto error;
}
/* Check that migration is supported by both drivers. */
@@ -2312,7 +2682,7 @@ virDomainMigrate (virDomainPtr domain,
version = 2;
else {
virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return NULL;
+ goto error;
}
/* Prepare the migration.
@@ -2347,13 +2717,13 @@ virDomainMigrate (virDomainPtr domain,
*/
if (!conn->driver->domainDumpXML) {
virLibConnError (conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
- return NULL;
+ goto error;
}
dom_xml = conn->driver->domainDumpXML (domain,
VIR_DOMAIN_XML_SECURE);
if (!dom_xml)
- return NULL;
+ goto error;
ret = dconn->driver->domainMigratePrepare2
(dconn, &cookie, &cookielen, uri, &uri_out, flags, dname,
@@ -2403,6 +2773,11 @@ virDomainMigrate (virDomainPtr domain,
free (uri_out);
free (cookie);
return ddomain;
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
+ return NULL;
}
/*
@@ -2421,17 +2796,30 @@ virDomainMigratePrepare (virConnectPtr d
{
DEBUG("dconn=%p, cookie=%p, cookielen=%p, uri_in=%s, uri_out=%p, flags=%lu, dname=%s, bandwidth=%lu", dconn, cookie, cookielen, uri_in, uri_out, flags, dname, bandwidth);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT (dconn)) {
virLibConnError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return -1;
- }
-
- if (dconn->driver->domainMigratePrepare)
- return dconn->driver->domainMigratePrepare (dconn, cookie, cookielen,
- uri_in, uri_out,
- flags, dname, bandwidth);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+
+ if (dconn->driver->domainMigratePrepare) {
+ int ret;
+ ret = dconn->driver->domainMigratePrepare (dconn, cookie, cookielen,
+ uri_in, uri_out,
+ flags, dname, bandwidth);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibConnError (dconn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dconn);
return -1;
}
@@ -2451,18 +2839,31 @@ virDomainMigratePerform (virDomainPtr do
virConnectPtr conn;
DEBUG("domain=%p, cookie=%p, cookielen=%d, uri=%s, flags=%lu, dname=%s, bandwidth=%lu", domain, cookie, cookielen, uri, flags, dname, bandwidth);
+ virThreadResetLastError();
+
if (!VIR_IS_DOMAIN (domain)) {
virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return -1;
- }
- conn = domain->conn;
-
- if (conn->driver->domainMigratePerform)
- return conn->driver->domainMigratePerform (domain, cookie, cookielen,
- uri,
- flags, dname, bandwidth);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainMigratePerform) {
+ int ret;
+ ret = conn->driver->domainMigratePerform (domain, cookie, cookielen,
+ uri,
+ flags, dname, bandwidth);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibDomainError (domain, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -2480,17 +2881,30 @@ virDomainMigrateFinish (virConnectPtr dc
{
DEBUG("dconn=%p, dname=%s, cookie=%p, cookielen=%d, uri=%s, flags=%lu", dconn, dname, cookie, cookielen, uri, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT (dconn)) {
virLibConnError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return NULL;
- }
-
- if (dconn->driver->domainMigrateFinish)
- return dconn->driver->domainMigrateFinish (dconn, dname,
- cookie, cookielen,
- uri, flags);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return NULL;
+ }
+
+ if (dconn->driver->domainMigrateFinish) {
+ virDomainPtr ret;
+ ret = dconn->driver->domainMigrateFinish (dconn, dname,
+ cookie, cookielen,
+ uri, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
virLibConnError (dconn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dconn);
return NULL;
}
@@ -2512,18 +2926,31 @@ virDomainMigratePrepare2 (virConnectPtr
{
DEBUG("dconn=%p, cookie=%p, cookielen=%p, uri_in=%s, uri_out=%p, flags=%lu, dname=%s, bandwidth=%lu, dom_xml=%s", dconn, cookie, cookielen, uri_in, uri_out, flags, dname, bandwidth, dom_xml);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT (dconn)) {
virLibConnError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return -1;
- }
-
- if (dconn->driver->domainMigratePrepare2)
- return dconn->driver->domainMigratePrepare2 (dconn, cookie, cookielen,
- uri_in, uri_out,
- flags, dname, bandwidth,
- dom_xml);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+
+ if (dconn->driver->domainMigratePrepare2) {
+ int ret;
+ ret = dconn->driver->domainMigratePrepare2 (dconn, cookie, cookielen,
+ uri_in, uri_out,
+ flags, dname, bandwidth,
+ dom_xml);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibConnError (dconn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dconn);
return -1;
}
@@ -2542,18 +2969,31 @@ virDomainMigrateFinish2 (virConnectPtr d
{
DEBUG("dconn=%p, dname=%s, cookie=%p, cookielen=%d, uri=%s, flags=%lu, retcode=%d", dconn, dname, cookie, cookielen, uri, flags, retcode);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT (dconn)) {
virLibConnError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return NULL;
- }
-
- if (dconn->driver->domainMigrateFinish2)
- return dconn->driver->domainMigrateFinish2 (dconn, dname,
- cookie, cookielen,
- uri, flags,
- retcode);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return NULL;
+ }
+
+ if (dconn->driver->domainMigrateFinish2) {
+ virDomainPtr ret;
+ ret = dconn->driver->domainMigrateFinish2 (dconn, dname,
+ cookie, cookielen,
+ uri, flags,
+ retcode);
+ if (!ret)
+ goto error;
+ return ret;
+ }
virLibConnError (dconn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dconn);
return NULL;
}
@@ -2572,19 +3012,32 @@ virNodeGetInfo(virConnectPtr conn, virNo
{
DEBUG("conn=%p, info=%p", conn, info);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (info == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->nodeGetInfo)
- return conn->driver->nodeGetInfo (conn, info);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->nodeGetInfo) {
+ int ret;
+ ret = conn->driver->nodeGetInfo (conn, info);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -2603,15 +3056,28 @@ virConnectGetCapabilities (virConnectPtr
{
DEBUG("conn=%p", conn);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT (conn)) {
virLibConnError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return NULL;
- }
-
- if (conn->driver->getCapabilities)
- return conn->driver->getCapabilities (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return NULL;
+ }
+
+ if (conn->driver->getCapabilities) {
+ char *ret;
+ ret = conn->driver->getCapabilities (conn);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -2628,15 +3094,28 @@ virNodeGetFreeMemory(virConnectPtr conn)
{
DEBUG("conn=%p", conn);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT (conn)) {
virLibConnError (NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return 0;
}
- if (conn->driver->getFreeMemory)
- return conn->driver->getFreeMemory (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->driver->getFreeMemory) {
+ unsigned long long ret;
+ ret = conn->driver->getFreeMemory (conn);
+ if (ret == 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return 0;
}
@@ -2656,18 +3135,28 @@ virDomainGetSchedulerType(virDomainPtr d
char *schedtype;
DEBUG("domain=%p, nparams=%p", domain, nparams);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
conn = domain->conn;
if (conn->driver->domainGetSchedulerType){
schedtype = conn->driver->domainGetSchedulerType (domain, nparams);
+ if (!schedtype)
+ goto error;
return schedtype;
}
virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return NULL;
}
@@ -2693,16 +3182,29 @@ virDomainGetSchedulerParameters(virDomai
virConnectPtr conn;
DEBUG("domain=%p, params=%p, nparams=%p", domain, params, nparams);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return -1;
- }
- conn = domain->conn;
-
- if (conn->driver->domainGetSchedulerParameters)
- return conn->driver->domainGetSchedulerParameters (domain, params, nparams);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainGetSchedulerParameters) {
+ int ret;
+ ret = conn->driver->domainGetSchedulerParameters (domain, params, nparams);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -2725,20 +3227,33 @@ virDomainSetSchedulerParameters(virDomai
virConnectPtr conn;
DEBUG("domain=%p, params=%p, nparams=%d", domain, params, nparams);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return -1;
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return -1;
- }
- conn = domain->conn;
-
- if (conn->driver->domainSetSchedulerParameters)
- return conn->driver->domainSetSchedulerParameters (domain, params, nparams);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainSetSchedulerParameters) {
+ int ret;
+ ret = conn->driver->domainSetSchedulerParameters (domain, params, nparams);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -2774,25 +3289,33 @@ virDomainBlockStats (virDomainPtr dom, c
struct _virDomainBlockStats stats2 = { -1, -1, -1, -1, -1 };
DEBUG("domain=%p, path=%s, stats=%p, size=%zi", dom, path, stats, size);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
+ virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
if (!stats || size > sizeof stats2) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return -1;
- }
- if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
- virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return -1;
+ goto error;
}
conn = dom->conn;
if (conn->driver->domainBlockStats) {
if (conn->driver->domainBlockStats (dom, path, &stats2) == -1)
- return -1;
+ goto error;
memcpy (stats, &stats2, size);
return 0;
}
virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dom->conn);
return -1;
}
@@ -2826,25 +3349,33 @@ virDomainInterfaceStats (virDomainPtr do
-1, -1, -1, -1 };
DEBUG("domain=%p, path=%s, stats=%p, size=%zi", dom, path, stats, size);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
+ virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
if (!stats || size > sizeof stats2) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return -1;
- }
- if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
- virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return -1;
+ goto error;
}
conn = dom->conn;
if (conn->driver->domainInterfaceStats) {
if (conn->driver->domainInterfaceStats (dom, path, &stats2) == -1)
- return -1;
+ goto error;
memcpy (stats, &stats2, size);
return 0;
}
virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dom->conn);
return -1;
}
@@ -2899,8 +3430,12 @@ virDomainBlockPeek (virDomainPtr dom,
DEBUG("domain=%p, path=%s, offset=%lld, size=%zi, buffer=%p",
dom, path, offset, size, buffer);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return -1;
}
conn = dom->conn;
@@ -2908,27 +3443,36 @@ virDomainBlockPeek (virDomainPtr dom,
if (!path) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG,
_("path is NULL"));
- return -1;
+ goto error;
}
if (flags != 0) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG,
_("flags must be zero"));
- return -1;
+ goto error;
}
/* Allow size == 0 as an access test. */
if (size > 0 && !buffer) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG,
_("buffer is NULL"));
- return -1;
- }
-
- if (conn->driver->domainBlockPeek)
- return conn->driver->domainBlockPeek (dom, path, offset, size,
- buffer, flags);
+ goto error;
+ }
+
+ if (conn->driver->domainBlockPeek) {
+ int ret;
+ ret =conn->driver->domainBlockPeek (dom, path, offset, size,
+ buffer, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dom->conn);
return -1;
}
@@ -2974,8 +3518,12 @@ virDomainMemoryPeek (virDomainPtr dom,
DEBUG ("domain=%p, start=%lld, size=%zi, buffer=%p, flags=%d",
dom, start, size, buffer, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return -1;
}
conn = dom->conn;
@@ -3004,21 +3552,30 @@ virDomainMemoryPeek (virDomainPtr dom,
if (flags != VIR_MEMORY_VIRTUAL) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG,
_("flags parameter must be VIR_MEMORY_VIRTUAL"));
- return -1;
+ goto error;
}
/* Allow size == 0 as an access test. */
if (size > 0 && !buffer) {
virLibDomainError (dom, VIR_ERR_INVALID_ARG,
_("buffer is NULL but size is non-zero"));
- return -1;
- }
-
- if (conn->driver->domainMemoryPeek)
- return conn->driver->domainMemoryPeek (dom, start, size,
- buffer, flags);
+ goto error;
+ }
+
+ if (conn->driver->domainMemoryPeek) {
+ int ret;
+ ret = conn->driver->domainMemoryPeek (dom, start, size,
+ buffer, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dom->conn);
return -1;
}
@@ -3044,23 +3601,36 @@ virDomainDefineXML(virConnectPtr conn, c
virDomainDefineXML(virConnectPtr conn, const char *xml) {
DEBUG("conn=%p, xml=%s", conn, xml);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (xml == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->driver->domainDefineXML)
- return conn->driver->domainDefineXML (conn, xml);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainDefineXML) {
+ virDomainPtr ret;
+ ret = conn->driver->domainDefineXML (conn, xml);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -3077,20 +3647,33 @@ virDomainUndefine(virDomainPtr domain) {
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- conn = domain->conn;
- if (conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->domainUndefine)
- return conn->driver->domainUndefine (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ conn = domain->conn;
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainUndefine) {
+ int ret;
+ ret = conn->driver->domainUndefine (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3107,15 +3690,28 @@ virConnectNumOfDefinedDomains(virConnect
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->numOfDefinedDomains)
- return conn->driver->numOfDefinedDomains (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ if (conn->driver->numOfDefinedDomains) {
+ int ret;
+ ret = conn->driver->numOfDefinedDomains (conn);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3135,20 +3731,33 @@ virConnectListDefinedDomains(virConnectP
int maxnames) {
DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((names == NULL) || (maxnames < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->listDefinedDomains)
- return conn->driver->listDefinedDomains (conn, names, maxnames);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->listDefinedDomains) {
+ int ret;
+ ret = conn->driver->listDefinedDomains (conn, names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3166,24 +3775,33 @@ virDomainCreate(virDomainPtr domain) {
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (domain == NULL) {
- TODO
- return (-1);
- }
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- conn = domain->conn;
- if (conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->domainCreate)
- return conn->driver->domainCreate (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ conn = domain->conn;
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->domainCreate) {
+ int ret;
+ ret = conn->driver->domainCreate (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3205,21 +3823,34 @@ virDomainGetAutostart(virDomainPtr domai
virConnectPtr conn;
DEBUG("domain=%p, autostart=%p", domain, autostart);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (!autostart) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainGetAutostart)
- return conn->driver->domainGetAutostart (domain, autostart);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainGetAutostart) {
+ int ret;
+ ret = conn->driver->domainGetAutostart (domain, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3240,17 +3871,30 @@ virDomainSetAutostart(virDomainPtr domai
virConnectPtr conn;
DEBUG("domain=%p, autostart=%d", domain, autostart);
- if (!VIR_IS_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainSetAutostart)
- return conn->driver->domainSetAutostart (domain, autostart);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainSetAutostart) {
+ int ret;
+ ret = conn->driver->domainSetAutostart (domain, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3273,29 +3917,38 @@ virDomainSetVcpus(virDomainPtr domain, u
virConnectPtr conn;
DEBUG("domain=%p, nvcpus=%u", domain, nvcpus);
- if (domain == NULL) {
- TODO
- return (-1);
- }
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
}
if (nvcpus < 1) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- conn = domain->conn;
-
- if (conn->driver->domainSetVcpus)
- return conn->driver->domainSetVcpus (domain, nvcpus);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainSetVcpus) {
+ int ret;
+ ret = conn->driver->domainSetVcpus (domain, nvcpus);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3324,30 +3977,39 @@ virDomainPinVcpu(virDomainPtr domain, un
virConnectPtr conn;
DEBUG("domain=%p, vcpu=%u, cpumap=%p, maplen=%d", domain, vcpu, cpumap, maplen);
- if (domain == NULL) {
- TODO
- return (-1);
- }
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
}
if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainPinVcpu)
- return conn->driver->domainPinVcpu (domain, vcpu, cpumap, maplen);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainPinVcpu) {
+ int ret;
+ ret = conn->driver->domainPinVcpu (domain, vcpu, cpumap, maplen);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3379,30 +4041,39 @@ virDomainGetVcpus(virDomainPtr domain, v
virConnectPtr conn;
DEBUG("domain=%p, info=%p, maxinfo=%d, cpumaps=%p, maplen=%d", domain, info, maxinfo, cpumaps, maplen);
- if (domain == NULL) {
- TODO
- return (-1);
- }
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((info == NULL) || (maxinfo < 1)) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
if (cpumaps != NULL && maplen < 1) {
virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainGetVcpus)
- return conn->driver->domainGetVcpus (domain, info, maxinfo,
- cpumaps, maplen);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainGetVcpus) {
+ int ret;
+ ret = conn->driver->domainGetVcpus (domain, info, maxinfo,
+ cpumaps, maplen);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3424,17 +4095,30 @@ virDomainGetMaxVcpus(virDomainPtr domain
virConnectPtr conn;
DEBUG("domain=%p", domain);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
-
- conn = domain->conn;
-
- if (conn->driver->domainGetMaxVcpus)
- return conn->driver->domainGetMaxVcpus (domain);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ conn = domain->conn;
+
+ if (conn->driver->domainGetMaxVcpus) {
+ int ret;
+ ret = conn->driver->domainGetMaxVcpus (domain);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3454,20 +4138,33 @@ virDomainAttachDevice(virDomainPtr domai
virConnectPtr conn;
DEBUG("domain=%p, xml=%s", domain, xml);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
- conn = domain->conn;
-
- if (conn->driver->domainAttachDevice)
- return conn->driver->domainAttachDevice (domain, xml);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainAttachDevice) {
+ int ret;
+ ret = conn->driver->domainAttachDevice (domain, xml);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3486,20 +4183,33 @@ virDomainDetachDevice(virDomainPtr domai
virConnectPtr conn;
DEBUG("domain=%p, xml=%s", domain, xml);
- if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
- virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
- return (-1);
- }
- if (domain->conn->flags & VIR_CONNECT_RO) {
- virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
- conn = domain->conn;
-
- if (conn->driver->domainDetachDevice)
- return conn->driver->domainDetachDevice (domain, xml);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (domain->conn->flags & VIR_CONNECT_RO) {
+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ goto error;
+ }
+ conn = domain->conn;
+
+ if (conn->driver->domainDetachDevice) {
+ int ret;
+ ret = conn->driver->domainDetachDevice (domain, xml);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(domain->conn);
return -1;
}
@@ -3528,20 +4238,33 @@ virNodeGetCellsFreeMemory(virConnectPtr
DEBUG("conn=%p, freeMems=%p, startCell=%d, maxCells=%d",
conn, freeMems, startCell, maxCells);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECT(conn)) {
virLibConnError(conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((freeMems == NULL) || (maxCells <= 0) || (startCell < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->driver->nodeGetCellsFreeMemory)
- return conn->driver->nodeGetCellsFreeMemory (conn, freeMems, startCell, maxCells);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->driver->nodeGetCellsFreeMemory) {
+ int ret;
+ ret = conn->driver->nodeGetCellsFreeMemory (conn, freeMems, startCell, maxCells);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3564,8 +4287,12 @@ virNetworkGetConnect (virNetworkPtr net)
{
DEBUG("net=%p", net);
+ virThreadResetLastError();
+
if (!VIR_IS_NETWORK (net)) {
virLibNetworkError (NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
return net->conn;
@@ -3584,15 +4311,28 @@ virConnectNumOfNetworks(virConnectPtr co
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->numOfNetworks)
- return conn->networkDriver->numOfNetworks (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->numOfNetworks) {
+ int ret;
+ ret = conn->networkDriver->numOfNetworks (conn);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3611,20 +4351,33 @@ virConnectListNetworks(virConnectPtr con
{
DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((names == NULL) || (maxnames < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->listNetworks)
- return conn->networkDriver->listNetworks (conn, names, maxnames);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->listNetworks) {
+ int ret;
+ ret = conn->networkDriver->listNetworks (conn, names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3641,15 +4394,28 @@ virConnectNumOfDefinedNetworks(virConnec
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->numOfDefinedNetworks)
- return conn->networkDriver->numOfDefinedNetworks (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->numOfDefinedNetworks) {
+ int ret;
+ ret = conn->networkDriver->numOfDefinedNetworks (conn);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3669,21 +4435,34 @@ virConnectListDefinedNetworks(virConnect
{
DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((names == NULL) || (maxnames < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->listDefinedNetworks)
- return conn->networkDriver->listDefinedNetworks (conn,
- names, maxnames);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->listDefinedNetworks) {
+ int ret;
+ ret = conn->networkDriver->listDefinedNetworks (conn,
+ names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -3702,19 +4481,32 @@ virNetworkLookupByName(virConnectPtr con
{
DEBUG("conn=%p, name=%s", conn, name);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (name == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkLookupByName)
- return conn->networkDriver->networkLookupByName (conn, name);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkLookupByName) {
+ virNetworkPtr ret;
+ ret = conn->networkDriver->networkLookupByName (conn, name);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -3733,19 +4525,32 @@ virNetworkLookupByUUID(virConnectPtr con
{
DEBUG("conn=%p, uuid=%s", conn, uuid);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (uuid == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkLookupByUUID)
- return conn->networkDriver->networkLookupByUUID (conn, uuid);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkLookupByUUID){
+ virNetworkPtr ret;
+ ret = conn->networkDriver->networkLookupByUUID (conn, uuid);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -3767,13 +4572,17 @@ virNetworkLookupByUUIDString(virConnectP
int ret;
DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (uuidstr == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
/* XXX: sexpr_uuid() also supports 'xxxx-xxxx-xxxx-xxxx' format.
@@ -3792,12 +4601,17 @@ virNetworkLookupByUUIDString(virConnectP
if (ret!=VIR_UUID_BUFLEN) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
for (i = 0; i < VIR_UUID_BUFLEN; i++)
uuid[i] = raw[i] & 0xFF;
return virNetworkLookupByUUID(conn, &uuid[0]);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return NULL;
}
/**
@@ -3815,23 +4629,36 @@ virNetworkCreateXML(virConnectPtr conn,
{
DEBUG("conn=%p, xmlDesc=%s", conn, xmlDesc);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (xmlDesc == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkCreateXML)
- return conn->networkDriver->networkCreateXML (conn, xmlDesc);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkCreateXML) {
+ virNetworkPtr ret;
+ ret = conn->networkDriver->networkCreateXML (conn, xmlDesc);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -3849,23 +4676,36 @@ virNetworkDefineXML(virConnectPtr conn,
{
DEBUG("conn=%p, xml=%s", conn, xml);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (xml == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkDefineXML)
- return conn->networkDriver->networkDefineXML (conn, xml);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkDefineXML) {
+ virNetworkPtr ret;
+ ret = conn->networkDriver->networkDefineXML (conn, xml);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -3882,20 +4722,33 @@ virNetworkUndefine(virNetworkPtr network
virConnectPtr conn;
DEBUG("network=%p", network);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NETWORK(network)) {
virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = network->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkUndefine)
- return conn->networkDriver->networkUndefine (network);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkUndefine) {
+ int ret;
+ ret = conn->networkDriver->networkUndefine (network);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return -1;
}
@@ -3914,24 +4767,33 @@ virNetworkCreate(virNetworkPtr network)
virConnectPtr conn;
DEBUG("network=%p", network);
- if (network == NULL) {
- TODO
- return (-1);
- }
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NETWORK(network)) {
virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = network->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkCreate)
- return conn->networkDriver->networkCreate (network);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkCreate) {
+ int ret;
+ ret = conn->networkDriver->networkCreate (network);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return -1;
}
@@ -3952,21 +4814,34 @@ virNetworkDestroy(virNetworkPtr network)
virConnectPtr conn;
DEBUG("network=%p", network);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NETWORK(network)) {
virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = network->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->networkDriver && conn->networkDriver->networkDestroy)
- return conn->networkDriver->networkDestroy (network);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkDestroy) {
+ int ret;
+ ret = conn->networkDriver->networkDestroy (network);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return -1;
}
@@ -3984,12 +4859,19 @@ virNetworkFree(virNetworkPtr network)
{
DEBUG("network=%p", network);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
- return (-1);
- }
- if (virUnrefNetwork(network) < 0)
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (virUnrefNetwork(network) < 0) {
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
return(0);
}
@@ -4007,8 +4889,12 @@ virNetworkGetName(virNetworkPtr network)
{
DEBUG("network=%p", network);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
return (network->name);
@@ -4028,18 +4914,27 @@ virNetworkGetUUID(virNetworkPtr network,
{
DEBUG("network=%p, uuid=%p", network, uuid);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (uuid == NULL) {
virLibNetworkError(network, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
memcpy(uuid, &network->uuid[0], VIR_UUID_BUFLEN);
return (0);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
+ return -1;
}
/**
@@ -4058,13 +4953,17 @@ virNetworkGetUUIDString(virNetworkPtr ne
unsigned char uuid[VIR_UUID_BUFLEN];
DEBUG("network=%p, buf=%p", network, buf);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (buf == NULL) {
virLibNetworkError(network, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
if (virNetworkGetUUID(network, &uuid[0]))
@@ -4072,6 +4971,11 @@ virNetworkGetUUIDString(virNetworkPtr ne
virUUIDFormat(uuid, buf);
return (0);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
+ return -1;
}
/**
@@ -4091,21 +4995,34 @@ virNetworkGetXMLDesc(virNetworkPtr netwo
virConnectPtr conn;
DEBUG("network=%p, flags=%d", network, flags);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (flags != 0) {
virLibNetworkError(network, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
conn = network->conn;
- if (conn->networkDriver && conn->networkDriver->networkDumpXML)
- return conn->networkDriver->networkDumpXML (network, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->networkDriver && conn->networkDriver->networkDumpXML) {
+ char *ret;
+ ret = conn->networkDriver->networkDumpXML (network, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return NULL;
}
@@ -4125,17 +5042,30 @@ virNetworkGetBridgeName(virNetworkPtr ne
virConnectPtr conn;
DEBUG("network=%p", network);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
conn = network->conn;
- if (conn->networkDriver && conn->networkDriver->networkGetBridgeName)
- return conn->networkDriver->networkGetBridgeName (network);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->networkDriver && conn->networkDriver->networkGetBridgeName) {
+ char *ret;
+ ret = conn->networkDriver->networkGetBridgeName (network);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return NULL;
}
@@ -4157,21 +5087,34 @@ virNetworkGetAutostart(virNetworkPtr net
virConnectPtr conn;
DEBUG("network=%p, autostart=%p", network, autostart);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (!autostart) {
virLibNetworkError(network, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
conn = network->conn;
- if (conn->networkDriver && conn->networkDriver->networkGetAutostart)
- return conn->networkDriver->networkGetAutostart (network, autostart);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->networkDriver && conn->networkDriver->networkGetAutostart) {
+ int ret;
+ ret = conn->networkDriver->networkGetAutostart (network, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return -1;
}
@@ -4192,17 +5135,30 @@ virNetworkSetAutostart(virNetworkPtr net
virConnectPtr conn;
DEBUG("network=%p, autostart=%d", network, autostart);
- if (!VIR_IS_NETWORK(network)) {
- virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = network->conn;
- if (conn->networkDriver && conn->networkDriver->networkSetAutostart)
- return conn->networkDriver->networkSetAutostart (network, autostart);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->networkDriver && conn->networkDriver->networkSetAutostart) {
+ int ret;
+ ret = conn->networkDriver->networkSetAutostart (network, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(network->conn);
return -1;
}
@@ -4226,8 +5182,12 @@ virStoragePoolGetConnect (virStoragePool
{
DEBUG("pool=%p", pool);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_POOL (pool)) {
virLibStoragePoolError (NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
return pool->conn;
@@ -4246,15 +5206,28 @@ virConnectNumOfStoragePools (virConnectP
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->numOfPools)
- return conn->storageDriver->numOfPools (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ if (conn->storageDriver && conn->storageDriver->numOfPools) {
+ int ret;
+ ret = conn->storageDriver->numOfPools (conn);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -4277,22 +5250,34 @@ virConnectListStoragePools (virConnectPt
{
DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((names == NULL) || (maxnames < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->listPools)
- return conn->storageDriver->listPools (conn, names, maxnames);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
-
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->listPools) {
+ int ret;
+ ret = conn->storageDriver->listPools (conn, names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return -1;
}
@@ -4309,15 +5294,28 @@ virConnectNumOfDefinedStoragePools(virCo
{
DEBUG("conn=%p", conn);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->numOfDefinedPools)
- return conn->storageDriver->numOfDefinedPools (conn);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ if (conn->storageDriver && conn->storageDriver->numOfDefinedPools) {
+ int ret;
+ ret = conn->storageDriver->numOfDefinedPools (conn);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -4341,20 +5339,33 @@ virConnectListDefinedStoragePools(virCon
{
DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((names == NULL) || (maxnames < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->listDefinedPools)
- return conn->storageDriver->listDefinedPools (conn, names, maxnames);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->listDefinedPools) {
+ int ret;
+ ret = conn->storageDriver->listDefinedPools (conn, names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -4386,19 +5397,34 @@ virConnectFindStoragePoolSources(virConn
const char *srcSpec,
unsigned int flags)
{
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ DEBUG("conn=%p, type=%s, src=%s, flags=%u", conn, type ? type : "", srcSpec ? srcSpec : "", flags);
+
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
if (type == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return NULL;
- }
-
- if (conn->storageDriver && conn->storageDriver->findPoolSources)
- return conn->storageDriver->findPoolSources(conn, type, srcSpec, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->findPoolSources) {
+ char *ret;
+ ret = conn->storageDriver->findPoolSources(conn, type, srcSpec, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -4418,19 +5444,32 @@ virStoragePoolLookupByName(virConnectPtr
{
DEBUG("conn=%p, name=%s", conn, name);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (name == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolLookupByName)
- return conn->storageDriver->poolLookupByName (conn, name);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolLookupByName) {
+ virStoragePoolPtr ret;
+ ret = conn->storageDriver->poolLookupByName (conn, name);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -4450,21 +5489,33 @@ virStoragePoolLookupByUUID(virConnectPtr
{
DEBUG("conn=%p, uuid=%s", conn, uuid);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (uuid == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolLookupByUUID)
- return conn->storageDriver->poolLookupByUUID (conn, uuid);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return NULL;
-
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolLookupByUUID) {
+ virStoragePoolPtr ret;
+ ret = conn->storageDriver->poolLookupByUUID (conn, uuid);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return NULL;
}
@@ -4479,26 +5530,35 @@ virStoragePoolLookupByUUID(virConnectPtr
*/
virStoragePoolPtr
virStoragePoolLookupByUUIDString(virConnectPtr conn,
- const char *uuidstr)
+ const char *uuidstr)
{
unsigned char uuid[VIR_UUID_BUFLEN];
DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (uuidstr == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (virUUIDParse(uuidstr, uuid) < 0) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
return virStoragePoolLookupByUUID(conn, uuid);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return NULL;
}
@@ -4515,17 +5575,29 @@ virStoragePoolLookupByVolume(virStorageV
{
DEBUG("vol=%p", vol);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL(vol)) {
virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
- return (NULL);
- }
-
- if (vol->conn->storageDriver && vol->conn->storageDriver->poolLookupByVolume)
- return vol->conn->storageDriver->poolLookupByVolume (vol);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (NULL);
+ }
+
+ if (vol->conn->storageDriver && vol->conn->storageDriver->poolLookupByVolume) {
+ virStoragePoolPtr ret;
+ ret = vol->conn->storageDriver->poolLookupByVolume (vol);
+ if (!ret)
+ goto error;
+ return ret;
+ }
virLibConnError (vol->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return NULL;
-
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(vol->conn);
+ return NULL;
}
/**
@@ -4547,23 +5619,36 @@ virStoragePoolCreateXML(virConnectPtr co
{
DEBUG("conn=%p, xmlDesc=%s", conn, xmlDesc);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (xmlDesc == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolCreateXML)
- return conn->storageDriver->poolCreateXML (conn, xmlDesc, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolCreateXML) {
+ virStoragePoolPtr ret;
+ ret = conn->storageDriver->poolCreateXML (conn, xmlDesc, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -4585,25 +5670,37 @@ virStoragePoolDefineXML(virConnectPtr co
{
DEBUG("conn=%p, xml=%s", conn, xml);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (conn->flags & VIR_CONNECT_RO) {
virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
+ goto error;
}
if (xml == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolDefineXML)
- return conn->storageDriver->poolDefineXML (conn, xml, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return NULL;
-
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolDefineXML) {
+ virStoragePoolPtr ret;
+ ret = conn->storageDriver->poolDefineXML (conn, xml, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return NULL;
}
/**
@@ -4622,22 +5719,34 @@ virStoragePoolBuild(virStoragePoolPtr po
virConnectPtr conn;
DEBUG("pool=%p, flags=%u", pool, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = pool->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolBuild)
- return conn->storageDriver->poolBuild (pool, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
-
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolBuild) {
+ int ret;
+ ret = conn->storageDriver->poolBuild (pool, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return -1;
}
@@ -4654,23 +5763,35 @@ virStoragePoolUndefine(virStoragePoolPtr
{
virConnectPtr conn;
DEBUG("pool=%p", pool);
+
+ virThreadResetLastError();
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = pool->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolUndefine)
- return conn->storageDriver->poolUndefine (pool);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
-
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolUndefine) {
+ int ret;
+ ret = conn->storageDriver->poolUndefine (pool);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return -1;
}
@@ -4690,26 +5811,34 @@ virStoragePoolCreate(virStoragePoolPtr p
virConnectPtr conn;
DEBUG("pool=%p", pool);
- if (pool == NULL) {
- TODO;
- return (-1);
- }
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = pool->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolCreate)
- return conn->storageDriver->poolCreate (pool, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
-
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolCreate) {
+ int ret;
+ ret = conn->storageDriver->poolCreate (pool, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return -1;
}
@@ -4731,21 +5860,34 @@ virStoragePoolDestroy(virStoragePoolPtr
virConnectPtr conn;
DEBUG("pool=%p", pool);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = pool->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolDestroy)
- return conn->storageDriver->poolDestroy (pool);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolDestroy) {
+ int ret;
+ ret = conn->storageDriver->poolDestroy (pool);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -4767,21 +5909,34 @@ virStoragePoolDelete(virStoragePoolPtr p
virConnectPtr conn;
DEBUG("pool=%p, flags=%u", pool, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = pool->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolDelete)
- return conn->storageDriver->poolDelete (pool, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolDelete) {
+ int ret;
+ ret = conn->storageDriver->poolDelete (pool, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -4800,12 +5955,19 @@ virStoragePoolFree(virStoragePoolPtr poo
{
DEBUG("pool=%p", pool);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
- return (-1);
- }
- if (virUnrefStoragePool(pool) < 0)
- return (-1);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (virUnrefStoragePool(pool) < 0) {
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
return(0);
}
@@ -4829,21 +5991,34 @@ virStoragePoolRefresh(virStoragePoolPtr
virConnectPtr conn;
DEBUG("pool=%p flags=%u", pool, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = pool->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStoragePoolError(pool, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->poolRefresh)
- return conn->storageDriver->poolRefresh (pool, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->poolRefresh) {
+ int ret;
+ ret = conn->storageDriver->poolRefresh (pool, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -4861,12 +6036,15 @@ virStoragePoolGetName(virStoragePoolPtr
{
DEBUG("pool=%p", pool);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
return (pool->name);
-
}
@@ -4885,19 +6063,27 @@ virStoragePoolGetUUID(virStoragePoolPtr
{
DEBUG("pool=%p, uuid=%p", pool, uuid);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (uuid == NULL) {
virLibStoragePoolError(pool, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
memcpy(uuid, &pool->uuid[0], VIR_UUID_BUFLEN);
return (0);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return -1;
}
/**
@@ -4916,21 +6102,29 @@ virStoragePoolGetUUIDString(virStoragePo
unsigned char uuid[VIR_UUID_BUFLEN];
DEBUG("pool=%p, buf=%p", pool, buf);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (buf == NULL) {
virLibStoragePoolError(pool, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
if (virStoragePoolGetUUID(pool, &uuid[0]))
- return (-1);
+ goto error;
virUUIDFormat(uuid, buf);
return (0);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return -1;
}
@@ -4951,25 +6145,37 @@ virStoragePoolGetInfo(virStoragePoolPtr
virConnectPtr conn;
DEBUG("pool=%p, info=%p", pool, info);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_POOL(pool)) {
virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (info == NULL) {
virLibStoragePoolError(pool, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
memset(info, 0, sizeof(virStoragePoolInfo));
conn = pool->conn;
- if (conn->storageDriver->poolGetInfo)
- return conn->storageDriver->poolGetInfo (pool, info);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
-
+ if (conn->storageDriver->poolGetInfo) {
+ int ret;
+ ret = conn->storageDriver->poolGetInfo (pool, info);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return -1;
}
@@ -4991,23 +6197,35 @@ virStoragePoolGetXMLDesc(virStoragePoolP
virConnectPtr conn;
DEBUG("pool=%p, flags=%u", pool, flags);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (flags != 0) {
virLibStoragePoolError(pool, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- conn = pool->conn;
-
- if (conn->storageDriver && conn->storageDriver->poolGetXMLDesc)
- return conn->storageDriver->poolGetXMLDesc (pool, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return NULL;
-
+ goto error;
+ }
+
+ conn = pool->conn;
+
+ if (conn->storageDriver && conn->storageDriver->poolGetXMLDesc) {
+ char *ret;
+ ret = conn->storageDriver->poolGetXMLDesc (pool, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
+ return NULL;
}
@@ -5028,21 +6246,34 @@ virStoragePoolGetAutostart(virStoragePoo
virConnectPtr conn;
DEBUG("pool=%p, autostart=%p", pool, autostart);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (!autostart) {
virLibStoragePoolError(pool, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- conn = pool->conn;
-
- if (conn->storageDriver && conn->storageDriver->poolGetAutostart)
- return conn->storageDriver->poolGetAutostart (pool, autostart);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ conn = pool->conn;
+
+ if (conn->storageDriver && conn->storageDriver->poolGetAutostart) {
+ int ret;
+ ret = conn->storageDriver->poolGetAutostart (pool, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -5063,17 +6294,30 @@ virStoragePoolSetAutostart(virStoragePoo
virConnectPtr conn;
DEBUG("pool=%p, autostart=%d", pool, autostart);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
- return (-1);
- }
-
- conn = pool->conn;
-
- if (conn->storageDriver && conn->storageDriver->poolSetAutostart)
- return conn->storageDriver->poolSetAutostart (pool, autostart);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibStoragePoolError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ conn = pool->conn;
+
+ if (conn->storageDriver && conn->storageDriver->poolSetAutostart) {
+ int ret;
+ ret = conn->storageDriver->poolSetAutostart (pool, autostart);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -5091,15 +6335,28 @@ virStoragePoolNumOfVolumes(virStoragePoo
{
DEBUG("pool=%p", pool);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_POOL(pool)) {
virLibConnError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
- return (-1);
- }
-
- if (pool->conn->storageDriver && pool->conn->storageDriver->poolNumOfVolumes)
- return pool->conn->storageDriver->poolNumOfVolumes (pool);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+
+ if (pool->conn->storageDriver && pool->conn->storageDriver->poolNumOfVolumes) {
+ int ret;
+ ret = pool->conn->storageDriver->poolNumOfVolumes (pool);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibConnError (pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -5122,20 +6379,33 @@ virStoragePoolListVolumes(virStoragePool
{
DEBUG("pool=%p, names=%p, maxnames=%d", pool, names, maxnames);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_POOL(pool)) {
virLibConnError(NULL, VIR_ERR_INVALID_STORAGE_POOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((names == NULL) || (maxnames < 0)) {
virLibConnError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (pool->conn->storageDriver && pool->conn->storageDriver->poolListVolumes)
- return pool->conn->storageDriver->poolListVolumes (pool, names, maxnames);
+ goto error;
+ }
+
+ if (pool->conn->storageDriver && pool->conn->storageDriver->poolListVolumes) {
+ int ret;
+ ret = pool->conn->storageDriver->poolListVolumes (pool, names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibConnError (pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return -1;
}
@@ -5159,8 +6429,12 @@ virStorageVolGetConnect (virStorageVolPt
{
DEBUG("vol=%p", vol);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL (vol)) {
virLibStoragePoolError (NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
return vol->conn;
@@ -5183,19 +6457,32 @@ virStorageVolLookupByName(virStoragePool
{
DEBUG("pool=%p, name=%s", pool, name);
- if (!VIR_IS_STORAGE_POOL(pool)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_STORAGE_POOL(pool)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (name == NULL) {
virLibConnError(pool->conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (pool->conn->storageDriver && pool->conn->storageDriver->volLookupByName)
- return pool->conn->storageDriver->volLookupByName (pool, name);
+ goto error;
+ }
+
+ if (pool->conn->storageDriver && pool->conn->storageDriver->volLookupByName) {
+ virStorageVolPtr ret;
+ ret = pool->conn->storageDriver->volLookupByName (pool, name);
+ if (!ret)
+ goto error;
+ return ret;
+ }
virLibConnError (pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return NULL;
}
@@ -5217,19 +6504,32 @@ virStorageVolLookupByKey(virConnectPtr c
{
DEBUG("conn=%p, key=%s", conn, key);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (key == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->storageDriver && conn->storageDriver->volLookupByKey)
- return conn->storageDriver->volLookupByKey (conn, key);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->volLookupByKey) {
+ virStorageVolPtr ret;
+ ret = conn->storageDriver->volLookupByKey (conn, key);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -5249,19 +6549,32 @@ virStorageVolLookupByPath(virConnectPtr
{
DEBUG("conn=%p, path=%s", conn, path);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (path == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
- }
-
- if (conn->storageDriver && conn->storageDriver->volLookupByPath)
- return conn->storageDriver->volLookupByPath (conn, path);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->volLookupByPath) {
+ virStorageVolPtr ret;
+ ret = conn->storageDriver->volLookupByPath (conn, path);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -5280,8 +6593,12 @@ virStorageVolGetName(virStorageVolPtr vo
{
DEBUG("vol=%p", vol);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
return (vol->name);
@@ -5303,8 +6620,12 @@ virStorageVolGetKey(virStorageVolPtr vol
{
DEBUG("vol=%p", vol);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
return (vol->key);
@@ -5330,20 +6651,33 @@ virStorageVolCreateXML(virStoragePoolPtr
{
DEBUG("pool=%p, flags=%u", pool, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_POOL(pool)) {
virLibConnError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (pool->conn->flags & VIR_CONNECT_RO) {
virLibConnError(pool->conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (NULL);
- }
-
- if (pool->conn->storageDriver && pool->conn->storageDriver->volCreateXML)
- return pool->conn->storageDriver->volCreateXML (pool, xmldesc, flags);
+ goto error;
+ }
+
+ if (pool->conn->storageDriver && pool->conn->storageDriver->volCreateXML) {
+ virStorageVolPtr ret;
+ ret = pool->conn->storageDriver->volCreateXML (pool, xmldesc, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
virLibConnError (pool->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(pool->conn);
return NULL;
}
@@ -5364,21 +6698,34 @@ virStorageVolDelete(virStorageVolPtr vol
virConnectPtr conn;
DEBUG("vol=%p, flags=%u", vol, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
conn = vol->conn;
if (conn->flags & VIR_CONNECT_RO) {
virLibStorageVolError(vol, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
- return (-1);
- }
-
- if (conn->storageDriver && conn->storageDriver->volDelete)
- return conn->storageDriver->volDelete (vol, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->storageDriver && conn->storageDriver->volDelete) {
+ int ret;
+ ret = conn->storageDriver->volDelete (vol, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(vol->conn);
return -1;
}
@@ -5397,12 +6744,19 @@ virStorageVolFree(virStorageVolPtr vol)
{
DEBUG("vol=%p", vol);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
- return (-1);
- }
- if (virUnrefStorageVol(vol) < 0)
- return (-1);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (virUnrefStorageVol(vol) < 0) {
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
return(0);
}
@@ -5424,23 +6778,36 @@ virStorageVolGetInfo(virStorageVolPtr vo
virConnectPtr conn;
DEBUG("vol=%p, info=%p", vol, info);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (info == NULL) {
virLibStorageVolError(vol, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
+ goto error;
}
memset(info, 0, sizeof(virStorageVolInfo));
conn = vol->conn;
- if (conn->storageDriver->volGetInfo)
- return conn->storageDriver->volGetInfo (vol, info);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->storageDriver->volGetInfo){
+ int ret;
+ ret = conn->storageDriver->volGetInfo (vol, info);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(vol->conn);
return -1;
}
@@ -5462,23 +6829,35 @@ virStorageVolGetXMLDesc(virStorageVolPtr
virConnectPtr conn;
DEBUG("vol=%p, flags=%u", vol, flags);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
if (flags != 0) {
virLibStorageVolError(vol, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (NULL);
+ goto error;
}
conn = vol->conn;
- if (conn->storageDriver && conn->storageDriver->volGetXMLDesc)
- return conn->storageDriver->volGetXMLDesc (vol, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return NULL;
-
+ if (conn->storageDriver && conn->storageDriver->volGetXMLDesc) {
+ char *ret;
+ ret = conn->storageDriver->volGetXMLDesc (vol, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(vol->conn);
+ return NULL;
}
@@ -5500,17 +6879,30 @@ virStorageVolGetPath(virStorageVolPtr vo
virConnectPtr conn;
DEBUG("vol=%p", vol);
+ virThreadResetLastError();
+
if (!VIR_IS_STORAGE_VOL(vol)) {
virLibStorageVolError(NULL, VIR_ERR_INVALID_STORAGE_VOL, __FUNCTION__);
+ /* Copy to global error object for back compatability */
+ virThreadSetGlobalError();
return (NULL);
}
conn = vol->conn;
- if (conn->storageDriver && conn->storageDriver->volGetPath)
- return conn->storageDriver->volGetPath (vol);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ if (conn->storageDriver && conn->storageDriver->volGetPath) {
+ char *ret;
+ ret = conn->storageDriver->volGetPath (vol);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(vol->conn);
return NULL;
}
@@ -5535,19 +6927,32 @@ virNodeNumOfDevices(virConnectPtr conn,
{
DEBUG("conn=%p, cap=%s, flags=%d", conn, cap, flags);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (flags != 0) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->deviceMonitor && conn->deviceMonitor->numOfDevices)
- return conn->deviceMonitor->numOfDevices (conn, cap, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->deviceMonitor && conn->deviceMonitor->numOfDevices) {
+ int ret;
+ ret = conn->deviceMonitor->numOfDevices (conn, cap, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -5576,19 +6981,32 @@ virNodeListDevices(virConnectPtr conn,
DEBUG("conn=%p, cap=%s, names=%p, maxnames=%d, flags=%d",
conn, cap, names, maxnames, flags);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if ((flags != 0) || (names == NULL) || (maxnames < 0)) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if (conn->deviceMonitor && conn->deviceMonitor->listDevices)
- return conn->deviceMonitor->listDevices (conn, cap, names, maxnames, flags);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->deviceMonitor && conn->deviceMonitor->listDevices) {
+ int ret;
+ ret = conn->deviceMonitor->listDevices (conn, cap, names, maxnames, flags);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -5606,20 +7024,33 @@ virNodeDevicePtr virNodeDeviceLookupByNa
{
DEBUG("conn=%p, name=%p", conn, name);
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
if (name == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return NULL;
- }
-
- if (conn->deviceMonitor && conn->deviceMonitor->deviceLookupByName)
- return conn->deviceMonitor->deviceLookupByName (conn, name);
-
- virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ goto error;
+ }
+
+ if (conn->deviceMonitor && conn->deviceMonitor->deviceLookupByName) {
+ virNodeDevicePtr ret;
+ ret = conn->deviceMonitor->deviceLookupByName (conn, name);
+ if (!ret)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return NULL;
}
@@ -5638,15 +7069,28 @@ char *virNodeDeviceGetXMLDesc(virNodeDev
{
DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
- return NULL;
- }
-
- if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceDumpXML)
- return dev->conn->deviceMonitor->deviceDumpXML (dev, flags);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return NULL;
+ }
+
+ if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceDumpXML) {
+ char *ret;
+ ret = dev->conn->deviceMonitor->deviceDumpXML (dev, flags);
+ if (!ret)
+ goto error;
+ return ret;
+ }
virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dev->conn);
return NULL;
}
@@ -5684,8 +7128,12 @@ const char *virNodeDeviceGetParent(virNo
{
DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return NULL;
}
@@ -5712,15 +7160,28 @@ int virNodeDeviceNumOfCaps(virNodeDevice
{
DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
- return -1;
- }
-
- if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceNumOfCaps)
- return dev->conn->deviceMonitor->deviceNumOfCaps (dev);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+
+ if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceNumOfCaps) {
+ int ret;
+ ret = dev->conn->deviceMonitor->deviceNumOfCaps (dev);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dev->conn);
return -1;
}
@@ -5741,15 +7202,28 @@ int virNodeDeviceListCaps(virNodeDeviceP
DEBUG("dev=%p, conn=%p, names=%p, maxnames=%d",
dev, dev ? dev->conn : NULL, names, maxnames);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
- return -1;
- }
-
- if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceListCaps)
- return dev->conn->deviceMonitor->deviceListCaps (dev, names, maxnames);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return -1;
+ }
+
+ if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceListCaps) {
+ int ret;
+ ret = dev->conn->deviceMonitor->deviceListCaps (dev, names, maxnames);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(dev->conn);
return -1;
}
@@ -5767,12 +7241,19 @@ int virNodeDeviceFree(virNodeDevicePtr d
{
DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
+ virThreadResetLastError();
+
if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
- return (-1);
- }
- if (virUnrefNodeDevice(dev) < 0)
- return (-1);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
+ if (virUnrefNodeDevice(dev) < 0) {
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
+ return (-1);
+ }
return(0);
}
@@ -5799,18 +7280,32 @@ virConnectDomainEventRegister(virConnect
void *opaque,
virFreeCallback freecb)
{
-
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ DEBUG("conn=%p, cb=%p, opaque=%p, freecb=%p", conn, cb, opaque, freecb);
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (cb == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
-
- if ((conn->driver) && (conn->driver->domainEventRegister))
- return conn->driver->domainEventRegister (conn, cb, opaque, freecb);
+ goto error;
+ }
+
+ if ((conn->driver) && (conn->driver->domainEventRegister)) {
+ int ret;
+ ret = conn->driver->domainEventRegister (conn, cb, opaque, freecb);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
return -1;
}
@@ -5829,19 +7324,33 @@ virConnectDomainEventDeregister(virConne
virConnectDomainEventDeregister(virConnectPtr conn,
virConnectDomainEventCallback cb)
{
-
- if (!VIR_IS_CONNECT(conn)) {
- virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ DEBUG("conn=%p, cb=%p", conn, cb);
+
+ virThreadResetLastError();
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ /* Copy to connection error object for back compatability */
+ virThreadSetGlobalError();
return (-1);
}
if (cb == NULL) {
virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
- return (-1);
- }
- if ((conn->driver) && (conn->driver->domainEventDeregister))
- return conn->driver->domainEventDeregister (conn, cb);
-
- return -1;
-}
-
-
+ goto error;
+ }
+ if ((conn->driver) && (conn->driver->domainEventDeregister)) {
+ int ret;
+ ret = conn->driver->domainEventDeregister (conn, cb);
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+error:
+ /* Copy to connection error object for back compatability */
+ virThreadSetConnError(conn);
+ return -1;
+}
+
+
diff --git a/src/libvirt_sym.version.in b/src/libvirt_sym.version.in
--- a/src/libvirt_sym.version.in
+++ b/src/libvirt_sym.version.in
@@ -249,7 +249,13 @@ LIBVIRT_0.5.0 {
} LIBVIRT_0.4.5;
-/* no new entry point in 0.5.1 */
+LIBVIRT_0.5.2 {
+ global:
+ virThreadGetLastError;
+ virThreadCopyLastError;
+ virThreadResetLastError;
+} LIBVIRT_0.5.0;
+
/* .... define new API here using predicted next version number .... */
diff --git a/src/virterror.c b/src/virterror.c
--- a/src/virterror.c
+++ b/src/virterror.c
@@ -17,11 +17,14 @@
#include "virterror_internal.h"
#include "datatypes.h"
+#include "memory.h"
-virError virLastErr = /* the last error */
+static virError virLastErr = /* the last error */
{ .code = 0, .domain = 0, .message = NULL, .level = VIR_ERR_NONE,
.conn = NULL, .dom = NULL, .str1 = NULL, .str2 = NULL, .str3 = NULL,
.int1 = 0, .int2 = 0, .net = NULL };
+static PTHREAD_MUTEX_T(virLastErrLock);
+
virErrorFunc virErrorHandler = NULL; /* global error handler */
void *virUserData = NULL; /* associated data */
@@ -62,12 +65,49 @@ void *virUserData = NULL; /* asso
}} \
}
-/*
+static int
+virCopyError(virErrorPtr from,
+ virErrorPtr to)
+{
+ int ret = 0;
+ if (!to)
+ return 0;
+ virResetError(to);
+ if (!from)
+ return 0;
+ to->code = from->code;
+ to->domain = from->domain;
+ to->level = from->level;
+ if (from->message && !(to->message = strdup(from->message)))
+ ret = -1;
+ if (from->str1 && !(to->str1 = strdup(from->str1)))
+ ret = -1;
+ if (from->str2 && !(to->str2 = strdup(from->str2)))
+ ret = -1;
+ if (from->str3 && !(to->str3 = strdup(from->str3)))
+ ret = -1;
+ to->int1 = from->int1;
+ to->int2 = from->int2;
+ /*
+ * Delibrately not setting 'conn', 'dom', 'net' references
+ */
+ return ret;
+}
+
+
+
+/**
* virGetLastError:
*
* Provide a pointer to the last error caught at the library level
- * Simpler but may not be suitable for multithreaded accesses, in which
- * case use virCopyLastError()
+ *
+ * This function is not safe for use in a multi-threaded
+ * application. Use virThreadGetLastError() instead.
+ *
+ * This function is also not very suitable for single-threaded
+ * applications because for any API call, it is impossible
+ * to determine whether an error was set globally or on the
+ * connection. Always use virThreadGetLastError()
*
* Returns a pointer to the last error or NULL if none occurred.
*/
@@ -79,11 +119,20 @@ virGetLastError(void)
return (&virLastErr);
}
-/*
+/**
* virCopyLastError:
* @to: target to receive the copy
*
* Copy the content of the last error caught at the library level
+ *
+ * This function is not safe for use in a multi-threaded
+ * application. Use virThreadCopyLastError() instead.
+ *
+ * This function is also not very suitable for single-threaded
+ * applications because for any API call, it is impossible
+ * to determine whether an error was set globally or on the
+ * connection. Always use virThreadCopyLastError()
+ *
* One will need to free the result with virResetError()
*
* Returns 0 if no error was found and the error code otherwise and -1 in case
@@ -92,12 +141,8 @@ int
int
virCopyLastError(virErrorPtr to)
{
- if (to == NULL)
- return (-1);
- if (virLastErr.code == VIR_ERR_OK)
- return (0);
- memcpy(to, &virLastErr, sizeof(virError));
- return (virLastErr.code);
+ virCopyError(&virLastErr, to);
+ return to->code;
}
/**
@@ -118,10 +163,19 @@ virResetError(virErrorPtr err)
memset(err, 0, sizeof(virError));
}
+
/**
* virResetLastError:
*
* Reset the last error caught at the library level.
+ *
+ * This function is not safe for use in a multi-threaded
+ * application. Use virThreadResetLastError() instead.
+ *
+ * This function is also not very suitable for single-threaded
+ * applications because for any API call, it is impossible
+ * to determine whether an error was set globally or on the
+ * connection. Always use virThreadResetLastError()
*/
void
virResetLastError(void)
@@ -134,8 +188,14 @@ virResetLastError(void)
* @conn: pointer to the hypervisor connection
*
* Provide a pointer to the last error caught on that connection
- * Simpler but may not be suitable for multithreaded accesses, in which
- * case use virConnCopyLastError()
+ *
+ * This function is not safe for use in a multi-threaded
+ * application. Use virThreadGetLastError() instead.
+ *
+ * This function is also not very suitable for single-threaded
+ * applications because for any API call, it is impossible
+ * to determine whether an error was set globally or on the
+ * connection. Always use virThreadGetLastError()
*
* Returns a pointer to the last error or NULL if none occurred.
*/
@@ -153,6 +213,15 @@ virConnGetLastError(virConnectPtr conn)
* @to: target to receive the copy
*
* Copy the content of the last error caught on that connection
+ *
+ * This function is not safe for use in a multi-threaded
+ * application. Use virThreadCopyLastError() instead.
+ *
+ * This function is also not very suitable for single-threaded
+ * applications because for any API call, it is impossible
+ * to determine whether an error was set globally or on the
+ * connection. Always use virThreadCopyLastError()
+ *
* One will need to free the result with virResetError()
*
* Returns 0 if no error was found and the error code otherwise and -1 in case
@@ -163,17 +232,21 @@ virConnCopyLastError(virConnectPtr conn,
{
if (conn == NULL)
return (-1);
- if (to == NULL)
- return (-1);
- if (conn->err.code == VIR_ERR_OK)
- return (0);
- memcpy(to, &conn->err, sizeof(virError));
- return (conn->err.code);
+ virCopyError(&conn->err, to);
+ return to->code;
}
/**
* virConnResetLastError:
* @conn: pointer to the hypervisor connection
+ *
+ * This function is not safe for use in a multi-threaded
+ * application. Use virThreadResetLastError() instead.
+ *
+ * This function is also not very suitable for single-threaded
+ * applications because for any API call, it is impossible
+ * to determine whether an error was set globally or on the
+ * connection. Always use virThreadResetLastError()
*
* Reset the last error caught on that connection
*/
@@ -217,8 +290,10 @@ virConnSetErrorFunc(virConnectPtr conn,
{
if (conn == NULL)
return;
+ pthread_mutex_lock(&conn->lock);
conn->handler = handler;
conn->userData = userData;
+ pthread_mutex_unlock(&conn->lock);
}
/**
@@ -338,6 +413,146 @@ virDefaultErrorFunc(virErrorPtr err)
dom, lvl, domain, network, err->message);
}
+
+pthread_once_t virErrorKeyInit = PTHREAD_ONCE_INIT;
+pthread_key_t virErrorKey;
+
+static void
+virErrorKeyFreeData(void *data)
+{
+ virErrorPtr err = data;
+ virResetError(err);
+ VIR_FREE(err);
+}
+
+static void
+virErrorKeyCreate(void)
+{
+ pthread_key_create(&virErrorKey, virErrorKeyFreeData);
+}
+
+
+static void
+virErrorGenericFailure(virErrorPtr err)
+{
+ err->code = VIR_ERR_INTERNAL_ERROR;
+ err->domain = VIR_FROM_NONE;
+ err->level = VIR_ERR_ERROR;
+ err->message = strdup(_("Unknown failure"));
+}
+
+/**
+ * virThreadGetLastError:
+ *
+ * Provide a pointer to the last error caught during an API
+ * call in this thread.
+ *
+ * The contents of the returned error object are only valid
+ * until the next API call is made, or until the thread exits
+ *
+ * Returns a pointer to the last error or NULL if none occurred.
+ */
+virErrorPtr
+virThreadGetLastError(void)
+{
+ virErrorPtr err;
+ pthread_once(&virErrorKeyInit, virErrorKeyCreate);
+ err = pthread_getspecific(virErrorKey);
+ if (!err) {
+ if (VIR_ALLOC(err) < 0)
+ return NULL;
+ pthread_setspecific(virErrorKey, err);
+ }
+ return err;
+}
+
+
+/**
+ * virThreadCopyLastError:
+ * @to: target to receive the copy
+ *
+ * Copy the content of the last error caught during an API
+ * call in this thread.
+ *
+ * One will need to free the result with virResetError()
+ *
+ * Returns 0 if no error was found and the error code otherwise and -1 in case
+ * of parameter error.
+ */
+int
+virThreadCopyLastError (virErrorPtr to)
+{
+ virErrorPtr err;
+
+ err = virThreadGetLastError();
+ if (virCopyError(err, to) < 0)
+ return -1;
+
+ return to->code;
+}
+
+
+/**
+ * virThreadResetLastError:
+ *
+ * Reset the last error caught during an API call
+ * in this thread
+ */
+void
+virThreadResetLastError (void)
+{
+ virErrorPtr err;
+
+ err = virThreadGetLastError();
+ if (err)
+ virResetError(err);
+}
+
+
+/**
+ * virThreadSetConnError:
+ *
+ * Initialize the global error with the contents of the
+ * the thread local error
+ */
+void
+virThreadSetGlobalError(void)
+{
+ virErrorPtr err;
+
+ err = virThreadGetLastError();
+
+ if (err && err->code == VIR_ERR_OK)
+ virErrorGenericFailure(err);
+
+ pthread_mutex_lock(&virLastErrLock);
+ virCopyError(err, &virLastErr);
+ pthread_mutex_unlock(&virLastErrLock);
+}
+
+/**
+ * virThreadSetConnError:
+ *
+ * Initialize the connection error with the contents of the
+ * the thread local error
+ */
+void
+virThreadSetConnError(virConnectPtr conn)
+{
+ virErrorPtr err;
+
+ err = virThreadGetLastError();
+
+ if (err && err->code == VIR_ERR_OK)
+ virErrorGenericFailure(err);
+
+ pthread_mutex_lock(&conn->lock);
+ virCopyError(err, &conn->err);
+ pthread_mutex_unlock(&conn->lock);
+}
+
+
+
/**
* virRaiseError:
* @conn: the connection to the hypervisor if available
@@ -358,15 +573,29 @@ virDefaultErrorFunc(virErrorPtr err)
* immediately if a callback is found and store it for later handling.
*/
void
-virRaiseError(virConnectPtr conn, virDomainPtr dom, virNetworkPtr net,
+virRaiseError(virConnectPtr conn,
+ virDomainPtr dom ATTRIBUTE_UNUSED,
+ virNetworkPtr net ATTRIBUTE_UNUSED,
int domain, int code, virErrorLevel level,
const char *str1, const char *str2, const char *str3,
int int1, int int2, const char *msg, ...)
{
- virErrorPtr to = &virLastErr;
+ virErrorPtr to;
void *userData = virUserData;
virErrorFunc handler = virErrorHandler;
char *str;
+
+ /*
+ * All errors are recorded in thread local storage
+ * For compatability, public API calls will copy them
+ * to the global or per-connection error object when
+ * neccessary
+ */
+ to = virThreadGetLastError();
+ if (!to)
+ return; /* Hit OOM allocating thread error object, sod all we can do now */
+
+ virResetError(to);
if (code == VIR_ERR_OK)
return;
@@ -375,11 +604,12 @@ virRaiseError(virConnectPtr conn, virDom
* try to find the best place to save and report the error
*/
if (conn != NULL) {
- to = &conn->err;
+ pthread_mutex_lock(&conn->lock);
if (conn->handler != NULL) {
handler = conn->handler;
userData = conn->userData;
}
+ pthread_mutex_unlock(&conn->lock);
}
/*
@@ -395,9 +625,10 @@ virRaiseError(virConnectPtr conn, virDom
* Save the information about the error
*/
virResetError(to);
- to->conn = conn;
- to->dom = dom;
- to->net = net;
+ /*
+ * Delibrately not setting conn, dom & net fields since
+ * they're utterly unsafe
+ */
to->domain = domain;
to->code = code;
to->message = str;
diff --git a/src/virterror_internal.h b/src/virterror_internal.h
--- a/src/virterror_internal.h
+++ b/src/virterror_internal.h
@@ -24,7 +24,6 @@
#include "internal.h"
-extern virError virLastErr;
extern virErrorFunc virErrorHandler;
extern void *virUserData;
@@ -53,4 +52,7 @@ void virReportErrorHelper(virConnectPtr
ATTRIBUTE_FORMAT(printf, 7, 8);
+void virThreadSetGlobalError(void);
+void virThreadSetConnError(virConnectPtr conn);
+
#endif
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
15 years, 10 months
[libvirt] 3 small patches
by Jim Meyering
1: cvs-ignore a stray, generated file
2: bootstrap: pull in gnulib's ioctl module (Daniel Berrange will
use it shortly)
3: add more files pulled in via yesterday's gnulib upgrade
The third is highest priority, since without it, running
autogen.sh from just-checked-out sources fails due to 3 missing
.m4 files. This isn't the first time that's happened. I tracked
the problem to the way gnulib-tool updates .cvsignore files to
mark pulled-in files as ignored, by default. That made it
hard to use vc tools like cvs or git to identify new files.
The 2nd patch adds gnulib-tools' --no-vc-files option to inhibit
that behavior.
>From 4b63b91ff4b8308cfde641686ea22ff51499bb00 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Wed, 7 Jan 2009 15:43:41 +0100
Subject: [PATCH 1/3] ignore generated libvirtd.logrotate.
* qemud/.cvsignore: Add libvirtd.logrotate.
* qemud/.gitignore: Regenerate.
---
qemud/.cvsignore | 13 +++++++------
qemud/.gitignore | 13 +++++++------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/qemud/.cvsignore b/qemud/.cvsignore
index 04fed54..38cf28d 100644
--- a/qemud/.cvsignore
+++ b/qemud/.cvsignore
@@ -1,11 +1,12 @@
-Makefile
-Makefile.in
+*.gcda
+*.gcno
+*.la
+*.lo
.deps
.libs
-*.lo
-*.la
+Makefile
+Makefile.in
libvirt_qemud
libvirtd
libvirtd.init
-*.gcno
-*.gcda
+libvirtd.logrotate
diff --git a/qemud/.gitignore b/qemud/.gitignore
index 04fed54..38cf28d 100644
--- a/qemud/.gitignore
+++ b/qemud/.gitignore
@@ -1,11 +1,12 @@
-Makefile
-Makefile.in
+*.gcda
+*.gcno
+*.la
+*.lo
.deps
.libs
-*.lo
-*.la
+Makefile
+Makefile.in
libvirt_qemud
libvirtd
libvirtd.init
-*.gcno
-*.gcda
+libvirtd.logrotate
--
1.6.1.121.g866a4a
>From 8d6654775a277eca6bf52b011671920091cde9a4 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Wed, 7 Jan 2009 16:11:02 +0100
Subject: [PATCH 2/3] bootstrap: pull in gnulib's ioctl module
* bootstrap: Invoke gnulib-tool with its --no-vc-files
option, since we version-control the files it imports.
This tells it not to mark imported files as cvs-ignored.
(modules): Add ioctl.
* gnulib/lib/ioctl.c: New file.
* gnulib/lib/sys_ioctl.in.h: New file.
* gnulib/tests/sys_ioctl.in.h: Removed.
* gnulib/tests/ioctl.c: Removed.
* gnulib/lib/Makefile.am: Update.
* gnulib/m4/gnulib-cache.m4: Likewise.
* gnulib/m4/gnulib-comp.m4: Likewise.
* gnulib/tests/Makefile.am: Likewise.
* gnulib/lib/.cvsignore: Ignore sys_ioctl.h.
* gnulib/lib/.gitignore: Regenerate.
---
bootstrap | 2 +
gnulib/lib/.cvsignore | 1 +
gnulib/lib/.gitignore | 1 +
gnulib/lib/Makefile.am | 38 +++++++++++++++++++++++++++++++++-
gnulib/{tests => lib}/ioctl.c | 8 +++---
gnulib/{tests => lib}/sys_ioctl.in.h | 8 +++---
gnulib/m4/gnulib-cache.m4 | 4 ++-
gnulib/m4/gnulib-comp.m4 | 22 +++++++++---------
gnulib/tests/Makefile.am | 36 --------------------------------
9 files changed, 63 insertions(+), 57 deletions(-)
rename gnulib/{tests => lib}/ioctl.c (78%)
rename gnulib/{tests => lib}/sys_ioctl.in.h (85%)
diff --git a/bootstrap b/bootstrap
index c5487b2..38dd3ae 100755
--- a/bootstrap
+++ b/bootstrap
@@ -73,6 +73,7 @@ gethostname
getpass
gettext
inet_pton
+ioctl
mkstemp
mktempd
perror
@@ -100,6 +101,7 @@ vc-list-files
# put *.[ch] files in new gnulib/lib/ dir.
$gnulib_tool \
+ --no-vc-files \
--lgpl=2 \
--with-tests \
--m4-base=gnulib/m4 \
diff --git a/gnulib/lib/.cvsignore b/gnulib/lib/.cvsignore
index 5a82aa0..9d6b35f 100644
--- a/gnulib/lib/.cvsignore
+++ b/gnulib/lib/.cvsignore
@@ -16,6 +16,7 @@ stdint.h
stdio.h
stdlib.h
string.h
+sys_ioctl.h
sys_select.h
sys_socket.h
sys_stat.h
diff --git a/gnulib/lib/.gitignore b/gnulib/lib/.gitignore
index 5a82aa0..9d6b35f 100644
--- a/gnulib/lib/.gitignore
+++ b/gnulib/lib/.gitignore
@@ -16,6 +16,7 @@ stdint.h
stdio.h
stdlib.h
string.h
+sys_ioctl.h
sys_select.h
sys_socket.h
sys_stat.h
diff --git a/gnulib/lib/Makefile.am b/gnulib/lib/Makefile.am
index 528142e..746881c 100644
--- a/gnulib/lib/Makefile.am
+++ b/gnulib/lib/Makefile.am
@@ -9,7 +9,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gnulib/lib --m4-base=gnulib/m4 --doc-base=doc --tests-base=gnulib/tests --aux-dir=build-aux --with-tests --lgpl=2 --libtool --macro-prefix=gl c-ctype close connect getaddrinfo gethostname getpass gettext inet_pton mkstemp mktempd perror physmem poll posix-shell recv send setsockopt socket strerror strndup strsep sys_stat time_r useless-if-before-free vasprintf vc-list-files verify
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gnulib/lib --m4-base=gnulib/m4 --doc-base=doc --tests-base=gnulib/tests --aux-dir=build-aux --with-tests --lgpl=2 --libtool --macro-prefix=gl --no-vc-files c-ctype close connect getaddrinfo gethostname getpass gettext inet_pton ioctl mkstemp mktempd perror physmem poll posix-shell recv send setsockopt socket strerror strndup strsep sys_stat time_r useless-if-before-free vasprintf vc-list-files verify
AUTOMAKE_OPTIONS = 1.5 gnits
@@ -291,6 +291,15 @@ EXTRA_DIST += intprops.h
## end gnulib module intprops
+## begin gnulib module ioctl
+
+
+EXTRA_DIST += ioctl.c w32sock.h
+
+EXTRA_libgnu_la_SOURCES += ioctl.c
+
+## end gnulib module ioctl
+
## begin gnulib module link-warning
LINK_WARNING_H=$(top_srcdir)/build-aux/link-warning.h
@@ -831,6 +840,33 @@ EXTRA_libgnu_la_SOURCES += strsep.c
## end gnulib module strsep
+## begin gnulib module sys_ioctl
+
+BUILT_SOURCES += $(SYS_IOCTL_H)
+
+# We need the following in order to create <sys/ioctl.h> when the system
+# does not have a complete one.
+sys/ioctl.h: sys_ioctl.in.h
+ @MKDIR_P@ sys
+ rm -f $@-t $@
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
+ -e 's|@''GNULIB_IOCTL''@|$(GNULIB_IOCTL)|g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
+ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
+ < $(srcdir)/sys_ioctl.in.h; \
+ } > $@-t
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/ioctl.h sys/ioctl.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_ioctl.in.h
+
+## end gnulib module sys_ioctl
+
## begin gnulib module sys_select
BUILT_SOURCES += $(SYS_SELECT_H)
diff --git a/gnulib/tests/ioctl.c b/gnulib/lib/ioctl.c
similarity index 78%
rename from gnulib/tests/ioctl.c
rename to gnulib/lib/ioctl.c
index a23d363..77e0101 100644
--- a/gnulib/tests/ioctl.c
+++ b/gnulib/lib/ioctl.c
@@ -3,16 +3,16 @@
Copyright (C) 2008 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ GNU Lesser General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paolo Bonzini */
diff --git a/gnulib/tests/sys_ioctl.in.h b/gnulib/lib/sys_ioctl.in.h
similarity index 85%
rename from gnulib/tests/sys_ioctl.in.h
rename to gnulib/lib/sys_ioctl.in.h
index 65c2c4a..6ce02d4 100644
--- a/gnulib/tests/sys_ioctl.in.h
+++ b/gnulib/lib/sys_ioctl.in.h
@@ -2,16 +2,16 @@
Copyright (C) 2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ GNU Lesser General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
diff --git a/gnulib/m4/gnulib-cache.m4 b/gnulib/m4/gnulib-cache.m4
index 9eb6064..77a285f 100644
--- a/gnulib/m4/gnulib-cache.m4
+++ b/gnulib/m4/gnulib-cache.m4
@@ -15,7 +15,7 @@
# Specification in the form of a command-line invocation:
-# gnulib-tool --import --dir=. --lib=libgnu --source-base=gnulib/lib --m4-base=gnulib/m4 --doc-base=doc --tests-base=gnulib/tests --aux-dir=build-aux --with-tests --lgpl=2 --libtool --macro-prefix=gl c-ctype close connect getaddrinfo gethostname getpass gettext inet_pton mkstemp mktempd perror physmem poll posix-shell recv send setsockopt socket strerror strndup strsep sys_stat time_r useless-if-before-free vasprintf vc-list-files verify
+# gnulib-tool --import --dir=. --lib=libgnu --source-base=gnulib/lib --m4-base=gnulib/m4 --doc-base=doc --tests-base=gnulib/tests --aux-dir=build-aux --with-tests --lgpl=2 --libtool --macro-prefix=gl --no-vc-files c-ctype close connect getaddrinfo gethostname getpass gettext inet_pton ioctl mkstemp mktempd perror physmem poll posix-shell recv send setsockopt socket strerror strndup strsep sys_stat time_r useless-if-before-free vasprintf vc-list-files verify
# Specification in the form of a few gnulib-tool.m4 macro invocations:
gl_LOCAL_DIR([])
@@ -28,6 +28,7 @@ gl_MODULES([
getpass
gettext
inet_pton
+ ioctl
mkstemp
mktempd
perror
@@ -61,3 +62,4 @@ gl_MAKEFILE_NAME([])
gl_LIBTOOL
gl_MACRO_PREFIX([gl])
gl_PO_DOMAIN([])
+gl_VC_FILES([false])
diff --git a/gnulib/m4/gnulib-comp.m4 b/gnulib/m4/gnulib-comp.m4
index 072b9f0..1393b97 100644
--- a/gnulib/m4/gnulib-comp.m4
+++ b/gnulib/m4/gnulib-comp.m4
@@ -82,6 +82,13 @@ AC_SUBST([LTALLOCA])
gl_ARPA_INET_MODULE_INDICATOR([inet_ntop])
gl_INET_PTON
gl_ARPA_INET_MODULE_INDICATOR([inet_pton])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([ioctl])
+ gl_REPLACE_SYS_IOCTL_H
+ fi
+ gl_SYS_IOCTL_MODULE_INDICATOR([ioctl])
+ gl_MODULE_INDICATOR([ioctl])
gl_FUNC_LSEEK
gl_UNISTD_MODULE_INDICATOR([lseek])
gl_FUNC_LSTAT
@@ -141,6 +148,8 @@ AC_SUBST([LTALLOCA])
gl_STRING_MODULE_INDICATOR([strnlen])
gl_FUNC_STRSEP
gl_STRING_MODULE_INDICATOR([strsep])
+ gl_SYS_IOCTL_H
+ AC_PROG_MKDIR_P
gl_HEADER_SYS_SELECT
AC_PROG_MKDIR_P
gl_HEADER_SYS_SOCKET
@@ -213,13 +222,6 @@ AC_SUBST([LTALLOCA])
gl_SYS_SOCKET_MODULE_INDICATOR([bind])
AC_REQUIRE([gl_HEADER_SYS_SOCKET])
if test "$ac_cv_header_winsock2_h" = yes; then
- AC_LIBOBJ([ioctl])
- gl_REPLACE_SYS_IOCTL_H
- fi
- gl_SYS_IOCTL_MODULE_INDICATOR([ioctl])
- gl_MODULE_INDICATOR([ioctl])
- AC_REQUIRE([gl_HEADER_SYS_SOCKET])
- if test "$ac_cv_header_winsock2_h" = yes; then
AC_LIBOBJ([listen])
fi
gl_SYS_SOCKET_MODULE_INDICATOR([listen])
@@ -227,8 +229,6 @@ AC_SUBST([LTALLOCA])
gl_SOCKETS
gt_TYPE_WCHAR_T
gt_TYPE_WINT_T
- gl_SYS_IOCTL_H
- AC_PROG_MKDIR_P
AC_CHECK_FUNCS([shutdown])
abs_aux_dir=`cd "$ac_aux_dir"; pwd`
AC_SUBST([abs_aux_dir])
@@ -354,6 +354,7 @@ AC_DEFUN([gl_FILE_LIST], [
lib/inet_ntop.c
lib/inet_pton.c
lib/intprops.h
+ lib/ioctl.c
lib/lseek.c
lib/lstat.c
lib/malloc.c
@@ -388,6 +389,7 @@ AC_DEFUN([gl_FILE_LIST], [
lib/strndup.c
lib/strnlen.c
lib/strsep.c
+ lib/sys_ioctl.in.h
lib/sys_select.in.h
lib/sys_socket.in.h
lib/sys_stat.in.h
@@ -535,10 +537,8 @@ AC_DEFUN([gl_FILE_LIST], [
tests/test-wchar.c
tests=lib/accept.c
tests=lib/bind.c
- tests=lib/ioctl.c
tests=lib/listen.c
tests=lib/sockets.c
tests=lib/sockets.h
- tests=lib/sys_ioctl.in.h
tests=lib/w32sock.h
])
diff --git a/gnulib/tests/Makefile.am b/gnulib/tests/Makefile.am
index 4273d6c..ea40a21 100644
--- a/gnulib/tests/Makefile.am
+++ b/gnulib/tests/Makefile.am
@@ -150,15 +150,6 @@ EXTRA_DIST += test-gettimeofday.c
## end gnulib module gettimeofday-tests
-## begin gnulib module ioctl
-
-
-EXTRA_DIST += ioctl.c w32sock.h
-
-EXTRA_libtests_a_SOURCES += ioctl.c
-
-## end gnulib module ioctl
-
## begin gnulib module listen
@@ -298,33 +289,6 @@ EXTRA_DIST += test-string.c
## end gnulib module string-tests
-## begin gnulib module sys_ioctl
-
-BUILT_SOURCES += $(SYS_IOCTL_H)
-
-# We need the following in order to create <sys/ioctl.h> when the system
-# does not have a complete one.
-sys/ioctl.h: sys_ioctl.in.h
- @MKDIR_P@ sys
- rm -f $@-t $@
- { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
- sed -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
- -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
- -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
- -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
- -e 's|@''GNULIB_IOCTL''@|$(GNULIB_IOCTL)|g' \
- -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
- -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
- < $(srcdir)/sys_ioctl.in.h; \
- } > $@-t
- mv $@-t $@
-MOSTLYCLEANFILES += sys/ioctl.h sys/ioctl.h-t
-MOSTLYCLEANDIRS += sys
-
-EXTRA_DIST += sys_ioctl.in.h
-
-## end gnulib module sys_ioctl
-
## begin gnulib module sys_select-tests
TESTS += test-sys_select
--
1.6.1.121.g866a4a
>From ca8eae50325df82b8f44d75bb80c3812d07fc30c Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Wed, 7 Jan 2009 16:13:08 +0100
Subject: [PATCH 3/3] add more files pulled in via yesterday's gnulib upgrade
* gnulib/m4/multiarch.m4: New file.
* gnulib/m4/hostent.m4: New file.
* gnulib/m4/servent.m4: New file.
* .x-sc_prohibit_gethostby: Exempt all gnulib/m4/* files, so
hostent.m4's uses of gethostbyname and gethostbyaddr does not
trigger a "make syntax-check" failure.
---
.x-sc_prohibit_gethostby | 2 +-
gnulib/m4/hostent.m4 | 45 ++++++++++++++++++++++++++++
gnulib/m4/multiarch.m4 | 74 ++++++++++++++++++++++++++++++++++++++++++++++
gnulib/m4/servent.m4 | 47 +++++++++++++++++++++++++++++
4 files changed, 167 insertions(+), 1 deletions(-)
create mode 100644 gnulib/m4/hostent.m4
create mode 100644 gnulib/m4/multiarch.m4
create mode 100644 gnulib/m4/servent.m4
diff --git a/.x-sc_prohibit_gethostby b/.x-sc_prohibit_gethostby
index d74ea40..c771142 100644
--- a/.x-sc_prohibit_gethostby
+++ b/.x-sc_prohibit_gethostby
@@ -1,3 +1,3 @@
gnulib/lib/getaddrinfo.c
-gnulib/m4/getaddrinfo.m4
+gnulib/m4/
src/xend_internal.c
diff --git a/gnulib/m4/hostent.m4 b/gnulib/m4/hostent.m4
new file mode 100644
index 0000000..4a96af7
--- /dev/null
+++ b/gnulib/m4/hostent.m4
@@ -0,0 +1,45 @@
+# hostent.m4 serial 1
+dnl Copyright (C) 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_HOSTENT],
+[
+ dnl Where are gethostent(), sethostent(), endhostent(), gethostbyname(),
+ dnl gethostbyaddr() defined?
+ dnl - On Solaris, they are in libnsl. Ignore libxnet.
+ dnl - On Haiku, they are in libnetwork.
+ dnl - On BeOS, they are in libnet.
+ dnl - On native Windows, they are in ws2_32.dll.
+ dnl - Otherwise they are in libc.
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ HOSTENT_LIB=
+ gl_saved_libs="$LIBS"
+ AC_SEARCH_LIBS([gethostbyname], [nsl network net],
+ [if test "$ac_cv_search_gethostbyname" != "none required"; then
+ HOSTENT_LIB="$ac_cv_search_gethostbyname"
+ fi])
+ LIBS="$gl_saved_libs"
+ if test -z "$HOSTENT_LIB"; then
+ AC_CHECK_FUNCS([gethostbyname], , [
+ AC_CACHE_CHECK([for gethostbyname in winsock2.h and -lws2_32],
+ [gl_cv_w32_gethostbyname],
+ [gl_cv_w32_gethostbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_TRY_LINK([
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+], [gethostbyname(NULL);], [gl_cv_w32_gethostbyname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_gethostbyname" = "yes"; then
+ HOSTENT_LIB="-lws2_32"
+ fi
+ ])
+ fi
+ AC_SUBST([HOSTENT_LIB])
+])
diff --git a/gnulib/m4/multiarch.m4 b/gnulib/m4/multiarch.m4
new file mode 100644
index 0000000..7b73e15
--- /dev/null
+++ b/gnulib/m4/multiarch.m4
@@ -0,0 +1,74 @@
+# multiarch.m4 serial 3
+dnl Copyright (C) 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine whether the compiler is or may be producing universal binaries.
+#
+# On MacOS X 10.5 and later systems, the user can create libraries and
+# executables that work on multiple system types--known as "fat" or
+# "universal" binaries--by specifying multiple '-arch' options to the
+# compiler but only a single '-arch' option to the preprocessor. Like
+# this:
+#
+# ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CPP="gcc -E" CXXCPP="g++ -E"
+#
+# Detect this situation and set the macro AA_APPLE_UNIVERSAL_BUILD at the
+# beginning of config.h and set APPLE_UNIVERSAL_BUILD accordingly.
+
+AC_DEFUN([gl_MULTIARCH],
+[
+ dnl This AC_REQUIRE is not necessary in theory. It works around a bug in
+ dnl autoconf <= 2.63: AC_REQUIRE invocations inside AC_REQUIREd macros are
+ dnl being handled better than AC_REQUIRE invocations inside normally invoked
+ dnl macros.
+ AC_REQUIRE([gl_MULTIARCH_BODY])
+])
+
+AC_DEFUN([gl_MULTIARCH_BODY],
+[
+ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
+ gl_cv_c_multiarch=no
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+ ]])],
+ [
+ dnl Check for potential -arch flags. It is not universal unless
+ dnl there are at least two -arch flags with different values.
+ arch=
+ prev=
+ for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+ if test -n "$prev"; then
+ case $word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$arch" || test "$arch" = "$word"; then
+ arch="$word"
+ else
+ gl_cv_c_multiarch=yes
+ fi
+ ;;
+ esac
+ prev=
+ else
+ if test "x$word" = "x-arch"; then
+ prev=arch
+ fi
+ fi
+ done
+ ])
+ if test $gl_cv_c_multiarch = yes; then
+ AC_DEFINE([AA_APPLE_UNIVERSAL_BUILD], [1],
+ [Define if the compiler is building for multiple architectures of Apple platforms at once.])
+ APPLE_UNIVERSAL_BUILD=1
+ else
+ APPLE_UNIVERSAL_BUILD=0
+ fi
+ AC_SUBST([APPLE_UNIVERSAL_BUILD])
+])
diff --git a/gnulib/m4/servent.m4 b/gnulib/m4/servent.m4
new file mode 100644
index 0000000..242f9e3
--- /dev/null
+++ b/gnulib/m4/servent.m4
@@ -0,0 +1,47 @@
+# servent.m4 serial 1
+dnl Copyright (C) 2008 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_SERVENT],
+[
+ dnl Where are getservent(), setservent(), endservent(), getservbyname(),
+ dnl getservbyport() defined?
+ dnl Where are getprotoent(), setprotoent(), endprotoent(), getprotobyname(),
+ dnl getprotobynumber() defined?
+ dnl - On Solaris, they are in libsocket. Ignore libxnet.
+ dnl - On Haiku, they are in libnetwork.
+ dnl - On BeOS, they are in libnet.
+ dnl - On native Windows, they are in ws2_32.dll.
+ dnl - Otherwise they are in libc.
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ SERVENT_LIB=
+ gl_saved_libs="$LIBS"
+ AC_SEARCH_LIBS([getservbyname], [socket network net],
+ [if test "$ac_cv_search_getservbyname" != "none required"; then
+ SERVENT_LIB="$ac_cv_search_getservbyname"
+ fi])
+ LIBS="$gl_saved_libs"
+ if test -z "$SERVENT_LIB"; then
+ AC_CHECK_FUNCS([getservbyname], , [
+ AC_CACHE_CHECK([for getservbyname in winsock2.h and -lws2_32],
+ [gl_cv_w32_getservbyname],
+ [gl_cv_w32_getservbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_TRY_LINK([
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+], [getservbyname(NULL,NULL);], [gl_cv_w32_getservbyname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_getservbyname" = "yes"; then
+ SERVENT_LIB="-lws2_32"
+ fi
+ ])
+ fi
+ AC_SUBST([SERVENT_LIB])
+])
--
1.6.1.121.g866a4a
15 years, 10 months
[libvirt] patch for pci passthrough
by Jason Krieg
Hi,
This patch adds support for the -pcidevice host=bus:dev.func
added in kvm-79
I used the structure as already defined in src/domain_conf.h
so analog to usb one now can add pci devices
as example:
lspci: 06:02.0 Network controller: Eicon Networks Corporation Diva
Server 2FX (rev 01)
<hostdev mode='subsystem' type='pci'>
<source>
<address bus="0x06" slot="0x02" function="0x0"/>
</source>
</hostdev>
values are hex so for bus: 0 to ff, slot: 0 to 1f and function: 0 to 7
Hope this patch is useful it applies to libvirt-0.5.1 and cvs checkout
from today (with some hunks)
Regards Jason
--
Collax GmbH . Burkheimer Str. 3 . 79111 Freiburg . Germany
p: +49 (0) 89-990157-0
f: +49 (0) 89-990157-11 . http://www.collax.com
15 years, 10 months
[libvirt] OpenVZ: Still the same macs for host and domain veth devices.
by Ivan Vovk
Hi, guys.
During domain creation from xml like this:
<domain type="openvz" id="3005">
<name>3005</name>
<memory>131072</memory>
<currentMemory>131072</currentMemory>
<vcpu>1</vcpu>
<os>
<type>exe</type>
</os>
<devices>
<filesystem type="template">
<source name="altlinux-4.0"/>
<target dir="/"/>
</filesystem>
<interface type="bridge">
<source bridge="vzrb0"/>
<target dev="veth3005.0"/>
</interface>
</devices>
i get veth3005.0 on a HW node connected to virtual bridge vzbr0 and eth0 inside a container. So that annoying bug with confused <source> and <target> tags seems to be fixed. Thanks for that!
But mac generation still seems to be an issue, caz mac of eth0 and veth3005.0 are the same:
[root@alt-03 ~]# cat /etc/vz/conf/3005.conf | grep NETIF
NETIF="ifname=eth0,bridge=vzbr0,mac=52:54:00:97:72:8E,host_ifname=veth3005.0,host_mac=52:54:00:97:72:8E"
So when i connect two containers via bridge they cannot "talk" to each other due to macs conflict. Can something be done to improve mac generation behaviour?
Version I use at the moment:
[root@alt-03 ~]# rpm -qa | grep libvirt
libvirt-python-0.5.0-alt1
libvirt-0.5.0-alt1
libvirt-devel-0.5.0-alt1
And one more not an OpenVZ-specific question: I am working on a project using python and python API bindings in libvirt. I don't see a python method for virNetworkCreateXML:
>>> dir(libvirt.virConnect.networkCreateXML)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class virConnect has no attribute 'networkCreateXML'
There are two methods for virNetworkDefineXML and virNetworkCreate separately:
>>> dir(libvirt.virConnect.networkDefineXML)
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'im_class', 'im_func', 'im_self']
>>> dir(libvirt.virNetwork.create)
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'im_class', 'im_func', 'im_self']
Is networkCreateXML missed?
________________________________
This message (including attachments) is private and confidential. If you have received this message in error, please notify us and remove it from your system.
15 years, 10 months
[libvirt] [OpenVZ]
by Ivan Vovk
Hello,
after updating to the last official release 0.5.1 my application stopped working. No errors to the log file though i raised exceptions where it was possible.
i checked with virsh xml description used for creating OpenVZ container and got the following:
virsh # create ovz.xml
Segmentation fault
after that virsh just closed (as well as my application did before). But itself container was created:
[root@alt-03 ~]# vzlist -a
CTID NPROC STATUS IP_ADDR HOSTNAME
3005 5 running - -
Ovz.xml looks like this:
<domain type="openvz" id="3005">
<name>3005</name>
<memory>131072</memory>
<vcpu>1</vcpu>
<os>
<type>exe</type>
<init>/sbin/init</init>
</os>
<devices>
<filesystem type="template">
<source name="altlinux-4.0"/>
<target dir="/"/>
</filesystem>
<interface type="bridge">
<source bridge="vzrb1"/>
<target dev="veth3005.0"/>
</interface>
</devices>
<domain>
With previous version it worked just fine.
Further, it is impossible to create OpenVZ container without <memory> tag though i didn't notice any effects from it. Does it realy needed?
<vcpu> tag stopped working. Previously it added in config file of the container a record like CPUS="1". No it doesn't add anything.
Mac generation still an issue. It seems my notification about it was missed. Here is a string from config file for created container.
[root@alt-03 ~]# cat /etc/vz/conf/3005.conf | grep NETIF
NETIF="ifname=eth0,bridge=vzrb1,mac=52:54:00:4B:BB:F4,host_ifname=veth3005.0,host_mac=52:54:00:4B:BB:F4"
mac = host_mac = network issue.
________________________________
This message (including attachments) is private and confidential. If you have received this message in error, please notify us and remove it from your system.
15 years, 10 months
[libvirt] [PATCH] virConnectGetHostname: return a fully qualified hostname
by David Lutterkort
The attached patch makes virConnectGetHostname try a little harder to get a
FQDN on systems where gethostname only returns a short name without a
domain (which is pretty useless). The behavior is equivalent to 'hostname
--fqdn'.
> From 2ae57d0c8c68c453b3f9715fcc9f83af0ebe84a0 Mon Sep 17 00:00:00 2001
From: David Lutterkort <lutter(a)redhat.com>
Date: Wed, 10 Dec 2008 18:34:39 -0800
Subject: [PATCH] virConnectGetHostname: return a fully qualified hostname
Instead of doing the equivalent of 'hostname', do 'hostname --fqdn',
i.e. try to qualify the local host name by an additional call to
gethostbyname(3)
---
src/libvirt_sym.version.in | 1 +
src/qemu_driver.c | 16 ++++------------
src/test.c | 16 +++++-----------
src/uml_driver.c | 15 ++++-----------
src/util.c | 17 +++++++++++++++++
src/util.h | 2 ++
src/xen_unified.c | 15 +++++----------
7 files changed, 38 insertions(+), 44 deletions(-)
diff --git a/src/libvirt_sym.version.in b/src/libvirt_sym.version.in
index de0bc4a..f02d9e0 100644
--- a/src/libvirt_sym.version.in
+++ b/src/libvirt_sym.version.in
@@ -594,6 +594,7 @@ LIBVIRT_PRIVATE_@VERSION@ {
virFileReadLimFD;
virFileReadPid;
virFileLinkPointsTo;
+ virGetHostname;
virParseNumber;
virRun;
virSkipSpaces;
diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 5f6fbd1..d6b7515 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -1562,23 +1562,16 @@ cleanup:
static char *
qemudGetHostname (virConnectPtr conn)
{
- int r;
- char hostname[HOST_NAME_MAX+1], *str;
+ char *result;
- r = gethostname (hostname, HOST_NAME_MAX+1);
- if (r == -1) {
+ result = virGetHostname();
+ if (result == NULL) {
qemudReportError (conn, NULL, NULL, VIR_ERR_SYSTEM_ERROR,
"%s", strerror (errno));
return NULL;
}
/* Caller frees this string. */
- str = strdup (hostname);
- if (str == NULL) {
- qemudReportError (conn, NULL, NULL, VIR_ERR_SYSTEM_ERROR,
- "%s", strerror (errno));
- return NULL;
- }
- return str;
+ return result;
}
static int qemudListDomains(virConnectPtr conn, int *ids, int nids) {
@@ -4249,4 +4242,3 @@ int qemuRegister(void) {
virRegisterStateDriver(&qemuStateDriver);
return 0;
}
-
diff --git a/src/test.c b/src/test.c
index 257fc8a..cb623ed 100644
--- a/src/test.c
+++ b/src/test.c
@@ -651,22 +651,16 @@ static int testGetVersion(virConnectPtr conn ATTRIBUTE_UNUSED,
static char *testGetHostname (virConnectPtr conn)
{
- int r;
- char hostname [HOST_NAME_MAX+1], *str;
+ char *result;
- r = gethostname (hostname, HOST_NAME_MAX+1);
- if (r == -1) {
+ result = virGetHostname();
+ if (result == NULL) {
testError (conn, VIR_ERR_SYSTEM_ERROR, "%s",
strerror (errno));
return NULL;
}
- str = strdup (hostname);
- if (str == NULL) {
- testError (conn, VIR_ERR_SYSTEM_ERROR, "%s",
- strerror (errno));
- return NULL;
- }
- return str;
+ /* Caller frees this string. */
+ return result;
}
static int testGetMaxVCPUs(virConnectPtr conn ATTRIBUTE_UNUSED,
diff --git a/src/uml_driver.c b/src/uml_driver.c
index 408096e..52a4e5b 100644
--- a/src/uml_driver.c
+++ b/src/uml_driver.c
@@ -1150,23 +1150,16 @@ cleanup:
static char *
umlGetHostname (virConnectPtr conn)
{
- int r;
- char hostname[HOST_NAME_MAX+1], *str;
+ char *result;
- r = gethostname (hostname, HOST_NAME_MAX+1);
- if (r == -1) {
+ result = virGetHostname();
+ if (result == NULL) {
umlReportError (conn, NULL, NULL, VIR_ERR_SYSTEM_ERROR,
"%s", strerror (errno));
return NULL;
}
/* Caller frees this string. */
- str = strdup (hostname);
- if (str == NULL) {
- umlReportError (conn, NULL, NULL, VIR_ERR_SYSTEM_ERROR,
- "%s", strerror (errno));
- return NULL;
- }
- return str;
+ return result;
}
static int umlListDomains(virConnectPtr conn, int *ids, int nids) {
diff --git a/src/util.c b/src/util.c
index da26009..7188239 100644
--- a/src/util.c
+++ b/src/util.c
@@ -47,6 +47,7 @@
#ifdef HAVE_PATHS_H
#include <paths.h>
#endif
+#include <netdb.h>
#include "virterror_internal.h"
#include "logging.h"
@@ -1306,3 +1307,19 @@ int virDiskNameToIndex(const char *name) {
return idx;
}
+
+char *virGetHostname(void)
+{
+ int r;
+ char hostname[HOST_NAME_MAX+1], *str;
+ struct hostent *he;
+
+ r = gethostname (hostname, HOST_NAME_MAX+1);
+ if (r == -1)
+ return NULL;
+ if (!(he = gethostbyname(hostname)))
+ return NULL;
+
+ /* Caller frees this string. */
+ return strdup (he->h_name);
+}
diff --git a/src/util.h b/src/util.h
index 0748cbf..f85a61e 100644
--- a/src/util.h
+++ b/src/util.h
@@ -161,4 +161,6 @@ static inline int getuid (void) { return 0; }
static inline int getgid (void) { return 0; }
#endif
+char *virGetHostname(void);
+
#endif /* __VIR_UTIL_H__ */
diff --git a/src/xen_unified.c b/src/xen_unified.c
index a60bc79..dbda3b5 100644
--- a/src/xen_unified.c
+++ b/src/xen_unified.c
@@ -447,20 +447,15 @@ xenUnifiedGetVersion (virConnectPtr conn, unsigned long *hvVer)
static char *
xenUnifiedGetHostname (virConnectPtr conn)
{
- int r;
- char hostname [HOST_NAME_MAX+1], *str;
+ char *result;
- r = gethostname (hostname, HOST_NAME_MAX+1);
- if (r == -1) {
- xenUnifiedError (conn, VIR_ERR_SYSTEM_ERROR, "%s", strerror(errno));
- return NULL;
- }
- str = strdup (hostname);
- if (str == NULL) {
+ result = virGetHostname();
+ if (result == NULL) {
xenUnifiedError (conn, VIR_ERR_SYSTEM_ERROR, "%s", strerror(errno));
return NULL;
}
- return str;
+ /* Caller frees this string. */
+ return result;
}
static int
--
1.6.0.4
15 years, 10 months