libxl: libxl-json format and internal functions to get / set it
authorWei Liu <wei.liu2@citrix.com>
Thu, 4 Sep 2014 22:43:10 +0000 (23:43 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Tue, 9 Sep 2014 11:46:23 +0000 (12:46 +0100)
Introduce a new format in libxl userdata store called "libxl-json". This
file format contains JSON version of libxl_domain_config, generated by
libxl. Applications are not supposed to access this file directly.

Two internal functions to get and set libxl_domain_configuration
are also introduced. Also introduce a new error code to indicate
abnormal state that libxl-json config file is empty.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl.h
tools/libxl/libxl_internal.c
tools/libxl/libxl_internal.h
tools/libxl/libxl_types.idl

index 1ca25ae3ff8f29a43c93aaddab7df4a8257cdaa6..dab3a676bd3a6afc201f676cf47d27017c17bffc 100644 (file)
@@ -1223,6 +1223,11 @@ void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
  *  "domain-userdata-lock"  lock file to protect domain userdata in libxl.
  *                          It's a per-domain lock. Applications should
  *                          not touch this file.
+ *  "libxl-json"  libxl_domain_config object in JSON format, generated
+ *                by libxl. Applications should not access this file
+ *                directly. This file is protected by domain-userdata-lock
+ *                for against Read-Modify-Write operation and domain
+ *                destruction.
  *
  * libxl does not enforce the registration of userdata userids or the
  * semantics of the data.  For specifications of the data formats
index edf864b7d2b38d7471d3b9fcd7cecb68f5a22bd4..8ac1c1447ac6a3ffc89f253e9fe8c61c4e8fd63f 100644 (file)
@@ -450,6 +450,62 @@ void libxl__unlock_domain_userdata(libxl__carefd *lock_carefd)
     libxl__carefd_close(lock_carefd);
 }
 
+int libxl__get_domain_configuration(libxl__gc *gc, uint32_t domid,
+                                    libxl_domain_config *d_config)
+{
+    uint8_t *data = NULL;
+    int rc, len;
+
+    rc = libxl__userdata_retrieve(gc, domid, "libxl-json", &data, &len);
+    if (rc) {
+        LOGEV(ERROR, rc,
+              "failed to retrieve domain configuration for domain %d", domid);
+        rc = ERROR_FAIL;
+        goto out;
+    }
+
+    if (len == 0) {
+        /* No logging, not necessary an error from caller's PoV. */
+        rc = ERROR_JSON_CONFIG_EMPTY;
+        goto out;
+    }
+    rc = libxl_domain_config_from_json(CTX, d_config, (const char *)data);
+
+out:
+    free(data);
+    return rc;
+}
+
+int libxl__set_domain_configuration(libxl__gc *gc, uint32_t domid,
+                                    libxl_domain_config *d_config)
+{
+    char *d_config_json;
+    int rc;
+
+    d_config_json = libxl_domain_config_to_json(CTX, d_config);
+    if (!d_config_json) {
+        LOGE(ERROR,
+             "failed to convert domain configuration to JSON for domain %d",
+             domid);
+        rc = ERROR_FAIL;
+        goto out;
+    }
+
+    rc = libxl__userdata_store(gc, domid, "libxl-json",
+                               (const uint8_t *)d_config_json,
+                               strlen(d_config_json) + 1 /* include '\0' */);
+    if (rc) {
+        LOGEV(ERROR, rc, "failed to store domain configuration for domain %d",
+              domid);
+        rc = ERROR_FAIL;
+        goto out;
+    }
+
+out:
+    free(d_config_json);
+    return rc;
+}
+
 /*
  * Local variables:
  * mode: C
index bc89e79e87f1968dac1a4ffb49edd93ebc13ae23..22c564f6e9541819dcd038d8599dba8300832700 100644 (file)
@@ -3238,6 +3238,17 @@ int libxl__cpuid_policy_is_empty(libxl_cpuid_policy_list *pl);
 libxl__carefd *libxl__lock_domain_userdata(libxl__gc *gc, uint32_t domid);
 void libxl__unlock_domain_userdata(libxl__carefd *lock_carefd);
 
+/*
+ * Retrieve / store domain configuration from / to libxl private
+ * data store. The registry entry in libxl private data store
+ * is "libxl-json".
+ * Caller must hold user data lock.
+ */
+int libxl__get_domain_configuration(libxl__gc *gc, uint32_t domid,
+                                    libxl_domain_config *d_config);
+int libxl__set_domain_configuration(libxl__gc *gc, uint32_t domid,
+                                    libxl_domain_config *d_config);
+
 #endif
 
 /*
index 95681d5c91981b790f40308904b648ce4c4c6b94..1cd635ea8ca11aa4ec191bfeabc0b34979b08b62 100644 (file)
@@ -59,6 +59,7 @@ libxl_error = Enumeration("error", [
     (-13, "BUFFERFULL"),
     (-14, "UNKNOWN_CHILD"),
     (-15, "LOCK_FAIL"),
+    (-16, "JSON_CONFIG_EMPTY"),
     ], value_namespace = "")
 
 libxl_domain_type = Enumeration("domain_type", [