[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Change from bool indicating blocked to an enum: when watches go



# HG changeset patch
# User cl349@xxxxxxxxxxxxxxxxxxxx
# Node ID 997b2b07b96df5ddc1e382460c11ba59e11ee970
# Parent  99366b44c42107b04238fbc183385ddae4bb10d5
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@xxxxxxxxxxxxxxx>
Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx>

diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_core.c   Tue Jul 26 15:13:56 2005
@@ -318,7 +318,7 @@
        list_for_each_entry(i, &connections, list) {
                if (i->domain)
                        continue;
-               if (!i->blocked)
+               if (i->state == OK)
                        FD_SET(i->fd, inset);
                if (i->out)
                        FD_SET(i->fd, outset);
@@ -454,8 +454,7 @@
        return i;
 }
 
-/* Returns "false", meaning "connection is not blocked". */
-bool send_reply(struct connection *conn, enum xsd_sockmsg_type type,
+void send_reply(struct connection *conn, enum xsd_sockmsg_type type,
                const void *data, unsigned int len)
 {
        struct buffered_data *bdata;
@@ -476,16 +475,15 @@
                conn->waiting_reply = bdata;
        } else
                conn->out = bdata;
-       return false;
 }
 
 /* Some routines (write, mkdir, etc) just need a non-error return */
-bool send_ack(struct connection *conn, enum xsd_sockmsg_type type)
-{
-       return send_reply(conn, type, "OK", sizeof("OK"));
-}
-
-bool send_error(struct connection *conn, int error)
+void send_ack(struct connection *conn, enum xsd_sockmsg_type type)
+{
+       send_reply(conn, type, "OK", sizeof("OK"));
+}
+
+void send_error(struct connection *conn, int error)
 {
        unsigned int i;
 
@@ -494,7 +492,7 @@
                        corrupt(conn, "Unknown error %i (%s)", error,
                                strerror(error));
 
-       return send_reply(conn, XS_ERROR, xsd_errors[i].errstring,
+       send_reply(conn, XS_ERROR, xsd_errors[i].errstring,
                          strlen(xsd_errors[i].errstring) + 1);
 }
 
@@ -780,7 +778,7 @@
        return false;
 }
 
-static bool send_directory(struct connection *conn, const char *node)
+static void send_directory(struct connection *conn, const char *node)
 {
        char *path, *reply = talloc_strdup(node, "");
        unsigned int reply_len = 0;
@@ -788,13 +786,17 @@
        struct dirent *dirent;
 
        node = canonicalize(conn, node);
-       if (!check_node_perms(conn, node, XS_PERM_READ))
-               return send_error(conn, errno);
+       if (!check_node_perms(conn, node, XS_PERM_READ)) {
+               send_error(conn, errno);
+               return;
+       }
 
        path = node_dir(conn->transaction, node);
        dir = talloc_opendir(path);
-       if (!dir)
-               return send_error(conn, errno);
+       if (!dir) {
+               send_error(conn, errno);
+               return;
+       }
 
        while ((dirent = readdir(*dir)) != NULL) {
                int len = strlen(dirent->d_name) + 1;
@@ -807,32 +809,35 @@
                reply_len += len;
        }
 
-       return send_reply(conn, XS_DIRECTORY, reply, reply_len);
-}
-
-static bool do_read(struct connection *conn, const char *node)
+       send_reply(conn, XS_DIRECTORY, reply, reply_len);
+}
+
+static void do_read(struct connection *conn, const char *node)
 {
        char *value;
        unsigned int size;
        int *fd;
 
        node = canonicalize(conn, node);
-       if (!check_node_perms(conn, node, XS_PERM_READ))
-               return send_error(conn, errno);
+       if (!check_node_perms(conn, node, XS_PERM_READ)) {
+               send_error(conn, errno);
+               return;
+       }
 
        fd = talloc_open(node_datafile(conn->transaction, node), O_RDONLY, 0);
        if (!fd) {
                /* Data file doesn't exist?  We call that a directory */
                if (errno == ENOENT)
                        errno = EISDIR;
-               return send_error(conn, errno);
+               send_error(conn, errno);
+               return;
        }
 
        value = read_all(fd, &size);
        if (!value)
-               return send_error(conn, errno);
-
-       return send_reply(conn, XS_READ, value, size);
+               send_error(conn, errno);
+       else
+               send_reply(conn, XS_READ, value, size);
 }
 
 /* Create a new directory.  Optionally put data in it (if data != NULL) */
