|
@@ -142,6 +142,28 @@ int xs_node_scanf(struct qemu_xs_handle *h, xs_transaction_t tid,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+char *xs_node_read(struct qemu_xs_handle *h, xs_transaction_t tid,
|
|
|
+ unsigned int *len, Error **errp,
|
|
|
+ const char *path_fmt, ...)
|
|
|
+{
|
|
|
+ char *path, *value;
|
|
|
+ va_list ap;
|
|
|
+
|
|
|
+ va_start(ap, path_fmt);
|
|
|
+ path = g_strdup_vprintf(path_fmt, ap);
|
|
|
+ va_end(ap);
|
|
|
+
|
|
|
+ value = qemu_xen_xs_read(h, tid, path, len);
|
|
|
+ trace_xs_node_read(path, value);
|
|
|
+ if (!value) {
|
|
|
+ error_setg_errno(errp, errno, "failed to read from '%s'", path);
|
|
|
+ }
|
|
|
+
|
|
|
+ g_free(path);
|
|
|
+
|
|
|
+ return value;
|
|
|
+}
|
|
|
+
|
|
|
struct qemu_xs_watch *xs_node_watch(struct qemu_xs_handle *h, const char *node,
|
|
|
const char *key, xs_watch_fn fn,
|
|
|
void *opaque, Error **errp)
|