diff --git a/ChangeLog b/ChangeLog index 0f2c7c9e97..edfe8ceeea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Mon Mar 17 13:24:22 EDT 2008 Daniel P. Berrange + + * configure.in: Add WITH_PROXY to config.h file + * src/remote_internal.c: Handle local Xen URIs if Xen drivers + declines them + * src/xen_unfied.c: Use explicit logic for opening sub-drivers + rather than a hacked loop. + * src/xend_internal.c: Don't complain about failing to open + xend when non-root read-only. + Mon Mar 17 17:55:56 CET 2008 Jim Meyering Treat ENOTSUP like ENODATA, after failed fgetfilecon. diff --git a/configure.in b/configure.in index 50c14e089d..d44e611d53 100644 --- a/configure.in +++ b/configure.in @@ -869,6 +869,9 @@ fi AC_MSG_RESULT([$with_xen_proxy]) AM_CONDITIONAL(WITH_PROXY,[test "$with_xen_proxy" = "yes"]) +if test "$with_xen_proxy" = "yes"; then + AC_DEFINE(WITH_PROXY, 1, [Whether Xen proxy is enabled]) +fi dnl Enable building libvirtd? AM_CONDITIONAL(WITH_LIBVIRTD,[test "x$with_libvirtd" = "xyes"]) diff --git a/src/remote_internal.c b/src/remote_internal.c index fa8af78bec..09094819bb 100644 --- a/src/remote_internal.c +++ b/src/remote_internal.c @@ -835,6 +835,14 @@ remoteOpen (virConnectPtr conn, } } #endif +#if WITH_XEN + if (uri && + uri->scheme && STREQ (uri->scheme, "xen") && + (!uri->server || STREQ (uri->server, "")) && + (!uri->path || STREQ(uri->path, "/"))) { + rflags |= VIR_DRV_OPEN_REMOTE_UNIX; + } +#endif priv->magic = DEAD; priv->sock = -1; diff --git a/src/xen_unified.c b/src/xen_unified.c index 022e98e9bd..7e006e2ace 100644 --- a/src/xen_unified.c +++ b/src/xen_unified.c @@ -42,6 +42,7 @@ #include "util.h" #define DEBUG(fmt,...) VIR_DEBUG(__FILE__, fmt,__VA_ARGS__) +#define DEBUG0(msg) VIR_DEBUG(__FILE__, "%s", msg) static int xenUnifiedNodeGetInfo (virConnectPtr conn, virNodeInfoPtr info); @@ -239,7 +240,7 @@ xenUnifiedProbe (void) static int xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int flags) { - int i, j; + int i; xenUnifiedPrivatePtr priv; /* Refuse any scheme which isn't "xen://" or "http://". */ @@ -276,41 +277,73 @@ xenUnifiedOpen (virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr auth, int f priv->xshandle = NULL; priv->proxy = -1; - for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) { - priv->opened[i] = 0; - /* Only use XM driver for Xen <= 3.0.3 (ie xendConfigVersion <= 2) */ - if (drivers[i] == &xenXMDriver && - priv->xendConfigVersion > 2) - continue; - - /* Ignore proxy for root */ - if (i == XEN_UNIFIED_PROXY_OFFSET && getuid() == 0) - continue; - - if (drivers[i]->open) { - DEBUG("trying Xen sub-driver %d", i); - if (drivers[i]->open (conn, uri, auth, flags) == VIR_DRV_OPEN_SUCCESS) - priv->opened[i] = 1; - DEBUG("Xen sub-driver %d open %s\n", - i, priv->opened[i] ? "ok" : "failed"); + /* Hypervisor is only run as root & required to succeed */ + if (getuid() == 0) { + DEBUG0("Trying hypervisor sub-driver"); + if (drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->open(conn, uri, auth, flags) == + VIR_DRV_OPEN_SUCCESS) { + DEBUG0("Activated hypervisor sub-driver"); + priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] = 1; } + } - /* If as root, then all drivers must succeed. - If non-root, then only proxy must succeed */ - if (!priv->opened[i] && - (getuid() == 0 || i == XEN_UNIFIED_PROXY_OFFSET)) { - for (j = 0; j < i; ++j) - if (priv->opened[j]) drivers[j]->close (conn); - free (priv); - /* The assumption is that one of the underlying drivers - * has set virterror already. - */ - return VIR_DRV_OPEN_ERROR; + /* XenD is required to suceed if root. + * If it fails as non-root, then the proxy driver may take over + */ + DEBUG0("Trying XenD sub-driver"); + if (drivers[XEN_UNIFIED_XEND_OFFSET]->open(conn, uri, auth, flags) == + VIR_DRV_OPEN_SUCCESS) { + DEBUG0("Activated XenD sub-driver"); + priv->opened[XEN_UNIFIED_XEND_OFFSET] = 1; + + /* XenD is active, so try the xm & xs drivers too, both requird to + * succeed if root, optional otherwise */ + if (priv->xendConfigVersion <= 2) { + DEBUG0("Trying XM sub-driver"); + if (drivers[XEN_UNIFIED_XM_OFFSET]->open(conn, uri, auth, flags) == + VIR_DRV_OPEN_SUCCESS) { + DEBUG0("Activated XM sub-driver"); + priv->opened[XEN_UNIFIED_XM_OFFSET] = 1; + } + } + DEBUG0("Trying XS sub-driver"); + if (drivers[XEN_UNIFIED_XS_OFFSET]->open(conn, uri, auth, flags) == + VIR_DRV_OPEN_SUCCESS) { + DEBUG0("Activated XS sub-driver"); + priv->opened[XEN_UNIFIED_XS_OFFSET] = 1; + } else { + if (getuid() == 0) + goto fail; /* XS is mandatory as root */ + } + } else { + if (getuid() == 0) { + goto fail; /* XenD is mandatory as root */ + } else { +#if WITH_PROXY + DEBUG0("Trying proxy sub-driver"); + if (drivers[XEN_UNIFIED_PROXY_OFFSET]->open(conn, uri, auth, flags) == + VIR_DRV_OPEN_SUCCESS) { + DEBUG0("Activated proxy sub-driver"); + priv->opened[XEN_UNIFIED_PROXY_OFFSET] = 1; + } else { + goto fail; /* Proxy is mandatory if XenD failed */ + } +#else + DEBUG0("Handing off for remote driver"); + return VIR_DRV_OPEN_DECLINED; /* Let remote_driver try instead */ +#endif } } return VIR_DRV_OPEN_SUCCESS; + + fail: + DEBUG0("Failed to activate a mandatory sub-driver"); + for (i = 0 ; i < XEN_UNIFIED_NR_DRIVERS ; i++) + if (priv->opened[i]) drivers[i]->close(conn); + free(priv); + return VIR_DRV_OPEN_ERROR; } #define GET_PRIVATE(conn) \ diff --git a/src/xend_internal.c b/src/xend_internal.c index 745a3b720a..c1b36d276d 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -234,14 +234,13 @@ do_connect(virConnectPtr xend) close(s); errno = serrno; s = -1; - /* - * not being able to connect via the socket as a normal user - * is rather normal, this should fallback to the proxy (or - * remote) mechanism. - */ - if ((getuid() == 0) || (xend->flags & VIR_CONNECT_RO)) { - virXendError(xend, VIR_ERR_INTERNAL_ERROR, - _("failed to connect to xend")); + + /* + * Connecting to XenD as root is mandatory, so log this error + */ + if (getuid() == 0) { + virXendError(xend, VIR_ERR_INTERNAL_ERROR, + _("failed to connect to xend")); } }