@@ -876,7 +881,7 @@
 }
 
 /* path, flags, data... */
-static bool do_write(struct connection *conn, struct buffered_data *in)
+static void do_write(struct connection *conn, struct buffered_data *in)
 {
        unsigned int offset, datalen;
        char *vec[2];
@@ -885,16 +890,20 @@
        struct stat st;
 
        /* Extra "strings" can be created by binary data. */
-       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;
+       }
 
        node = canonicalize(conn, vec[0]);
        if (/*suppress error on write outside transaction*/ 0 &&
-            !within_transaction(conn->transaction, node))
-               return send_error(conn, EROFS);
+           !within_transaction(conn->transaction, node)) {
+               send_error(conn, EROFS);
+               return;
+       }
 
        if (transaction_block(conn, node))
-               return true;
+               return;
 
        offset = strlen(vec[0]) + strlen(vec[1]) + 2;
        datalen = in->used - offset;
@@ -905,32 +914,46 @@
                mode = XS_PERM_WRITE|XS_PERM_CREATE;
        else if (streq(vec[1], XS_WRITE_CREATE_EXCL))
                mode = XS_PERM_WRITE|XS_PERM_CREATE;
-       else
-               return send_error(conn, EINVAL);
-
-       if (!check_node_perms(conn, node, mode))
-               return send_error(conn, errno);
+       else {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+       if (!check_node_perms(conn, node, mode)) {
+               send_error(conn, errno);
+               return;
+       }
 
        if (lstat(node_dir(conn->transaction, node), &st) != 0) {
                /* Does not exist... */
-               if (errno != ENOENT)
-                       return send_error(conn, errno);
+               if (errno != ENOENT) {
+                       send_error(conn, errno);
+                       return;
+               }
 
                /* Not going to create it? */
-               if (!(mode & XS_PERM_CREATE))
-                       return send_error(conn, ENOENT);
-
-               if (!new_directory(conn, node, in->buffer + offset, datalen))
-                       return send_error(conn, errno);
+               if (!(mode & XS_PERM_CREATE)) {
+                       send_error(conn, ENOENT);
+                       return;
+               }
+
+               if (!new_directory(conn, node, in->buffer + offset, datalen)) {
+                       send_error(conn, errno);
+                       return;
+               }
        } else {
                /* Exists... */
-               if (streq(vec[1], XS_WRITE_CREATE_EXCL))
-                       return send_error(conn, EEXIST);
+               if (streq(vec[1], XS_WRITE_CREATE_EXCL)) {
+                       send_error(conn, EEXIST);
+                       return;
+               }
 
                tmppath = tempfile(node_datafile(conn->transaction, node),
                                   in->buffer + offset, datalen);
-               if (!tmppath)
-                       return send_error(conn, errno);
+               if (!tmppath) {
+                       send_error(conn, errno);
+                       return;
+               }
 
                commit_tempfile(tmppath);
        }
@@ -938,163 +961,196 @@
        add_change_node(conn->transaction, node, false);
        send_ack(conn, XS_WRITE);
        fire_watches(conn->transaction, node, false);
-       return false;
-}
-
-static bool do_mkdir(struct connection *conn, const char *node)
+}
+
+static void do_mkdir(struct connection *conn, const char *node)
 {
        node = canonicalize(conn, node);
-       if (!check_node_perms(conn, node, XS_PERM_WRITE|XS_PERM_CREATE))
-               return send_error(conn, errno);
-
-       if (!within_transaction(conn->transaction, node))
-               return send_error(conn, EROFS);
+       if (!check_node_perms(conn, node, XS_PERM_WRITE|XS_PERM_CREATE)) {
+               send_error(conn, errno);
+               return;
+       }
+
+       if (!within_transaction(conn->transaction, node)) {
+               send_error(conn, EROFS);
+               return;
+       }
 
        if (transaction_block(conn, node))
-               return true;
-
-       if (!new_directory(conn, node, NULL, 0))
-               return send_error(conn, errno);
+               return;
+
+       if (!new_directory(conn, node, NULL, 0)) {
+               send_error(conn, errno);
+               return;
+       }
 
        add_change_node(conn->transaction, node, false);
        send_ack(conn, XS_MKDIR);
        fire_watches(conn->transaction, node, false);
-       return false;
-}
-
-static bool do_rm(struct connection *conn, const char *node)
+}
+
+static void do_rm(struct connection *conn, const char *node)
 {
        char *tmppath, *path;
 
        node = canonicalize(conn, node);
-       if (!check_node_perms(conn, node, XS_PERM_WRITE))
-               return send_error(conn, errno);
-
-       if (!within_transaction(conn->transaction, node))
-               return send_error(conn, EROFS);
+       if (!check_node_perms(conn, node, XS_PERM_WRITE)) {
+               send_error(conn, errno);
+               return;
+       }
+
+       if (!within_transaction(conn->transaction, node)) {
+               send_error(conn, EROFS);
+               return;
+       }
 
        if (transaction_block(conn, node))
-               return true;
-
-       if (streq(node, "/"))
-               return send_error(conn, EINVAL);
+               return;
+
+       if (streq(node, "/")) {
+               send_error(conn, EINVAL);
+               return;
+       }
 
        /* We move the directory to temporary name, destructor cleans up. */
        path = node_dir(conn->transaction, node);
        tmppath = talloc_asprintf(node, "%s.tmp", path);
        talloc_set_destructor(tmppath, destroy_path);
 
-       if (rename(path, tmppath) != 0)
-               return send_error(conn, errno);
+       if (rename(path, tmppath) != 0) {
+               send_error(conn, errno);
+               return;
+       }
 
        add_change_node(conn->transaction, node, true);
        send_ack(conn, XS_RM);
        fire_watches(conn->transaction, node, true);
-       return false;
-}
-
-static bool do_get_perms(struct connection *conn, const char *node)
+}
+
+static void do_get_perms(struct connection *conn, const char *node)
 {
        struct xs_permissions *perms;
        char *strings;
        unsigned int len, num;
 
        node = canonicalize(conn, node);
-       if (!check_node_perms(conn, node, XS_PERM_READ))
-               return send_error(conn, errno);
+       if (!check_node_perms(conn, node, XS_PERM_READ)) {
+               send_error(conn, errno);
+               return;
+       }
 
        perms = get_perms(conn->transaction, node, &num);
-       if (!perms)
-               return send_error(conn, errno);
+       if (!perms) {
+               send_error(conn, errno);
+               return;
+       }
 
        strings = perms_to_strings(node, perms, num, &len);
        if (!strings)
-               return send_error(conn, errno);
-
-       return send_reply(conn, XS_GET_PERMS, strings, len);
-}
-
-static bool do_set_perms(struct connection *conn, struct buffered_data *in)
+               send_error(conn, errno);
+       else
+               send_reply(conn, XS_GET_PERMS, strings, len);
+}
+
+static void do_set_perms(struct connection *conn, struct buffered_data *in)
 {
        unsigned int num;
        char *node;
        struct xs_permissions *perms;
 
        num = xs_count_strings(in->buffer, in->used);
-       if (num < 2)
-               return send_error(conn, EINVAL);
+       if (num < 2) {
+               send_error(conn, EINVAL);
+               return;
+       }
 
        /* First arg is node name. */
        node = canonicalize(conn, in->buffer);
        in->buffer += strlen(in->buffer) + 1;
        num--;
 
-       if (!within_transaction(conn->transaction, node))
-               return send_error(conn, EROFS);
+       if (!within_transaction(conn->transaction, node)) {
+               send_error(conn, EROFS);
+               return;
+       }
 
        if (transaction_block(conn, node))
-               return true;
+               return;
 
        /* We must own node to do this (tools can do this too). */
-       if (!check_node_perms(conn, node, XS_PERM_WRITE|XS_PERM_OWNER))
-               return send_error(conn, errno);
+       if (!check_node_perms(conn, node, XS_PERM_WRITE|XS_PERM_OWNER)) {
+               send_error(conn, errno);
+               return;
+       }
 
        perms = talloc_array(node, struct xs_permissions, num);
-       if (!xs_strings_to_perms(perms, num, in->buffer))
-               return send_error(conn, errno);
-
-       if (!set_perms(conn->transaction, node, perms, num))
-               return send_error(conn, errno);
+       if (!xs_strings_to_perms(perms, num, in->buffer)) {
+               send_error(conn, errno);
+               return;
+       }
+
+       if (!set_perms(conn->transaction, node, perms, num)) {
+               send_error(conn, errno);
+               return;
+       }
+
        add_change_node(conn->transaction, node, false);
        send_ack(conn, XS_SET_PERMS);
        fire_watches(conn->transaction, node, false);
-       return false;
 }
 
 /* Process "in" for conn: "in" will vanish after this conversation, so
  * we can talloc off it for temporary variables.  May free "conn".
- * Returns true if can't complete due to block.
  */
