diff options
author | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-07-26 15:13:56 +0000 |
---|---|---|
committer | cl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk> | 2005-07-26 15:13:56 +0000 |
commit | e04c630cb24b65d871f061074bea23174cadf841 (patch) | |
tree | 31950e1ab897968f879a0513db58b1f3f9dfe6c9 /tools/xenstore/xenstored_watch.c | |
parent | e08ecc0000058e476a61af2b503ce34580bd63bc (diff) | |
download | xen-e04c630cb24b65d871f061074bea23174cadf841.tar.gz xen-e04c630cb24b65d871f061074bea23174cadf841.tar.bz2 xen-e04c630cb24b65d871f061074bea23174cadf841.zip |
Change from bool indicating blocked to an enum: when watches go
synchronous this makes it easier (because then we have two reasons
to block)
Instead of using return value, use explicit state member inside
struct connection.
Signed-off-by: Rusty Russel <rusty@rustcorp.com.au>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Diffstat (limited to 'tools/xenstore/xenstored_watch.c')
-rw-r--r-- | tools/xenstore/xenstored_watch.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/tools/xenstore/xenstored_watch.c b/tools/xenstore/xenstored_watch.c index 70bfbaa595..205b70399c 100644 --- a/tools/xenstore/xenstored_watch.c +++ b/tools/xenstore/xenstored_watch.c @@ -310,19 +310,23 @@ void check_watch_ack_timeout(void) } } -bool do_watch(struct connection *conn, struct buffered_data *in) +void do_watch(struct connection *conn, struct buffered_data *in) { struct watch *watch; char *vec[3]; bool relative; - if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec)) - return send_error(conn, EINVAL); + if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec)) { + send_error(conn, EINVAL); + return; + } relative = !strstarts(vec[0], "/"); vec[0] = canonicalize(conn, vec[0]); - if (!check_node_perms(conn, vec[0], XS_PERM_READ)) - return send_error(conn, errno); + if (!check_node_perms(conn, vec[0], XS_PERM_READ)) { + send_error(conn, errno); + return; + } watch = talloc(conn, struct watch); watch->node = talloc_strdup(watch, vec[0]); @@ -335,18 +339,22 @@ bool do_watch(struct connection *conn, struct buffered_data *in) insert_watch(watch); talloc_set_destructor(watch, destroy_watch); trace_create(watch, "watch"); - return send_ack(conn, XS_WATCH); + send_ack(conn, XS_WATCH); } -bool do_watch_ack(struct connection *conn, const char *token) +void do_watch_ack(struct connection *conn, const char *token) { struct watch_event *event; - if (!token) - return send_error(conn, EINVAL); + if (!token) { + send_error(conn, EINVAL); + return; + } - if (!conn->waiting_for_ack) - return send_error(conn, ENOENT); + if (!conn->waiting_for_ack) { + send_error(conn, ENOENT); + return; + } event = list_top(&conn->waiting_for_ack->events, struct watch_event, list); @@ -354,21 +362,24 @@ bool do_watch_ack(struct connection *conn, const char *token) if (!streq(conn->waiting_for_ack->token, token)) { /* They're confused: this will cause us to send event again */ conn->waiting_for_ack = NULL; - return send_error(conn, EINVAL); + send_error(conn, EINVAL); + return; } move_event_onwards(event); conn->waiting_for_ack = NULL; - return send_ack(conn, XS_WATCH_ACK); + send_ack(conn, XS_WATCH_ACK); } -bool do_unwatch(struct connection *conn, struct buffered_data *in) +void do_unwatch(struct connection *conn, struct buffered_data *in) { struct watch *watch; char *node, *vec[2]; - if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec)) - return send_error(conn, EINVAL); + if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec)) { + send_error(conn, EINVAL); + return; + } /* We don't need to worry if we're waiting for an ack for the * watch we're deleting: conn->waiting_for_ack was reset by @@ -380,10 +391,11 @@ bool do_unwatch(struct connection *conn, struct buffered_data *in) if (streq(watch->node, node) && streq(watch->token, vec[1])) { talloc_free(watch); - return send_ack(conn, XS_UNWATCH); + send_ack(conn, XS_UNWATCH); + return; } } - return send_error(conn, ENOENT); + send_error(conn, ENOENT); } #ifdef TESTING |