aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenstore
diff options
context:
space:
mode:
authorIan Jackson <ian.jackson@eu.citrix.com>2012-01-13 16:54:11 +0000
committerIan Jackson <ian.jackson@eu.citrix.com>2012-01-13 16:54:11 +0000
commit3607a75236b37abe350bf52f4700355be963a60d (patch)
tree202537d0bdc1bd8fab74287d370721fe67f416a3 /tools/xenstore
parent50c5cd458d3afe161f634bab1127508ad3f9afdc (diff)
downloadxen-3607a75236b37abe350bf52f4700355be963a60d.tar.gz
xen-3607a75236b37abe350bf52f4700355be963a60d.tar.bz2
xen-3607a75236b37abe350bf52f4700355be963a60d.zip
xenstore: New function xs_path_is_subpath
This utility function compares two paths, textually and reports whether one is a subpath (a child path) of the other. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Diffstat (limited to 'tools/xenstore')
-rw-r--r--tools/xenstore/xs.c17
-rw-r--r--tools/xenstore/xs.h7
2 files changed, 24 insertions, 0 deletions
diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
index 8e54fe01c9..0a01675a78 100644
--- a/tools/xenstore/xs.c
+++ b/tools/xenstore/xs.c
@@ -950,6 +950,23 @@ char *xs_get_domain_path(struct xs_handle *h, unsigned int domid)
return xs_single(h, XBT_NULL, XS_GET_DOMAIN_PATH, domid_str, NULL);
}
+bool xs_path_is_subpath(const char *parent, const char *child)
+{
+ size_t childlen = strlen(child);
+ size_t parentlen = strlen(parent);
+
+ if (childlen < parentlen)
+ return false;
+
+ if (memcmp(child, parent, parentlen))
+ return false;
+
+ if (childlen > parentlen && child[parentlen] != '/')
+ return false;
+
+ return true;
+}
+
bool xs_is_domain_introduced(struct xs_handle *h, unsigned int domid)
{
char *domain = single_with_domid(h, XS_IS_DOMAIN_INTRODUCED, domid);
diff --git a/tools/xenstore/xs.h b/tools/xenstore/xs.h
index 63f535dd55..8d49e50e46 100644
--- a/tools/xenstore/xs.h
+++ b/tools/xenstore/xs.h
@@ -207,6 +207,13 @@ bool xs_release_domain(struct xs_handle *h, unsigned int domid);
*/
char *xs_get_domain_path(struct xs_handle *h, unsigned int domid);
+/* Returns true if child is either equal to parent, or a node underneath
+ * parent; or false otherwise. Done by string comparison, so relative and
+ * absolute pathnames never in a parent/child relationship by this
+ * definition. Cannot fail.
+ */
+bool xs_path_is_subpath(const char *parent, const char *child);
+
/* Return whether the domain specified has been introduced to xenstored.
*/
bool xs_is_domain_introduced(struct xs_handle *h, unsigned int domid);