-static bool process_message(struct connection *conn, struct buffered_data *in)
+static void process_message(struct connection *conn, struct buffered_data *in)
 {
        switch (in->hdr.msg.type) {
        case XS_DIRECTORY:
-               return send_directory(conn, onearg(in));
+               send_directory(conn, onearg(in));
+               break;
 
        case XS_READ:
-               return do_read(conn, onearg(in));
+               do_read(conn, onearg(in));
+               break;
 
        case XS_WRITE:
-               return do_write(conn, in);
+               do_write(conn, in);
+               break;
 
        case XS_MKDIR:
-               return do_mkdir(conn, onearg(in));
+               do_mkdir(conn, onearg(in));
+               break;
 
        case XS_RM:
-               return do_rm(conn, onearg(in));
+               do_rm(conn, onearg(in));
+               break;
 
        case XS_GET_PERMS:
-               return do_get_perms(conn, onearg(in));
+               do_get_perms(conn, onearg(in));
+               break;
 
        case XS_SET_PERMS:
-               return do_set_perms(conn, in);
+               do_set_perms(conn, in);
+               break;
 
        case XS_SHUTDOWN:
                /* FIXME: Implement gentle shutdown too. */
                /* Only tools can do this. */
-               if (conn->id != 0)
-                       return send_error(conn, EACCES);
-               if (!conn->can_write)
-                       return send_error(conn, EROFS);
+               if (conn->id != 0) {
+                       send_error(conn, EACCES);
+                       break;
+               }
+               if (!conn->can_write) {
+                       send_error(conn, EROFS);
+                       break;
+               }
                send_ack(conn, XS_SHUTDOWN);
                /* Everything hangs off auto-free context, freed at exit. */
                exit(0);
 
        case XS_DEBUG:
-               if (streq(in->buffer, "print")) {
+               if (streq(in->buffer, "print"))
                        xprintf("debug: %s", in->buffer + get_string(in, 0));
-                       return false;
-               }
 #ifdef TESTING
                /* For testing, we allow them to set id. */
                if (streq(in->buffer, "setid")) {
@@ -1107,37 +1163,44 @@
                        failtest = true;
                }
 #endif /* TESTING */
-               return false;
+               break;
 
        case XS_WATCH:
-               return do_watch(conn, in);
+               do_watch(conn, in);
+               break;
 
        case XS_WATCH_ACK:
-               return do_watch_ack(conn, onearg(in));
+               do_watch_ack(conn, onearg(in));
+               break;
 
        case XS_UNWATCH:
-               return do_unwatch(conn, in);
+               do_unwatch(conn, in);
+               break;
 
        case XS_TRANSACTION_START:
-               return do_transaction_start(conn, onearg(in));
+               do_transaction_start(conn, onearg(in));
+               break;
 
        case XS_TRANSACTION_END:
-               return do_transaction_end(conn, onearg(in));
+               do_transaction_end(conn, onearg(in));
+               break;
 
        case XS_INTRODUCE:
-               return do_introduce(conn, in);
+               do_introduce(conn, in);
+               break;
 
        case XS_RELEASE:
-               return do_release(conn, onearg(in));
+               do_release(conn, onearg(in));
+               break;
 
        case XS_GETDOMAINPATH:
-               return do_get_domain_path(conn, onearg(in));
+               do_get_domain_path(conn, onearg(in));
+               break;
 
        case XS_WATCH_EVENT:
        default:
                eprintf("Client unknown operation %i", in->hdr.msg.type);
                send_error(conn, ENOSYS);
-               return false;
        }
 }
 
