Avoiding calling remote network driver recursively if inside daemon

This commit is contained in:
Daniel P. Berrange 2007-10-27 01:23:28 +00:00
parent d6f351690e
commit 8a0711c758
3 changed files with 43 additions and 5 deletions

View File

@ -1,3 +1,9 @@
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> 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 * src/qemu_driver.c: Support CDROM media change for KVM/QEMU

View File

@ -302,7 +302,8 @@ int __virStateInitialize(void) {
return -1; return -1;
for (i = 0 ; i < virStateDriverTabCount ; i++) { for (i = 0 ; i < virStateDriverTabCount ; i++) {
if (virStateDriverTab[i]->initialize() < 0) if (virStateDriverTab[i]->initialize &&
virStateDriverTab[i]->initialize() < 0)
ret = -1; ret = -1;
} }
return ret; return ret;
@ -312,7 +313,8 @@ int __virStateCleanup(void) {
int i, ret = 0; int i, ret = 0;
for (i = 0 ; i < virStateDriverTabCount ; i++) { for (i = 0 ; i < virStateDriverTabCount ; i++) {
if (virStateDriverTab[i]->cleanup() < 0) if (virStateDriverTab[i]->cleanup &&
virStateDriverTab[i]->cleanup() < 0)
ret = -1; ret = -1;
} }
return ret; return ret;
@ -322,7 +324,8 @@ int __virStateReload(void) {
int i, ret = 0; int i, ret = 0;
for (i = 0 ; i < virStateDriverTabCount ; i++) { for (i = 0 ; i < virStateDriverTabCount ; i++) {
if (virStateDriverTab[i]->reload() < 0) if (virStateDriverTab[i]->reload &&
virStateDriverTab[i]->reload() < 0)
ret = -1; ret = -1;
} }
return ret; return ret;
@ -332,7 +335,8 @@ int __virStateActive(void) {
int i, ret = 0; int i, ret = 0;
for (i = 0 ; i < virStateDriverTabCount ; i++) { for (i = 0 ; i < virStateDriverTabCount ; i++) {
if (virStateDriverTab[i]->active()) if (virStateDriverTab[i]->active &&
virStateDriverTab[i]->active())
ret = 1; ret = 1;
} }
return ret; return ret;

View File

@ -59,6 +59,8 @@
#define MAGIC 999 /* private_data->magic if OK */ #define MAGIC 999 /* private_data->magic if OK */
#define DEAD 998 /* private_data->magic if dead/closed */ #define DEAD 998 /* private_data->magic if dead/closed */
static int inside_daemon = 0;
struct private_data { struct private_data {
int magic; /* Should be MAGIC or DEAD. */ int magic; /* Should be MAGIC or DEAD. */
int sock; /* Socket. */ int sock; /* Socket. */
@ -120,6 +122,16 @@ static void query_free (struct query_fields *fields);
static int initialise_gnutls (virConnectPtr conn); 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 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: * remoteFindServerPath:
* *
@ -695,9 +707,13 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
static int static int
remoteOpen (virConnectPtr conn, const char *uri_str, int flags) 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; int ret, rflags = 0;
if (inside_daemon)
return VIR_DRV_OPEN_DECLINED;
priv = malloc (sizeof(struct private_data));
if (!priv) { if (!priv) {
error (NULL, VIR_ERR_NO_MEMORY, "struct private_data"); error (NULL, VIR_ERR_NO_MEMORY, "struct private_data");
return VIR_DRV_OPEN_ERROR; return VIR_DRV_OPEN_ERROR;
@ -2361,6 +2377,9 @@ remoteNetworkOpen (virConnectPtr conn,
const char *uri_str, const char *uri_str,
int flags) int flags)
{ {
if (inside_daemon)
return VIR_DRV_OPEN_DECLINED;
if (conn && if (conn &&
conn->driver && conn->driver &&
strcmp (conn->driver->name, "remote") == 0) { strcmp (conn->driver->name, "remote") == 0) {
@ -3174,6 +3193,14 @@ static virNetworkDriver network_driver = {
.networkSetAutostart = remoteNetworkSetAutostart, .networkSetAutostart = remoteNetworkSetAutostart,
}; };
static virStateDriver state_driver = {
remoteStartup,
NULL,
NULL,
NULL,
};
/** remoteRegister: /** remoteRegister:
* *
* Register driver with libvirt driver system. * Register driver with libvirt driver system.
@ -3185,6 +3212,7 @@ remoteRegister (void)
{ {
if (virRegisterDriver (&driver) == -1) return -1; if (virRegisterDriver (&driver) == -1) return -1;
if (virRegisterNetworkDriver (&network_driver) == -1) return -1; if (virRegisterNetworkDriver (&network_driver) == -1) return -1;
if (virRegisterStateDriver (&state_driver) == -1) return -1;
return 0; return 0;
} }