]> xenbits.xensource.com Git - qemu-xen-4.0-testing.git/commitdiff
add per domain low level xenstore functions [PATCH 2/3]
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 21 Jul 2009 14:29:43 +0000 (15:29 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Tue, 21 Jul 2009 14:29:43 +0000 (15:29 +0100)
add per domain low level xenstore functions (read/chmod/write/watch).

This is a series of patch to complete the xenstore interface in qemu.

1: create a callback mecanism for xenstore watches.
2: add per domain low level xenstore functions (read/chmod/write/watch).
3: add low level functions from the root (read/write).

Signed-off-by: Jean Guyader <jean.guyader@citrix.com>
qemu-xen.h
xenstore.c

index 09d0539c39e83bfa1952f7cba361f3421c3e744c..5e30c6104339017fcf8ee7b6e7125fab9742d0a7 100644 (file)
@@ -96,6 +96,11 @@ int xenstore_unsubscribe_from_hotplug_status(struct xs_handle *handle,
 typedef void (*xenstore_callback) (const char *path, void *opaque);
 int xenstore_watch_new_callback(const char *path, xenstore_callback fptr, void *opaque);
 
+char *xenstore_dom_read(int domid, const char *key, unsigned int *len);
+int xenstore_dom_write(int domid, const char *key, const char *value);
+void xenstore_dom_watch(int domid, const char *key, xenstore_callback ftp, void *opaque);
+void xenstore_dom_chmod(int domid, const char *key, const char *perms);
+
  /* `danger' means that this parameter, variable or function refers to
   * an area of xenstore which is writeable by the guest and thus must
   * not be trusted by qemu code.  For variables containing xenstore
index df5d940d8509501ef743663f00fad08fd62a7a89..1ad6dc91421f8995105236c78e6d0e0eecb26818 100644 (file)
@@ -1462,3 +1462,103 @@ void xenstore_store_serial_port_info(int i, CharDriverState *chr,
     if (i == 0) /* serial 0 is also called the console */
         store_dev_info(devname, domid, chr, "/console");
 }
+
+char *xenstore_dom_read(int domid, const char *key, unsigned int *len)
+{
+    char *buf = NULL, *path = NULL, *value = NULL;
+
+    if (xsh == NULL)
+        goto out;
+
+    path = xs_get_domain_path(xsh, domid);
+    if (path == NULL) {
+        fprintf(logfile, "xs_get_domain_path(%d): error\n", domid);
+        goto out;
+    }
+
+    pasprintf(&buf, "%s/%s", path, key);
+    value = xs_read(xsh, XBT_NULL, buf, len);
+    if (value == NULL) {
+        fprintf(logfile, "xs_read(%s): read error\n", buf);
+        goto out;
+    }
+
+ out:
+    free(path);
+    free(buf);
+    return value;
+}
+
+void xenstore_dom_watch(int domid, const char *key, xenstore_callback fptr, void *opaque)
+{
+    char *buf = NULL, *path = NULL;
+    int rc = -1;
+
+    if (xsh == NULL)
+        goto out;
+
+    path = xs_get_domain_path(xsh, domid);
+    if (path == NULL) {
+        fprintf(logfile, "xs_get_domain_path: error\n");
+        goto out;
+    }
+
+    pasprintf(&buf, "%s/%s", path, key);
+    xenstore_watch_new_callback(buf, fptr, opaque);
+
+ out:
+    free(path);
+    free(buf);
+}
+
+void xenstore_dom_chmod(int domid, const char *key, const char *perms)
+{
+    char *buf = NULL, *path = NULL;
+    int rc = -1;
+       struct xs_permissions p;
+
+    if (xsh == NULL)
+        goto out;
+
+    path = xs_get_domain_path(xsh, domid);
+    if (path == NULL) {
+        fprintf(logfile, "xs_get_domain_path: error\n");
+        goto out;
+    }
+
+    pasprintf(&buf, "%s/%s", path, key);
+
+       xs_strings_to_perms(&p, 1, perms);
+       xs_set_permissions(xsh, XBT_NULL, buf, &p, 1);
+
+ out:
+    free(path);
+    free(buf);
+}
+
+int xenstore_dom_write(int domid, const char *key, const char *value)
+{
+    char *buf = NULL, *path = NULL;
+    int rc = -1;
+
+    if (xsh == NULL)
+        goto out;
+
+    path = xs_get_domain_path(xsh, domid);
+    if (path == NULL) {
+        fprintf(logfile, "xs_get_domain_path: error\n");
+        goto out;
+    }
+
+    pasprintf(&buf, "%s/%s", path, key);
+    rc = xs_write(xsh, XBT_NULL, buf, value, strlen(value));
+    if (rc == 0) {
+        fprintf(logfile, "xs_write(%s, %s): write error\n", buf, key);
+        goto out;
+    }
+
+ out:
+    free(path);
+    free(buf);
+    return rc;
+}