+Fri Oct 26 21:20:44 EST 2007 Daniel P. Berrange <berrange@redhat.com>
+
+ * src/libvirt.c: Don't call state driver API if callback is NULL.
+ * src/remote_internal.c: Reject open attempts if inside the daemon
+ to avoid recursively calling self.
+
Fri Oct 26 21:18:44 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/qemu_driver.c: Support CDROM media change for KVM/QEMU
return -1;
for (i = 0 ; i < virStateDriverTabCount ; i++) {
- if (virStateDriverTab[i]->initialize() < 0)
+ if (virStateDriverTab[i]->initialize &&
+ virStateDriverTab[i]->initialize() < 0)
ret = -1;
}
return ret;
int i, ret = 0;
for (i = 0 ; i < virStateDriverTabCount ; i++) {
- if (virStateDriverTab[i]->cleanup() < 0)
+ if (virStateDriverTab[i]->cleanup &&
+ virStateDriverTab[i]->cleanup() < 0)
ret = -1;
}
return ret;
int i, ret = 0;
for (i = 0 ; i < virStateDriverTabCount ; i++) {
- if (virStateDriverTab[i]->reload() < 0)
+ if (virStateDriverTab[i]->reload &&
+ virStateDriverTab[i]->reload() < 0)
ret = -1;
}
return ret;
int i, ret = 0;
for (i = 0 ; i < virStateDriverTabCount ; i++) {
- if (virStateDriverTab[i]->active())
+ if (virStateDriverTab[i]->active &&
+ virStateDriverTab[i]->active())
ret = 1;
}
return ret;
#define MAGIC 999 /* private_data->magic if OK */
#define DEAD 998 /* private_data->magic if dead/closed */
+static int inside_daemon = 0;
+
struct private_data {
int magic; /* Should be MAGIC or DEAD. */
int sock; /* Socket. */
static int initialise_gnutls (virConnectPtr conn);
static gnutls_session_t negotiate_gnutls_on_connection (virConnectPtr conn, int sock, int no_verify, const char *hostname);
+static int
+remoteStartup(void)
+{
+ /* Mark that we're inside the daemon so we can avoid
+ * re-entering ourselves
+ */
+ inside_daemon = 1;
+ return 0;
+}
+
/**
* remoteFindServerPath:
*
static int
remoteOpen (virConnectPtr conn, const char *uri_str, int flags)
{
- struct private_data *priv = malloc (sizeof(struct private_data));
+ struct private_data *priv;
int ret, rflags = 0;
+ if (inside_daemon)
+ return VIR_DRV_OPEN_DECLINED;
+
+ priv = malloc (sizeof(struct private_data));
if (!priv) {
error (NULL, VIR_ERR_NO_MEMORY, "struct private_data");
return VIR_DRV_OPEN_ERROR;
const char *uri_str,
int flags)
{
+ if (inside_daemon)
+ return VIR_DRV_OPEN_DECLINED;
+
if (conn &&
conn->driver &&
strcmp (conn->driver->name, "remote") == 0) {
.networkSetAutostart = remoteNetworkSetAutostart,
};
+static virStateDriver state_driver = {
+ remoteStartup,
+ NULL,
+ NULL,
+ NULL,
+};
+
+
/** remoteRegister:
*
* Register driver with libvirt driver system.
{
if (virRegisterDriver (&driver) == -1) return -1;
if (virRegisterNetworkDriver (&network_driver) == -1) return -1;
+ if (virRegisterStateDriver (&state_driver) == -1) return -1;
return 0;
}