[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/7] tools/xenstored: support SET/GET_FEATURE commands



Add support for XS_SET_FEATURE and XS_GET_FEATURE to xenstored.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 tools/xenstored/core.c   |  4 +++
 tools/xenstored/domain.c | 60 ++++++++++++++++++++++++++++++++++++++++
 tools/xenstored/domain.h |  8 ++++++
 3 files changed, 72 insertions(+)

diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c
index 37e4dd5a5b..3022efdce1 100644
--- a/tools/xenstored/core.c
+++ b/tools/xenstored/core.c
@@ -2031,6 +2031,10 @@ static struct {
            { "SET_TARGET",    do_set_target,   XS_FLAG_PRIV },
        [XS_RESET_WATCHES]     = { "RESET_WATCHES",     do_reset_watches },
        [XS_DIRECTORY_PART]    = { "DIRECTORY_PART",    send_directory_part },
+       [XS_GET_FEATURE]       =
+           { "GET_FEATURE",   do_get_feature,  XS_FLAG_PRIV },
+       [XS_SET_FEATURE]       =
+           { "SET_FEATURE",   do_set_feature,  XS_FLAG_PRIV },
 };
 
 static const char *sockmsg_string(enum xsd_sockmsg_type type)
diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c
index f6d24bc13a..3969b82967 100644
--- a/tools/xenstored/domain.c
+++ b/tools/xenstored/domain.c
@@ -1244,6 +1244,66 @@ int do_reset_watches(const void *ctx, struct connection 
*conn,
        return 0;
 }
 
+int do_get_feature(const void *ctx, struct connection *conn,
+                  struct buffered_data *in)
+{
+       const char *vec[1];
+       unsigned int n_args;
+       unsigned int domid;
+       const struct domain *domain;
+       unsigned int features;
+       char *result;
+
+       n_args = get_strings(in, vec, ARRAY_SIZE(vec));
+       if (n_args > 1)
+               return EINVAL;
+
+       if (n_args == 1) {
+               domid = atoi(vec[0]);
+               domain = find_or_alloc_existing_domain(domid);
+               if (!domain)
+                       return ENOENT;
+               features = domain->features;
+       } else
+               features = XENSTORE_FEATURES;
+
+       result = talloc_asprintf(ctx, "%u", features);
+       if (!result)
+               return ENOMEM;
+
+       send_reply(conn, XS_GET_FEATURE, result, strlen(result) + 1);
+
+       return 0;
+}
+
+int do_set_feature(const void *ctx, struct connection *conn,
+                  struct buffered_data *in)
+{
+       const char *vec[2];
+       unsigned int domid;
+       struct domain *domain;
+       unsigned int features;
+
+       if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec))
+               return EINVAL;
+
+       domid = atoi(vec[0]);
+       features = atoi(vec[1]);
+       domain = find_or_alloc_existing_domain(domid);
+       if (!domain)
+               return ENOENT;
+       if (domain->introduced)
+               return EBUSY;
+       if (features & ~XENSTORE_FEATURES)
+               return EINVAL;
+
+       domain->features = features;
+
+       send_ack(conn, XS_SET_FEATURE);
+
+       return 0;
+}
+
 static int close_xgt_handle(void *_handle)
 {
        xengnttab_close(*(xengnttab_handle **)_handle);
diff --git a/tools/xenstored/domain.h b/tools/xenstored/domain.h
index 8bfaca8f90..94481fdcc0 100644
--- a/tools/xenstored/domain.h
+++ b/tools/xenstored/domain.h
@@ -82,6 +82,14 @@ int do_get_domain_path(const void *ctx, struct connection 
*conn,
 int do_reset_watches(const void *ctx, struct connection *conn,
                     struct buffered_data *in);
 
+/* Get global or per domain server features */
+int do_get_feature(const void *ctx, struct connection *conn,
+                  struct buffered_data *in);
+
+/* Set per domain server features */
+int do_set_feature(const void *ctx, struct connection *conn,
+                  struct buffered_data *in);
+
 void domain_early_init(void);
 void domain_init(int evtfd);
 void dom0_init(void);
-- 
2.43.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.