2 * Copyright (c) 2018 Citrix Systems Inc.
4 * This work is licensed under the terms of the GNU GPL, version 2 or later.
5 * See the COPYING file in the top-level directory.
8 #include "qemu/osdep.h"
9 #include "hw/xen/xen.h"
10 #include "hw/xen/xen-bus.h"
11 #include "hw/xen/xen-bus-helper.h"
12 #include "qapi/error.h"
15 #include <glib/gprintf.h>
18 enum xenbus_state statenum
;
21 #define XS_STATE(state) { state, #state }
23 static struct xs_state xs_state
[] = {
24 XS_STATE(XenbusStateUnknown
),
25 XS_STATE(XenbusStateInitialising
),
26 XS_STATE(XenbusStateInitWait
),
27 XS_STATE(XenbusStateInitialised
),
28 XS_STATE(XenbusStateConnected
),
29 XS_STATE(XenbusStateClosing
),
30 XS_STATE(XenbusStateClosed
),
31 XS_STATE(XenbusStateReconfiguring
),
32 XS_STATE(XenbusStateReconfigured
),
37 const char *xs_strstate(enum xenbus_state state
)
41 for (i
= 0; i
< ARRAY_SIZE(xs_state
); i
++) {
42 if (xs_state
[i
].statenum
== state
) {
43 return xs_state
[i
].statestr
;
50 void xs_node_create(struct qemu_xs_handle
*h
, xs_transaction_t tid
,
51 const char *node
, unsigned int owner
, unsigned int domid
,
52 unsigned int perms
, Error
**errp
)
54 trace_xs_node_create(node
);
56 if (!qemu_xen_xs_create(h
, tid
, owner
, domid
, perms
, node
)) {
57 error_setg_errno(errp
, errno
, "failed to create node '%s'", node
);
61 void xs_node_destroy(struct qemu_xs_handle
*h
, xs_transaction_t tid
,
62 const char *node
, Error
**errp
)
64 trace_xs_node_destroy(node
);
66 if (!qemu_xen_xs_destroy(h
, tid
, node
)) {
67 error_setg_errno(errp
, errno
, "failed to destroy node '%s'", node
);
71 void xs_node_vprintf(struct qemu_xs_handle
*h
, xs_transaction_t tid
,
72 const char *node
, const char *key
, Error
**errp
,
73 const char *fmt
, va_list ap
)
78 path
= (strlen(node
) != 0) ? g_strdup_printf("%s/%s", node
, key
) :
80 len
= g_vasprintf(&value
, fmt
, ap
);
82 trace_xs_node_vprintf(path
, value
);
84 if (!qemu_xen_xs_write(h
, tid
, path
, value
, len
)) {
85 error_setg_errno(errp
, errno
, "failed to write '%s' to '%s'",
93 void xs_node_printf(struct qemu_xs_handle
*h
, xs_transaction_t tid
,
94 const char *node
, const char *key
, Error
**errp
,
100 xs_node_vprintf(h
, tid
, node
, key
, errp
, fmt
, ap
);
104 int xs_node_vscanf(struct qemu_xs_handle
*h
, xs_transaction_t tid
,
105 const char *node
, const char *key
, Error
**errp
,
106 const char *fmt
, va_list ap
)
111 path
= (strlen(node
) != 0) ? g_strdup_printf("%s/%s", node
, key
) :
113 value
= qemu_xen_xs_read(h
, tid
, path
, NULL
);
115 trace_xs_node_vscanf(path
, value
);
118 rc
= vsscanf(value
, fmt
, ap
);
120 error_setg_errno(errp
, errno
, "failed to read from '%s'",
131 int xs_node_scanf(struct qemu_xs_handle
*h
, xs_transaction_t tid
,
132 const char *node
, const char *key
, Error
**errp
,
133 const char *fmt
, ...)
139 rc
= xs_node_vscanf(h
, tid
, node
, key
, errp
, fmt
, ap
);
145 struct qemu_xs_watch
*xs_node_watch(struct qemu_xs_handle
*h
, const char *node
,
146 const char *key
, xs_watch_fn fn
,
147 void *opaque
, Error
**errp
)
150 struct qemu_xs_watch
*w
;
152 path
= (strlen(node
) != 0) ? g_strdup_printf("%s/%s", node
, key
) :
155 trace_xs_node_watch(path
);
157 w
= qemu_xen_xs_watch(h
, path
, fn
, opaque
);
159 error_setg_errno(errp
, errno
, "failed to watch node '%s'", path
);
167 void xs_node_unwatch(struct qemu_xs_handle
*h
, struct qemu_xs_watch
*w
)
169 qemu_xen_xs_unwatch(h
, w
);