diff options
Diffstat (limited to 'tools/xenstore/xenstored_core.h')
-rw-r--r-- | tools/xenstore/xenstored_core.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h new file mode 100644 index 0000000000..fe6eec8f72 --- /dev/null +++ b/tools/xenstore/xenstored_core.h @@ -0,0 +1,123 @@ +/* + Internal interfaces for Xen Store Daemon. + Copyright (C) 2005 Rusty Russell IBM Corporation + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ +#ifndef _XENSTORED_INTERNAL_H +#define _XENSTORED_INTERNAL_H +#include <stdbool.h> +#include <stdint.h> +#include <errno.h> +#include "xs_lib.h" +#include "xenstored.h" +#include "list.h" + +struct buffered_data +{ + /* Are we still doing the header? */ + bool inhdr; + /* How far are we? */ + unsigned int used; + union { + struct xsd_sockmsg msg; + char raw[sizeof(struct xsd_sockmsg)]; + } hdr; + /* The actual data. */ + char *buffer; +}; + +struct connection; +typedef int connwritefn_t(struct connection *, const void *, unsigned int); +typedef int connreadfn_t(struct connection *, void *, unsigned int); + +struct connection +{ + struct list_head list; + + /* The file descriptor we came in on. */ + int fd; + + /* Who am I? 0 for socket connections. */ + domid_t id; + + /* Are we blocked waiting for a transaction to end? Contains node. */ + char *blocked; + + /* Our current event. If all used, we're waiting for ack. */ + struct watch_event *event; + + /* Buffered incoming data. */ + struct buffered_data *in; + + /* Buffered output data */ + struct buffered_data *out; + + /* If we had a watch fire outgoing when we needed to reply... */ + struct buffered_data *waiting_reply; + + /* My transaction, if any. */ + struct transaction *transaction; + + /* The domain I'm associated with, if any. */ + struct domain *domain; + + /* Methods for communicating over this connection: write can be NULL */ + connwritefn_t *write; + connreadfn_t *read; +}; + +/* Return length of string (including nul) at this offset. */ +unsigned int get_string(const struct buffered_data *data, + unsigned int offset); + +/* Break input into vectors, return the number, fill in up to num of them. */ +unsigned int get_strings(struct buffered_data *data, + char *vec[], unsigned int num); + +/* Is child node a child or equal to parent node? */ +bool is_child(const char *child, const char *parent); + +/* Create a new buffer with lifetime of context. */ +struct buffered_data *new_buffer(void *ctx); + +bool send_reply(struct connection *conn, enum xsd_sockmsg_type type, + const void *data, unsigned int len); + +/* Some routines (write, mkdir, etc) just need a non-error return */ +bool send_ack(struct connection *conn, enum xsd_sockmsg_type type); + +/* Send an error: error is usually "errno". */ +bool send_error(struct connection *conn, int error); + +/* Check permissions on this node. */ +bool check_node_perms(struct connection *conn, const char *node, + enum xs_perm_type perm); + +/* Path to this node outside transaction. */ +char *node_dir_outside_transaction(const char *node); + +/* Fail due to excessive corruption, capitalist pigdogs! */ +void __attribute__((noreturn)) corrupt(struct connection *conn, + const char *fmt, ...); + +struct connection *new_connection(connwritefn_t *write, connreadfn_t *read); + +void handle_input(struct connection *conn); +void handle_output(struct connection *conn); + +/* Convenient talloc-style destructor for paths. */ +int destroy_path(void *path); +#endif /* _XENSTORED_INTERNAL_H */ |