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