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

[PATCH 01/11] tools/libs/store: add get- and set-quota related functions



Add functions for getting and setting Xenstore quota to libxenstore:

xs_get_quota_names(): get the names of the supported quota.

xs_get_global_quota(): get the value of one global quota.

xs_set_global_quota(): set the value of one global quota.

xs_get_domain_quota(): get the value of one quota of a domain.

xs_set_domain_quota(): set the value of one quota of a domain.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 tools/include/xenstore.h         |  19 ++++++
 tools/libs/store/Makefile        |   2 +-
 tools/libs/store/libxenstore.map |   8 +++
 tools/libs/store/xs.c            | 111 +++++++++++++++++++++++++++++++
 4 files changed, 139 insertions(+), 1 deletion(-)

diff --git a/tools/include/xenstore.h b/tools/include/xenstore.h
index 423422dc50..6b661e5895 100644
--- a/tools/include/xenstore.h
+++ b/tools/include/xenstore.h
@@ -277,6 +277,25 @@ bool xs_get_features_domain(struct xs_handle *h, unsigned 
int domid,
 bool xs_set_features_domain(struct xs_handle *h, unsigned int domid,
                            unsigned int features);
 
+/* Get names of supported quota. */
+char **xs_get_quota_names(struct xs_handle *h, unsigned int *num);
+
+/* Get the value of one global quota. */
+bool xs_get_global_quota(struct xs_handle *h, char *quota,
+                        unsigned int *value);
+
+/* Set the value of one global quota. */
+bool xs_set_global_quota(struct xs_handle *h, char *quota,
+                        unsigned int value);
+
+/* Get the value of one domain quota. */
+bool xs_get_domain_quota(struct xs_handle *h, unsigned int domid,
+                        char *quota, unsigned int *value);
+
+/* Set the value of one domain quota. */
+bool xs_set_domain_quota(struct xs_handle *h, unsigned int domid,
+                        char *quota, unsigned int value);
+
 char *xs_control_command(struct xs_handle *h, const char *cmd,
                         void *data, unsigned int len);
 /* Deprecated: use xs_control_command() instead. */
diff --git a/tools/libs/store/Makefile b/tools/libs/store/Makefile
index fed43b0008..b52d1f35ad 100644
--- a/tools/libs/store/Makefile
+++ b/tools/libs/store/Makefile
@@ -2,7 +2,7 @@ XEN_ROOT=$(CURDIR)/../../..
 include $(XEN_ROOT)/tools/Rules.mk
 
 MAJOR = 4
-MINOR = 1
+MINOR = 2
 version-script := libxenstore.map
 
 ifeq ($(CONFIG_Linux),y)
diff --git a/tools/libs/store/libxenstore.map b/tools/libs/store/libxenstore.map
index cd9df86749..a08ddd549f 100644
--- a/tools/libs/store/libxenstore.map
+++ b/tools/libs/store/libxenstore.map
@@ -45,3 +45,11 @@ VERS_4.1 {
                xs_get_features_domain;
                xs_set_features_domain;
 } VERS_4.0;
+VERS_4.2 {
+       global:
+               xs_get_quota_names;
+               xs_get_global_quota;
+               xs_set_global_quota;
+               xs_get_domain_quota;
+               xs_set_domain_quota;
+} VERS_4.1;
diff --git a/tools/libs/store/xs.c b/tools/libs/store/xs.c
index 8f4b90a3cf..dda37f7526 100644
--- a/tools/libs/store/xs.c
+++ b/tools/libs/store/xs.c
@@ -1456,6 +1456,117 @@ bool xs_set_features_domain(struct xs_handle *h, 
unsigned int domid,
        return xs_bool(xs_talkv(h, iov, ARRAY_SIZE(iov), NULL));
 }
 
+char **xs_get_quota_names(struct xs_handle *h, unsigned int *num)
+{
+       struct xsd_sockmsg msg = { .type = XS_GET_QUOTA };
+       struct iovec iov[1];
+       char **quota;
+       char *reply;
+       char *c;
+       unsigned int i;
+
+       iov[0].iov_base = &msg;
+       iov[0].iov_len  = sizeof(msg);
+
+       reply = xs_talkv(h, iov, ARRAY_SIZE(iov), NULL);
+       if (!reply)
+               return NULL;
+
+       *num = 1;
+       for (c = reply; *c; c++)
+               if (*c == ' ')
+                       (*num)++;
+
+       quota = malloc(*num * sizeof(char *) + strlen(reply) + 1);
+       c = (char *)(quota + *num);
+       strcpy(c, reply);
+       for (i = 0; i < *num; i++) {
+               quota[i] = c;
+               c = strchr(c, ' ');
+               if (c) {
+                       *c = 0;
+                       c++;
+               }
+       }
+
+       return quota;
+}
+
+bool xs_get_global_quota(struct xs_handle *h, char *quota,
+                        unsigned int *value)
+{
+       struct xsd_sockmsg msg = { .type = XS_GET_QUOTA };
+       struct iovec iov[2];
+
+       iov[0].iov_base = &msg;
+       iov[0].iov_len  = sizeof(msg);
+       iov[1].iov_base = quota;
+       iov[1].iov_len  = strlen(quota) + 1;
+
+       return xs_uint(xs_talkv(h, iov, ARRAY_SIZE(iov), NULL), value);
+}
+
+bool xs_set_global_quota(struct xs_handle *h, char *quota,
+                        unsigned int value)
+{
+       struct xsd_sockmsg msg = { .type = XS_SET_QUOTA };
+       char val_str[MAX_STRLEN(value)];
+       struct iovec iov[3];
+
+       snprintf(val_str, sizeof(val_str), "%u", value);
+
+       iov[0].iov_base = &msg;
+       iov[0].iov_len  = sizeof(msg);
+       iov[1].iov_base = quota;
+       iov[1].iov_len  = strlen(quota) + 1;
+       iov[2].iov_base = val_str;
+       iov[2].iov_len  = strlen(val_str) + 1;
+
+       return xs_bool(xs_talkv(h, iov, ARRAY_SIZE(iov), NULL));
+}
+
+bool xs_get_domain_quota(struct xs_handle *h, unsigned int domid,
+                        char *quota, unsigned int *value)
+{
+       struct xsd_sockmsg msg = { .type = XS_GET_QUOTA };
+       char domid_str[MAX_STRLEN(domid)];
+       struct iovec iov[3];
+
+       snprintf(domid_str, sizeof(domid_str), "%u", domid);
+
+       iov[0].iov_base = &msg;
+       iov[0].iov_len  = sizeof(msg);
+       iov[1].iov_base = domid_str;
+       iov[1].iov_len  = strlen(domid_str) + 1;
+       iov[2].iov_base = quota;
+       iov[2].iov_len  = strlen(quota) + 1;
+
+       return xs_uint(xs_talkv(h, iov, ARRAY_SIZE(iov), NULL), value);
+}
+
+bool xs_set_domain_quota(struct xs_handle *h, unsigned int domid,
+                        char *quota, unsigned int value)
+{
+       struct xsd_sockmsg msg = { .type = XS_SET_QUOTA };
+       char domid_str[MAX_STRLEN(domid)];
+       char val_str[MAX_STRLEN(value)];
+       struct iovec iov[4];
+
+       snprintf(domid_str, sizeof(domid_str), "%u", domid);
+       snprintf(val_str, sizeof(val_str), "%u", value);
+
+       iov[0].iov_base = &msg;
+       iov[0].iov_len  = sizeof(msg);
+       iov[1].iov_base = domid_str;
+       iov[1].iov_len  = strlen(domid_str) + 1;
+       iov[2].iov_base = quota;
+       iov[2].iov_len  = strlen(quota) + 1;
+       iov[3].iov_base = val_str;
+       iov[3].iov_len  = strlen(val_str) + 1;
+
+       return xs_bool(xs_talkv(h, iov, ARRAY_SIZE(iov), NULL));
+}
+
 char *xs_control_command(struct xs_handle *h, const char *cmd,
                         void *data, unsigned int len)
 {
-- 
2.53.0




 


Rackspace

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