1 /****************************************************************************** 2 * xenstorevar.h 3 * 4 * Method declarations and structures for accessing the XenStore.h 5 * 6 * Copyright (C) 2005 Rusty Russell, IBM Corporation 7 * Copyright (C) 2005 XenSource Ltd. 8 * Copyright (C) 2009,2010 Spectra Logic Corporation 9 * 10 * This file may be distributed separately from the Linux kernel, or 11 * incorporated into other software packages, subject to the following license: 12 * 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: 19 * 20 * The above copyright notice and this permission notice shall be included in 21 * all copies or substantial portions of the Software. 22 * 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 29 * IN THE SOFTWARE. 30 * 31 * $FreeBSD$ 32 */ 33 34 #ifndef _XEN_XENSTORE_XENSTOREVAR_H 35 #define _XEN_XENSTORE_XENSTOREVAR_H 36 37 #include <sys/queue.h> 38 #include <sys/bus.h> 39 #include <sys/eventhandler.h> 40 #include <sys/malloc.h> 41 #include <sys/sbuf.h> 42 43 #include <machine/stdarg.h> 44 45 #include <xen/xen-os.h> 46 #include <contrib/xen/grant_table.h> 47 #include <contrib/xen/io/xenbus.h> 48 #include <contrib/xen/io/xs_wire.h> 49 50 #include "xenbus_if.h" 51 52 /* XenStore allocations including XenStore data returned to clients. */ 53 MALLOC_DECLARE(M_XENSTORE); 54 55 struct xs_watch; 56 57 typedef void (xs_watch_cb_t)(struct xs_watch *, const char **vec, 58 unsigned int len); 59 60 /* Register callback to watch subtree (node) in the XenStore. */ 61 struct xs_watch 62 { 63 LIST_ENTRY(xs_watch) list; 64 65 /* Path being watched. */ 66 char *node; 67 68 /* Callback (executed in a process context with no locks held). */ 69 xs_watch_cb_t *callback; 70 71 /* Callback client data untouched by the XenStore watch mechanism. */ 72 uintptr_t callback_data; 73 74 /* Maximum number of pending watch events to be delivered. */ 75 unsigned int max_pending; 76 77 /* 78 * Private counter used by xenstore to keep track of the pending 79 * watches. Protected by xs.watch_events_lock. 80 */ 81 unsigned int pending; 82 }; 83 LIST_HEAD(xs_watch_list, xs_watch); 84 85 typedef int (*xs_event_handler_t)(void *); 86 87 struct xs_transaction 88 { 89 uint32_t id; 90 }; 91 92 #define XST_NIL ((struct xs_transaction) { 0 }) 93 94 /** 95 * Check if Xenstore is initialized. 96 * 97 * \return True if initialized, false otherwise. 98 */ 99 bool xs_initialized(void); 100 101 /** 102 * Return xenstore event channel port. 103 * 104 * \return event channel port. 105 */ 106 evtchn_port_t xs_evtchn(void); 107 108 /** 109 * Return xenstore page physical memory address. 110 * 111 * \return xenstore page physical address. 112 */ 113 vm_paddr_t xs_address(void); 114 115 /** 116 * Fetch the contents of a directory in the XenStore. 117 * 118 * \param t The XenStore transaction covering this request. 119 * \param dir The dirname of the path to read. 120 * \param node The basename of the path to read. 121 * \param num The returned number of directory entries. 122 * \param result An array of directory entry strings. 123 * 124 * \return On success, 0. Otherwise an errno value indicating the 125 * type of failure. 126 * 127 * \note The results buffer is malloced and should be free'd by the 128 * caller with 'free(*result, M_XENSTORE)'. 129 */ 130 int xs_directory(struct xs_transaction t, const char *dir, 131 const char *node, unsigned int *num, const char ***result); 132 133 /** 134 * Determine if a path exists in the XenStore. 135 * 136 * \param t The XenStore transaction covering this request. 137 * \param dir The dirname of the path to read. 138 * \param node The basename of the path to read. 139 * 140 * \retval 1 The path exists. 141 * \retval 0 The path does not exist or an error occurred attempting 142 * to make that determination. 143 */ 144 int xs_exists(struct xs_transaction t, const char *dir, const char *node); 145 146 /** 147 * Get the contents of a single "file". Returns the contents in 148 * *result which should be freed with free(*result, M_XENSTORE) after 149 * use. The length of the value in bytes is returned in *len. 150 * 151 * \param t The XenStore transaction covering this request. 152 * \param dir The dirname of the file to read. 153 * \param node The basename of the file to read. 154 * \param len The amount of data read. 155 * \param result The returned contents from this file. 156 * 157 * \return On success, 0. Otherwise an errno value indicating the 158 * type of failure. 159 * 160 * \note The results buffer is malloced and should be free'd by the 161 * caller with 'free(*result, M_XENSTORE)'. 162 */ 163 int xs_read(struct xs_transaction t, const char *dir, 164 const char *node, unsigned int *len, void **result); 165 166 /** 167 * Write to a single file. 168 * 169 * \param t The XenStore transaction covering this request. 170 * \param dir The dirname of the file to write. 171 * \param node The basename of the file to write. 172 * \param string The NUL terminated string of data to write. 173 * 174 * \return On success, 0. Otherwise an errno value indicating the 175 * type of failure. 176 */ 177 int xs_write(struct xs_transaction t, const char *dir, 178 const char *node, const char *string); 179 180 /** 181 * Create a new directory. 182 * 183 * \param t The XenStore transaction covering this request. 184 * \param dir The dirname of the directory to create. 185 * \param node The basename of the directory to create. 186 * 187 * \return On success, 0. Otherwise an errno value indicating the 188 * type of failure. 189 */ 190 int xs_mkdir(struct xs_transaction t, const char *dir, 191 const char *node); 192 193 /** 194 * Remove a file or directory (directories must be empty). 195 * 196 * \param t The XenStore transaction covering this request. 197 * \param dir The dirname of the directory to remove. 198 * \param node The basename of the directory to remove. 199 * 200 * \return On success, 0. Otherwise an errno value indicating the 201 * type of failure. 202 */ 203 int xs_rm(struct xs_transaction t, const char *dir, const char *node); 204 205 /** 206 * Destroy a tree of files rooted at dir/node. 207 * 208 * \param t The XenStore transaction covering this request. 209 * \param dir The dirname of the directory to remove. 210 * \param node The basename of the directory to remove. 211 * 212 * \return On success, 0. Otherwise an errno value indicating the 213 * type of failure. 214 */ 215 int xs_rm_tree(struct xs_transaction t, const char *dir, 216 const char *node); 217 218 /** 219 * Start a transaction. 220 * 221 * Changes by others will not be seen during the lifetime of this 222 * transaction, and changes will not be visible to others until it 223 * is committed (xs_transaction_end). 224 * 225 * \param t The returned transaction. 226 * 227 * \return On success, 0. Otherwise an errno value indicating the 228 * type of failure. 229 */ 230 int xs_transaction_start(struct xs_transaction *t); 231 232 /** 233 * End a transaction. 234 * 235 * \param t The transaction to end/commit. 236 * \param abort If non-zero, the transaction is discarded 237 * instead of committed. 238 * 239 * \return On success, 0. Otherwise an errno value indicating the 240 * type of failure. 241 */ 242 int xs_transaction_end(struct xs_transaction t, int abort); 243 244 /* 245 * Single file read and scanf parsing of the result. 246 * 247 * \param t The XenStore transaction covering this request. 248 * \param dir The dirname of the path to read. 249 * \param node The basename of the path to read. 250 * \param scancountp The number of input values assigned (i.e. the result 251 * of scanf). 252 * \param fmt Scanf format string followed by a variable number of 253 * scanf input arguments. 254 * 255 * \return On success, 0. Otherwise an errno value indicating the 256 * type of failure. 257 */ 258 int xs_scanf(struct xs_transaction t, 259 const char *dir, const char *node, int *scancountp, const char *fmt, ...) 260 __attribute__((format(scanf, 5, 6))); 261 262 /** 263 * Printf formatted write to a XenStore file. 264 * 265 * \param t The XenStore transaction covering this request. 266 * \param dir The dirname of the path to read. 267 * \param node The basename of the path to read. 268 * \param fmt Printf format string followed by a variable number of 269 * printf arguments. 270 * 271 * \return On success, 0. Otherwise an errno value indicating the 272 * type of write failure. 273 */ 274 int xs_printf(struct xs_transaction t, const char *dir, 275 const char *node, const char *fmt, ...) 276 __attribute__((format(printf, 4, 5))); 277 278 /** 279 * va_list version of xenbus_printf(). 280 * 281 * \param t The XenStore transaction covering this request. 282 * \param dir The dirname of the path to read. 283 * \param node The basename of the path to read. 284 * \param fmt Printf format string. 285 * \param ap Va_list of printf arguments. 286 * 287 * \return On success, 0. Otherwise an errno value indicating the 288 * type of write failure. 289 */ 290 int xs_vprintf(struct xs_transaction t, const char *dir, 291 const char *node, const char *fmt, va_list ap); 292 293 /** 294 * Multi-file read within a single directory and scanf parsing of 295 * the results. 296 * 297 * \param t The XenStore transaction covering this request. 298 * \param dir The dirname of the paths to read. 299 * \param ... A variable number of argument triples specifying 300 * the file name, scanf-style format string, and 301 * output variable (pointer to storage of the results). 302 * The last triple in the call must be terminated 303 * will a final NULL argument. A NULL format string 304 * will cause the entire contents of the given file 305 * to be assigned as a NUL terminated, M_XENSTORE heap 306 * backed, string to the output parameter of that tuple. 307 * 308 * \return On success, 0. Otherwise an errno value indicating the 309 * type of read failure. 310 * 311 * Example: 312 * char protocol_abi[64]; 313 * uint32_t ring_ref; 314 * char *dev_type; 315 * int error; 316 * 317 * error = xenbus_gather(XBT_NIL, xenbus_get_node(dev), 318 * "ring-ref", "%" PRIu32, &ring_ref, 319 * "protocol", "%63s", protocol_abi, 320 * "device-type", NULL, &dev_type, 321 * NULL); 322 * 323 * ... 324 * 325 * free(dev_type, M_XENSTORE); 326 */ 327 int xs_gather(struct xs_transaction t, const char *dir, ...); 328 329 /** 330 * Register a XenStore watch. 331 * 332 * XenStore watches allow a client to be notified via a callback (embedded 333 * within the watch object) of changes to an object in the XenStore. 334 * 335 * \param watch An xs_watch struct with it's node and callback fields 336 * properly initialized. 337 * 338 * \return On success, 0. Otherwise an errno value indicating the 339 * type of write failure. EEXIST errors from the XenStore 340 * are supressed, allowing multiple, physically different, 341 * xenbus_watch objects, to watch the same path in the XenStore. 342 */ 343 int xs_register_watch(struct xs_watch *watch); 344 345 /** 346 * Unregister a XenStore watch. 347 * 348 * \param watch An xs_watch object previously used in a successful call 349 * to xs_register_watch(). 350 * 351 * The xs_watch object's node field is not altered by this call. 352 * It is the caller's responsibility to properly dispose of both the 353 * watch object and the data pointed to by watch->node. 354 */ 355 void xs_unregister_watch(struct xs_watch *watch); 356 357 /** 358 * Allocate and return an sbuf containing the XenStore path string 359 * <dir>/<name>. If name is the NUL string, the returned sbuf contains 360 * the path string <dir>. 361 * 362 * \param dir The NUL terminated directory prefix for new path. 363 * \param name The NUL terminated basename for the new path. 364 * 365 * \return A buffer containing the joined path. 366 */ 367 struct sbuf *xs_join(const char *, const char *); 368 369 /** 370 * Lock the xenstore request mutex. 371 */ 372 void xs_lock(void); 373 374 /** 375 * Unlock the xenstore request mutex. 376 */ 377 void xs_unlock(void); 378 379 #endif /* _XEN_XENSTORE_XENSTOREVAR_H */ 380