@@ -1151,6 +1214,8 @@
        struct buffered_data *in = NULL;
        enum xsd_sockmsg_type type = conn->in->hdr.msg.type;
        jmp_buf talloc_fail;
+
+       assert(conn->state == OK);
 
        /* For simplicity, we kill the connection on OOM. */
        talloc_set_fail_handler(out_of_mem, &talloc_fail);
@@ -1174,7 +1239,9 @@
         */
        in = talloc_steal(talloc_autofree_context(), conn->in);
        conn->in = new_buffer(conn);
-       if (process_message(conn, in)) {
+       process_message(conn, in);
+
+       if (conn->state == BLOCKED) {
                /* Blocked by transaction: queue for re-xmit. */
                talloc_free(conn->in);
                conn->in = in;
@@ -1197,7 +1264,7 @@
        int bytes;
        struct buffered_data *in;
 
-       assert(!conn->blocked);
+       assert(conn->state == OK);
        in = conn->in;
 
        /* Not finished header yet? */
@@ -1254,12 +1321,13 @@
        struct connection *i, *tmp;
 
        list_for_each_entry_safe(i, tmp, &connections, list) {
-               if (!i->blocked)
+               if (i->state == OK)
                        continue;
 
-               if (!transaction_covering_node(i->blocked)) {
-                       talloc_free(i->blocked);
-                       i->blocked = NULL;
+               if (!transaction_covering_node(i->blocked_by)) {
+                       talloc_free(i->blocked_by);
+                       i->blocked_by = NULL;
+                       i->state = OK;
                        consider_message(i);
                }
        }
@@ -1281,7 +1349,8 @@
        if (!new)
                return NULL;
 
-       new->blocked = false;
+       new->state = OK;
+       new->blocked_by = NULL;
        new->out = new->waiting_reply = NULL;
        new->fd = -1;
        new->id = 0;
@@ -1358,10 +1427,14 @@
 
        list_for_each_entry(i, &connections, list) {
                printf("Connection %p:\n", i);
+               printf("    state = %s\n",
+                      i->state == OK ? "OK"
+                      : i->state == BLOCKED ? "BLOCKED"
+                      : "INVALID");
                if (i->id)
                        printf("    id = %i\n", i->id);
-               if (i->blocked)
-                       printf("    blocked on = %s\n", i->blocked);
+               if (i->blocked_by)
+                       printf("    blocked on = %s\n", i->blocked_by);
                if (i->waiting_for_ack)
                        printf("    waiting_for_ack TRUE\n");
                if (!i->in->inhdr || i->in->used)
@@ -1418,7 +1491,6 @@
        permfile = talloc_strdup(root, "/tool/xenstored");
        if (!set_perms(NULL, permfile, &perms, 1))
                barf_perror("Could not create permissions on %s", permfile);
-
        talloc_free(root);
        if (mkdir(xs_daemon_transactions(), 0750) != 0)
                barf_perror("Could not create transaction dir %s",
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_core.h
--- a/tools/xenstore/xenstored_core.h   Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_core.h   Tue Jul 26 15:13:56 2005
@@ -47,6 +47,14 @@
 typedef int connwritefn_t(struct connection *, const void *, unsigned int);
 typedef int connreadfn_t(struct connection *, void *, unsigned int);
 
+enum state
+{
+       /* Blocked by transaction. */
+       BLOCKED,
+       /* Completed */
+       OK,
+};
+
 struct connection
 {
        struct list_head list;
@@ -57,8 +65,11 @@
        /* Who am I?  0 for socket connections. */
        domid_t id;
 
-       /* Are we blocked waiting for a transaction to end?  Contains node. */
-       char *blocked;
+       /* Blocked on transaction? */
+       enum state state;
+
+       /* Node we are waiting for (if state == BLOCKED) */
+       char *blocked_by;
 
        /* Is this a read-only connection? */
        bool can_write;
@@ -100,14 +111,14 @@
 /* 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);
+void 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);
+void 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);
+void send_error(struct connection *conn, int error);
 
 /* Canonicalize this path if possible. */
 char *canonicalize(struct connection *conn, const char *node);
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_domain.c Tue Jul 26 15:13:56 2005
@@ -239,7 +239,8 @@
         * careful that handle_input/handle_output can destroy conn.
         */
        while ((domain = find_domain(port)) != NULL) {
-               if (!domain->conn->blocked && buffer_has_input(domain->input))
+               if (domain->conn->state == OK
+                   && buffer_has_input(domain->input))
                        handle_input(domain->conn);
                else if (domain->conn->out
                         && buffer_has_output_room(domain->output))
@@ -287,33 +288,42 @@
 }
 
 /* domid, mfn, evtchn, path */
-bool do_introduce(struct connection *conn, struct buffered_data *in)
+void do_introduce(struct connection *conn, struct buffered_data *in)
 {
        struct domain *domain;
        char *vec[4];
 
-       if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec))
-               return send_error(conn, EINVAL);
-
-       if (conn->id != 0)
-               return send_error(conn, EACCES);
-
-       if (!conn->can_write)
-               return send_error(conn, EROFS);
+       if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec)) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+       if (conn->id != 0) {
+               send_error(conn, EACCES);
+               return;
+       }
+
+       if (!conn->can_write) {
+               send_error(conn, EROFS);
+               return;
+       }
 
        /* Sanity check args. */
-       if ((atoi(vec[2]) <= 0) || !is_valid_nodename(vec[3]))
-               return send_error(conn, EINVAL);
+       if ((atoi(vec[2]) <= 0) || !is_valid_nodename(vec[3])) {
+               send_error(conn, EINVAL);
+               return;
+       }
        /* Hang domain off "in" until we're finished. */
        domain = new_domain(in, atoi(vec[0]), atol(vec[1]), atol(vec[2]),
                            vec[3]);
-       if (!domain)
-               return send_error(conn, errno);
+       if (!domain) {
+               send_error(conn, errno);
+               return;
+       }
 
        /* Now domain belongs to its connection. */
        talloc_steal(domain->conn, domain);
-
-       return send_ack(conn, XS_INTRODUCE);
+       send_ack(conn, XS_INTRODUCE);
 }
 
 static struct domain *find_domain_by_domid(domid_t domid)
@@ -328,39 +338,51 @@
 }
 
 /* domid */
-bool do_release(struct connection *conn, const char *domid_str)
+void do_release(struct connection *conn, const char *domid_str)
 {
        struct domain *domain;
        domid_t domid;
 
-       if (!domid_str)
-               return send_error(conn, EINVAL);
+       if (!domid_str) {
+               send_error(conn, EINVAL);
+               return;
+       }
 
        domid = atoi(domid_str);
-       if (!domid)
-               return send_error(conn, EINVAL);
-
-       if (conn->id != 0)
-               return send_error(conn, EACCES);
+       if (!domid) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+       if (conn->id != 0) {
+               send_error(conn, EACCES);
+               return;
+       }
 
        domain = find_domain_by_domid(domid);
-       if (!domain)
-               return send_error(conn, ENOENT);
-
-       if (!domain->conn)
-               return send_error(conn, EINVAL);
+       if (!domain) {
+               send_error(conn, ENOENT);
+               return;
+       }
+
+       if (!domain->conn) {
+               send_error(conn, EINVAL);
+               return;
+       }
 
        talloc_free(domain->conn);
-       return send_ack(conn, XS_RELEASE);
-}
-
-bool do_get_domain_path(struct connection *conn, const char *domid_str)
+       send_ack(conn, XS_RELEASE);
+}
+
+void do_get_domain_path(struct connection *conn, const char *domid_str)
 {
        struct domain *domain;
        domid_t domid;
 
-       if (!domid_str)
-               return send_error(conn, EINVAL);
+       if (!domid_str) {
+               send_error(conn, EINVAL);
+               return;
+       }
 
        domid = atoi(domid_str);
        if (domid == DOMID_SELF)
@@ -368,11 +390,11 @@
        else
                domain = find_domain_by_domid(domid);
 
-       if (!domain)
-               return send_error(conn, ENOENT);
-
-       return send_reply(conn, XS_GETDOMAINPATH, domain->path,
-                         strlen(domain->path) + 1);
+       if (!domain) 
+               send_error(conn, ENOENT);
+       else
+               send_reply(conn, XS_GETDOMAINPATH, domain->path,
+                          strlen(domain->path) + 1);
 }
 
 static int close_xc_handle(void *_handle)
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_domain.h
--- a/tools/xenstore/xenstored_domain.h Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_domain.h Tue Jul 26 15:13:56 2005
@@ -23,13 +23,13 @@
 void handle_event(int event_fd);
 
 /* domid, mfn, eventchn, path */
