[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |