# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1201094533 0
# Node ID 26fc953a89bb398410800610c9dc6727f389795b
# Parent cff4c8a1aa28fa8856d61969618f8db9075e593c
New XS_SET_TARGET
Stubdomains (and probably other domain disagregation elements too)
need to be able to tinker with another domain. This adds
XS_SET_TARGET so that XenStore allows domains to have permissions on
files on which the "target" has permissions. This also adds
xs_set_target, called by the domain builder when the 'target' option
is used in the configuration.
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
---
tools/python/xen/lowlevel/xs/xs.c | 31 +++++++++++++++++++++
tools/python/xen/xend/XendDomainInfo.py | 20 +++++++++++++
tools/python/xen/xend/image.py | 6 ++++
tools/python/xen/xend/xenstore/xsutil.py | 3 ++
tools/xenstore/xenstored_core.c | 13 +++++++-
tools/xenstore/xenstored_core.h | 3 ++
tools/xenstore/xenstored_domain.c | 45 +++++++++++++++++++++++++++++++
tools/xenstore/xenstored_domain.h | 3 ++
tools/xenstore/xs.c | 19 +++++++++++++
tools/xenstore/xs.h | 9 ++++++
xen/include/public/io/xs_wire.h | 3 +-
11 files changed, 151 insertions(+), 4 deletions(-)
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/lowlevel/xs/xs.c
--- a/tools/python/xen/lowlevel/xs/xs.c Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/lowlevel/xs/xs.c Wed Jan 23 13:22:13 2008 +0000
@@ -619,6 +619,36 @@ static PyObject *xspy_introduce_domain(X
return none(result);
}
+#define xspy_set_target_doc "\n" \
+ "Tell xenstore that a domain is targetting another one so it\n" \
+ "should let it tinker with it.\n" \
+ " dom [int] : domain id\n" \
+ " target [int] : domain id of the target\n" \
+ "\n" \
+ "Returns None on success.\n" \
+ "Raises xen.lowlevel.xs.Error on error.\n" \
+ "\n"
+
+static PyObject *xspy_set_target(XsHandle *self, PyObject *args)
+{
+ uint32_t dom;
+ uint32_t target;
+
+ struct xs_handle *xh = xshandle(self);
+ bool result = 0;
+
+ if (!xh)
+ return NULL;
+ if (!PyArg_ParseTuple(args, "ii", &dom, &target))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = xs_set_target(xh, dom, target);
+ Py_END_ALLOW_THREADS
+
+ return none(result);
+}
+
#define xspy_resume_domain_doc "\n" \
"Tell xenstore to clear its shutdown flag for a domain.\n" \
"This ensures that a subsequent shutdown will fire the\n" \
@@ -817,6 +847,7 @@ static PyMethodDef xshandle_methods[] =
XSPY_METH(transaction_start, METH_NOARGS),
XSPY_METH(transaction_end, METH_VARARGS | METH_KEYWORDS),
XSPY_METH(introduce_domain, METH_VARARGS),
+ XSPY_METH(set_target, METH_VARARGS),
XSPY_METH(resume_domain, METH_VARARGS),
XSPY_METH(release_domain, METH_VARARGS),
XSPY_METH(close, METH_NOARGS),
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py Wed Jan 23 13:22:13 2008 +0000
@@ -47,7 +47,7 @@ from xen.xend.XendDevices import XendDev
from xen.xend.XendDevices import XendDevices
from xen.xend.XendTask import XendTask
from xen.xend.xenstore.xstransact import xstransact, complete
-from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain,
ResumeDomain
+from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain,
SetTarget, ResumeDomain
from xen.xend.xenstore.xswatch import xswatch
from xen.xend.XendConstants import *
from xen.xend.XendAPIConstants import *
@@ -883,6 +883,9 @@ class XendDomainInfo:
def storeVm(self, *args):
return xstransact.Store(self.vmpath, *args)
+ def permissionsVm(self, *args):
+ return xstransact.SetPermissions(self.vmpath, *args)
+
def _readVmTxn(self, transaction, *args):
paths = map(lambda x: self.vmpath + "/" + x, args)
@@ -903,6 +906,10 @@ class XendDomainInfo:
def storeVmTxn(self, transaction, *args):
paths = map(lambda x: self.vmpath + "/" + x, args)
return transaction.store(*paths)
+
+ def permissionsVmTxn(self, transaction, *args):
+ paths = map(lambda x: self.vmpath + "/" + x, args)
+ return transaction.set_permissions(*paths)
#
# Function to update xenstore /dom/*
@@ -1692,6 +1699,15 @@ class XendDomainInfo:
except RuntimeError, exn:
raise XendError(str(exn))
+ def _setTarget(self, target):
+ assert self.domid is not None
+
+ try:
+ SetTarget(self.domid, target)
+ self.storeDom('target', target)
+ except RuntimeError, exn:
+ raise XendError(str(exn))
+
def _initDomain(self):
log.debug('XendDomainInfo.initDomain: %s %s',
@@ -1756,6 +1772,8 @@ class XendDomainInfo:
self.native_protocol = channel_details['native_protocol'];
self._introduceDomain()
+ if self.info.target():
+ self._setTarget(self.info.target())
self._createDevices()
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/xend/image.py Wed Jan 23 13:22:13 2008 +0000
@@ -222,6 +222,7 @@ class ImageHandler:
vncopts = ""
if passwd:
self.vm.storeVm("vncpasswd", passwd)
+ self.vm.permissionsVm("vncpasswd", { 'dom':
self.vm.getDomid(), 'read': True } )
vncopts = vncopts + ",password"
log.debug("Stored a VNC password for vfb access")
else:
@@ -280,6 +281,9 @@ class ImageHandler:
env['XAUTHORITY'] = self.xauthority
if self.vncconsole:
args = args + ([ "-vncviewer" ])
+ xstransact.Mkdir("/local/domain/0/device-model/%i" %
self.vm.getDomid())
+ xstransact.SetPermissions("/local/domain/0/device-model/%i" %
self.vm.getDomid(),
+ { 'dom': self.vm.getDomid(), 'read': True, 'write':
True })
log.info("spawning device models: %s %s", self.device_model, args)
# keep track of pid and spawned options to kill it later
self.pid = os.spawnve(os.P_NOWAIT, self.device_model, args, env)
@@ -422,7 +426,9 @@ class HVMImageHandler(ImageHandler):
self.vm.storeVm(("image/dmargs", " ".join(self.dmargs)),
("image/device-model", self.device_model),
("image/display", self.display))
+ self.vm.permissionsVm("image/dmargs", { 'dom': self.vm.getDomid(),
'read': True } )
self.vm.storeVm(("rtc/timeoffset", rtc_timeoffset))
+ self.vm.permissionsVm("rtc/timeoffset", { 'dom': self.vm.getDomid(),
'read': True } )
self.apic = int(vmConfig['platform'].get('apic', 0))
self.acpi = int(vmConfig['platform'].get('acpi', 0))
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/python/xen/xend/xenstore/xsutil.py
--- a/tools/python/xen/xend/xenstore/xsutil.py Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/python/xen/xend/xenstore/xsutil.py Wed Jan 23 13:22:13 2008 +0000
@@ -22,6 +22,9 @@ def IntroduceDomain(domid, page, port):
def IntroduceDomain(domid, page, port):
return xshandle().introduce_domain(domid, page, port)
+def SetTarget(domid, target):
+ return xshandle().set_target(domid, target)
+
def GetDomainPath(domid):
return xshandle().get_domain_path(domid)
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_core.c Wed Jan 23 13:22:13 2008 +0000
@@ -119,6 +119,7 @@ static char *sockmsg_string(enum xsd_soc
case XS_ERROR: return "ERROR";
case XS_IS_DOMAIN_INTRODUCED: return "XS_IS_DOMAIN_INTRODUCED";
case XS_RESUME: return "RESUME";
+ case XS_SET_TARGET: return "SET_TARGET";
default:
return "**UNKNOWN**";
}
@@ -283,6 +284,8 @@ static int destroy_conn(void *_conn)
break;
close(conn->fd);
}
+ if (conn->target)
+ talloc_unlink(conn, conn->target);
list_del(&conn->list);
trace_destroy(conn, "connection");
return 0;
@@ -472,11 +475,13 @@ static enum xs_perm_type perm_for_conn(s
mask &= ~XS_PERM_WRITE;
/* Owners and tools get it all... */
- if (!conn->id || perms[0].id == conn->id)
+ if (!conn->id || perms[0].id == conn->id
+ || (conn->target && perms[0].id == conn->target->id))
return (XS_PERM_READ|XS_PERM_WRITE|XS_PERM_OWNER) & mask;
for (i = 1; i < num; i++)
- if (perms[i].id == conn->id)
+ if (perms[i].id == conn->id
+ || (conn->target && perms[i].id == conn->target->id))
return perms[i].perms & mask;
return perms[0].perms & mask;
@@ -1243,6 +1248,10 @@ static void process_message(struct conne
case XS_RESUME:
do_resume(conn, onearg(in));
+ break;
+
+ case XS_SET_TARGET:
+ do_set_target(conn, in);
break;
default:
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_core.h
--- a/tools/xenstore/xenstored_core.h Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_core.h Wed Jan 23 13:22:13 2008 +0000
@@ -84,6 +84,9 @@ struct connection
/* The domain I'm associated with, if any. */
struct domain *domain;
+ /* The target of the domain I'm associated with. */
+ struct connection *target;
+
/* My watches. */
struct list_head watches;
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_domain.c Wed Jan 23 13:22:13 2008 +0000
@@ -381,6 +381,51 @@ void do_introduce(struct connection *con
send_ack(conn, XS_INTRODUCE);
}
+void do_set_target(struct connection *conn, struct buffered_data *in)
+{
+ char *vec[2];
+ unsigned int domid, tdomid;
+ struct domain *domain, *tdomain;
+ if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec)) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ if (conn->id != 0 || !conn->can_write) {
+ send_error(conn, EACCES);
+ return;
+ }
+
+ domid = atoi(vec[0]);
+ tdomid = atoi(vec[1]);
+
+ domain = find_domain_by_domid(domid);
+ if (!domain) {
+ send_error(conn, ENOENT);
+ return;
+ }
+ if (!domain->conn) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ tdomain = find_domain_by_domid(tdomid);
+ if (!tdomain) {
+ send_error(conn, ENOENT);
+ return;
+ }
+
+ if (!tdomain->conn) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ talloc_reference(domain->conn, tdomain->conn);
+ domain->conn->target = tdomain->conn;
+
+ send_ack(conn, XS_SET_TARGET);
+}
+
/* domid */
void do_release(struct connection *conn, const char *domid_str)
{
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xenstored_domain.h
--- a/tools/xenstore/xenstored_domain.h Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xenstored_domain.h Wed Jan 23 13:22:13 2008 +0000
@@ -34,6 +34,9 @@ void do_release(struct connection *conn,
/* domid */
void do_resume(struct connection *conn, const char *domid_str);
+/* domid, target */
+void do_set_target(struct connection *conn, struct buffered_data *in);
+
/* domid */
void do_get_domain_path(struct connection *conn, const char *domid_str);
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xs.c
--- a/tools/xenstore/xs.c Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xs.c Wed Jan 23 13:22:13 2008 +0000
@@ -708,6 +708,25 @@ bool xs_introduce_domain(struct xs_handl
ARRAY_SIZE(iov), NULL));
}
+bool xs_set_target(struct xs_handle *h,
+ unsigned int domid, unsigned int target)
+{
+ char domid_str[MAX_STRLEN(domid)];
+ char target_str[MAX_STRLEN(target)];
+ struct iovec iov[2];
+
+ snprintf(domid_str, sizeof(domid_str), "%u", domid);
+ snprintf(target_str, sizeof(target_str), "%u", target);
+
+ iov[0].iov_base = domid_str;
+ iov[0].iov_len = strlen(domid_str) + 1;
+ iov[1].iov_base = target_str;
+ iov[1].iov_len = strlen(target_str) + 1;
+
+ return xs_bool(xs_talkv(h, XBT_NULL, XS_SET_TARGET, iov,
+ ARRAY_SIZE(iov), NULL));
+}
+
static void * single_with_domid(struct xs_handle *h,
enum xsd_sockmsg_type type,
unsigned int domid)
diff -r cff4c8a1aa28 -r 26fc953a89bb tools/xenstore/xs.h
--- a/tools/xenstore/xs.h Wed Jan 23 13:21:44 2008 +0000
+++ b/tools/xenstore/xs.h Wed Jan 23 13:22:13 2008 +0000
@@ -132,6 +132,15 @@ bool xs_introduce_domain(struct xs_handl
unsigned int domid,
unsigned long mfn,
unsigned int eventchn);
+
+/* Set the target of a domain
+ * This tells the store daemon that a domain is targetting another one, so
+ * it should let it tinker with it.
+ */
+bool xs_set_target(struct xs_handle *h,
+ unsigned int domid,
+ unsigned int target);
+
/* Resume a domain.
* Clear the shutdown flag for this domain in the store.
*/
diff -r cff4c8a1aa28 -r 26fc953a89bb xen/include/public/io/xs_wire.h
--- a/xen/include/public/io/xs_wire.h Wed Jan 23 13:21:44 2008 +0000
+++ b/xen/include/public/io/xs_wire.h Wed Jan 23 13:22:13 2008 +0000
@@ -46,7 +46,8 @@ enum xsd_sockmsg_type
XS_WATCH_EVENT,
XS_ERROR,
XS_IS_DOMAIN_INTRODUCED,
- XS_RESUME
+ XS_RESUME,
+ XS_SET_TARGET
};
#define XS_WRITE_NONE "NONE"
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|