-bool do_introduce(struct connection *conn, struct buffered_data *in);
+void do_introduce(struct connection *conn, struct buffered_data *in);
 
 /* domid */
-bool do_release(struct connection *conn, const char *domid_str);
+void do_release(struct connection *conn, const char *domid_str);
 
 /* domid */
-bool do_get_domain_path(struct connection *conn, const char *domid_str);
+void do_get_domain_path(struct connection *conn, const char *domid_str);
 
 /* Returns the event channel handle */
 int domain_init(void);
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_transaction.c
--- a/tools/xenstore/xenstored_transaction.c    Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_transaction.c    Tue Jul 26 15:13:56 2005
@@ -114,7 +114,8 @@
        trans = transaction_covering_node(node);
        if (trans) {
                start_transaction_timeout(trans);
-               conn->blocked = talloc_strdup(conn, node);
+               conn->state = BLOCKED;
+               conn->blocked_by = talloc_strdup(conn, node);
                return true;
        }
        return false;
@@ -239,20 +240,24 @@
        return true;
 }
 
-bool do_transaction_start(struct connection *conn, const char *node)
+void do_transaction_start(struct connection *conn, const char *node)
 {
        struct transaction *transaction;
        char *dir;
 
-       if (conn->transaction)
-               return send_error(conn, EBUSY);
+       if (conn->transaction) {
+               send_error(conn, EBUSY);
+               return;
+       }
 
        node = canonicalize(conn, node);
-       if (!check_node_perms(conn, node, XS_PERM_READ))
-               return send_error(conn, errno);
+       if (!check_node_perms(conn, node, XS_PERM_READ)) {
+               send_error(conn, errno);
+               return;
+       }
 
        if (transaction_block(conn, node))
-               return true;
+               return;
 
        dir = node_dir_outside_transaction(node);
 
@@ -270,12 +275,14 @@
        talloc_set_destructor(transaction, destroy_transaction);
        trace_create(transaction, "transaction");
 
-       if (!copy_dir(dir, transaction->divert))
-               return send_error(conn, errno);
+       if (!copy_dir(dir, transaction->divert)) {
+               send_error(conn, errno);
+               return;
+       }
 
        talloc_steal(conn, transaction);
        conn->transaction = transaction;
-       return send_ack(transaction->conn, XS_TRANSACTION_START);
+       send_ack(transaction->conn, XS_TRANSACTION_START);
 }
 
 static bool commit_transaction(struct transaction *trans)
