1 /******************************************************************************
4 * Method declarations and structures for accessing the XenStore.h
6 * Copyright (C) 2005 Rusty Russell, IBM Corporation
7 * Copyright (C) 2005 XenSource Ltd.
8 * Copyright (C) 2009,2010 Spectra Logic Corporation
10 * This file may be distributed separately from the Linux kernel, or
11 * incorporated into other software packages, subject to the following license:
13 * Permission is hereby granted, free of charge, to any person obtaining a copy
14 * of this source file (the "Software"), to deal in the Software without
15 * restriction, including without limitation the rights to use, copy, modify,
16 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
17 * and to permit persons to whom the Software is furnished to do so, subject to
18 * the following conditions:
20 * The above copyright notice and this permission notice shall be included in
21 * all copies or substantial portions of the Software.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
34 #ifndef _XEN_XENSTORE_XENSTOREVAR_H
35 #define _XEN_XENSTORE_XENSTOREVAR_H
37 #include <sys/queue.h>
39 #include <sys/eventhandler.h>
40 #include <sys/malloc.h>
43 #include <machine/stdarg.h>
44 #include <machine/xen/xen-os.h>
46 #include <xen/interface/grant_table.h>
47 #include <xen/interface/io/xenbus.h>
48 #include <xen/interface/io/xs_wire.h>
50 #include "xenbus_if.h"
52 /* XenStore allocations including XenStore data returned to clients. */
53 MALLOC_DECLARE(M_XENSTORE);
55 struct xenstore_domain_interface;
57 extern struct xenstore_domain_interface *xen_store;
59 typedef void (xs_watch_cb_t)(struct xs_watch *,
60 const char **vec, unsigned int len);
62 /* Register callback to watch subtree (node) in the XenStore. */
65 LIST_ENTRY(xs_watch) list;
67 /* Path being watched. */
70 /* Callback (executed in a process context with no locks held). */
71 xs_watch_cb_t *callback;
73 LIST_HEAD(xs_watch_list, xs_watch);
75 typedef int (*xs_event_handler_t)(void *);
82 #define XST_NIL ((struct xs_transaction) { 0 })
85 * Fetch the contents of a directory in the XenStore.
87 * \param t The XenStore transaction covering this request.
88 * \param dir The dirname of the path to read.
89 * \param node The basename of the path to read.
90 * \param num The returned number of directory entries.
91 * \param result An array of directory entry strings.
93 * \return On success, 0. Otherwise an errno value indicating the
96 * \note The results buffer is malloced and should be free'd by the
97 * caller with 'free(*result, M_XENSTORE)'.
99 int xs_directory(struct xs_transaction t, const char *dir,
100 const char *node, unsigned int *num, const char ***result);
103 * Determine if a path exists in the XenStore.
105 * \param t The XenStore transaction covering this request.
106 * \param dir The dirname of the path to read.
107 * \param node The basename of the path to read.
109 * \retval 1 The path exists.
110 * \retval 0 The path does not exist or an error occurred attempting
111 * to make that determination.
113 int xs_exists(struct xs_transaction t, const char *dir, const char *node);
116 * Get the contents of a single "file". Returns the contents in
117 * *result which should be freed with free(*result, M_XENSTORE) after
118 * use. The length of the value in bytes is returned in *len.
120 * \param t The XenStore transaction covering this request.
121 * \param dir The dirname of the file to read.
122 * \param node The basename of the file to read.
123 * \param len The amount of data read.
124 * \param result The returned contents from this file.
126 * \return On success, 0. Otherwise an errno value indicating the
129 * \note The results buffer is malloced and should be free'd by the
130 * caller with 'free(*result, M_XENSTORE)'.
132 int xs_read(struct xs_transaction t, const char *dir,
133 const char *node, unsigned int *len, void **result);
136 * Write to a single file.
138 * \param t The XenStore transaction covering this request.
139 * \param dir The dirname of the file to write.
140 * \param node The basename of the file to write.
141 * \param string The NUL terminated string of data to write.
143 * \return On success, 0. Otherwise an errno value indicating the
146 int xs_write(struct xs_transaction t, const char *dir,
147 const char *node, const char *string);
150 * Create a new directory.
152 * \param t The XenStore transaction covering this request.
153 * \param dir The dirname of the directory to create.
154 * \param node The basename of the directory to create.
156 * \return On success, 0. Otherwise an errno value indicating the
159 int xs_mkdir(struct xs_transaction t, const char *dir,
163 * Remove a file or directory (directories must be empty).
165 * \param t The XenStore transaction covering this request.
166 * \param dir The dirname of the directory to remove.
167 * \param node The basename of the directory to remove.
169 * \return On success, 0. Otherwise an errno value indicating the
172 int xs_rm(struct xs_transaction t, const char *dir, const char *node);
175 * Destroy a tree of files rooted at dir/node.
177 * \param t The XenStore transaction covering this request.
178 * \param dir The dirname of the directory to remove.
179 * \param node The basename of the directory to remove.
181 * \return On success, 0. Otherwise an errno value indicating the
184 int xs_rm_tree(struct xs_transaction t, const char *dir,
188 * Start a transaction.
190 * Changes by others will not be seen during the lifetime of this
191 * transaction, and changes will not be visible to others until it
192 * is committed (xs_transaction_end).
194 * \param t The returned transaction.
196 * \return On success, 0. Otherwise an errno value indicating the
199 int xs_transaction_start(struct xs_transaction *t);
204 * \param t The transaction to end/commit.
205 * \param abort If non-zero, the transaction is discarded
206 * instead of committed.
208 * \return On success, 0. Otherwise an errno value indicating the
211 int xs_transaction_end(struct xs_transaction t, int abort);
214 * Single file read and scanf parsing of the result.
216 * \param t The XenStore transaction covering this request.
217 * \param dir The dirname of the path to read.
218 * \param node The basename of the path to read.
219 * \param scancountp The number of input values assigned (i.e. the result
221 * \param fmt Scanf format string followed by a variable number of
222 * scanf input arguments.
224 * \return On success, 0. Otherwise an errno value indicating the
227 int xs_scanf(struct xs_transaction t,
228 const char *dir, const char *node, int *scancountp, const char *fmt, ...)
229 __attribute__((format(scanf, 5, 6)));
232 * Printf formatted write to a XenStore file.
234 * \param t The XenStore transaction covering this request.
235 * \param dir The dirname of the path to read.
236 * \param node The basename of the path to read.
237 * \param fmt Printf format string followed by a variable number of
240 * \return On success, 0. Otherwise an errno value indicating the
241 * type of write failure.
243 int xs_printf(struct xs_transaction t, const char *dir,
244 const char *node, const char *fmt, ...)
245 __attribute__((format(printf, 4, 5)));
248 * va_list version of xenbus_printf().
250 * \param t The XenStore transaction covering this request.
251 * \param dir The dirname of the path to read.
252 * \param node The basename of the path to read.
253 * \param fmt Printf format string.
254 * \param ap Va_list of printf arguments.
256 * \return On success, 0. Otherwise an errno value indicating the
257 * type of write failure.
259 int xs_vprintf(struct xs_transaction t, const char *dir,
260 const char *node, const char *fmt, va_list ap);
263 * Multi-file read within a single directory and scanf parsing of
266 * \param t The XenStore transaction covering this request.
267 * \param dir The dirname of the paths to read.
268 * \param ... A variable number of argument triples specifying
269 * the file name, scanf-style format string, and
270 * output variable (pointer to storage of the results).
271 * The last triple in the call must be terminated
272 * will a final NULL argument. A NULL format string
273 * will cause the entire contents of the given file
274 * to be assigned as a NUL terminated, M_XENSTORE heap
275 * backed, string to the output parameter of that tuple.
277 * \return On success, 0. Otherwise an errno value indicating the
278 * type of read failure.
281 * char protocol_abi[64];
286 * error = xenbus_gather(XBT_NIL, xenbus_get_node(dev),
287 * "ring-ref", "%" PRIu32, &ring_ref,
288 * "protocol", "%63s", protocol_abi,
289 * "device-type", NULL, &dev_type,
294 * free(dev_type, M_XENSTORE);
296 int xs_gather(struct xs_transaction t, const char *dir, ...);
299 * Register a XenStore watch.
301 * XenStore watches allow a client to be notified via a callback (embedded
302 * within the watch object) of changes to an object in the XenStore.
304 * \param watch A xenbus_watch struct with it's node and callback fields
305 * properly initialized.
307 * \return On success, 0. Otherwise an errno value indicating the
308 * type of write failure. EEXIST errors from the XenStore
309 * are supressed, allowing multiple, physically different,
310 * xenbus_watch objects, to watch the same path in the XenStore.
312 int xs_register_watch(struct xs_watch *watch);
315 * Unregister a XenStore watch.
317 * \param watch An xs_watch object previously used in a successful call
318 * to xs_register_watch().
320 * The xs_watch object's node field is not altered by this call.
321 * It is the caller's responsibility to properly dispose of both the
322 * watch object and the data pointed to by watch->node.
324 void xs_unregister_watch(struct xs_watch *watch);
327 * Allocate and return an sbuf containing the XenStore path string
328 * <dir>/<name>. If name is the NUL string, the returned sbuf contains
329 * the path string <dir>.
331 * \param dir The NUL terminated directory prefix for new path.
332 * \param name The NUL terminated basename for the new path.
334 * \return A buffer containing the joined path.
336 struct sbuf *xs_join(const char *, const char *);
338 #endif /* _XEN_XENSTORE_XENSTOREVAR_H */