@@ -301,13 +308,17 @@
        return true;
 }
 
-bool do_transaction_end(struct connection *conn, const char *arg)
-{
-       if (!arg || (!streq(arg, "T") && !streq(arg, "F")))
-               return send_error(conn, EINVAL);
-
-       if (!conn->transaction)
-               return send_error(conn, ENOENT);
+void do_transaction_end(struct connection *conn, const char *arg)
+{
+       if (!arg || (!streq(arg, "T") && !streq(arg, "F"))) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+       if (!conn->transaction) {
+               send_error(conn, ENOENT);
+               return;
+       }
 
        if (streq(arg, "T")) {
                if (conn->transaction->destined_to_fail) {
@@ -322,11 +333,11 @@
 
        talloc_free(conn->transaction);
        conn->transaction = NULL;
-       return send_ack(conn, XS_TRANSACTION_END);
+       send_ack(conn, XS_TRANSACTION_END);
+       return;
 
 failed:
        talloc_free(conn->transaction);
        conn->transaction = NULL;
-       return false;
-}
-
+}
+
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_transaction.h
--- a/tools/xenstore/xenstored_transaction.h    Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_transaction.h    Tue Jul 26 15:13:56 2005
@@ -22,8 +22,8 @@
 
 struct transaction;
 
-bool do_transaction_start(struct connection *conn, const char *node);
-bool do_transaction_end(struct connection *conn, const char *arg);
+void do_transaction_start(struct connection *conn, const char *node);
+void do_transaction_end(struct connection *conn, const char *arg);
 
 /* Is node covered by this transaction? */
 bool within_transaction(struct transaction *trans, const char *node);
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_watch.c
--- a/tools/xenstore/xenstored_watch.c  Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_watch.c  Tue Jul 26 15:13:56 2005
@@ -310,19 +310,23 @@
        }
 }
 
-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 @@
        insert_watch(watch);
        talloc_set_destructor(watch, destroy_watch);
        trace_create(watch, "watch");
-       return send_ack(conn, XS_WATCH);
-}
-
-bool do_watch_ack(struct connection *conn, const char *token)
-{
-       struct watch_event *event;
-
-       if (!token)
-               return send_error(conn, EINVAL);
-
-       if (!conn->waiting_for_ack)
-               return send_error(conn, ENOENT);
+       send_ack(conn, XS_WATCH);
+}
+
+void do_watch_ack(struct connection *conn, const char *token)
+{
+       struct watch_event *event;
+
+       if (!token) {
+               send_error(conn, EINVAL);
+               return;
+       }
+
+       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 @@
        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);
-}
-
-bool do_unwatch(struct connection *conn, struct buffered_data *in)
+       send_ack(conn, XS_WATCH_ACK);
+}
+
+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 @@
 
                if (streq(watch->node, node) && streq(watch->token, vec[1])) {
                        talloc_free(watch);
-                       return send_ack(conn, XS_UNWATCH);
-               }
-       }
-       return send_error(conn, ENOENT);
+                       send_ack(conn, XS_UNWATCH);
+                       return;
+               }
+       }
+       send_error(conn, ENOENT);
 }
 
 #ifdef TESTING
diff -r 99366b44c421 -r 997b2b07b96d tools/xenstore/xenstored_watch.h
--- a/tools/xenstore/xenstored_watch.h  Tue Jul 26 15:09:43 2005
+++ b/tools/xenstore/xenstored_watch.h  Tue Jul 26 15:13:56 2005
@@ -22,9 +22,9 @@
 
 #include "xenstored_core.h"
 
-bool do_watch(struct connection *conn, struct buffered_data *in);
-bool do_watch_ack(struct connection *conn, const char *token);
-bool do_unwatch(struct connection *conn, struct buffered_data *in);
+void do_watch(struct connection *conn, struct buffered_data *in);
+void do_watch_ack(struct connection *conn, const char *token);
+void do_unwatch(struct connection *conn, struct buffered_data *in);
 
 /* Is this a watch event message for this connection? */
 bool is_watch_event(struct connection *conn, struct buffered_data *out);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.