From: Andre Noll Date: Sun, 8 Apr 2012 19:31:10 +0000 (+0200) Subject: btr_exec_up(): Also ask given node. X-Git-Tag: v0.4.11~1^2 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=146316482306dc68ca4ecb4ff2658d2380a75338;p=paraslash.git btr_exec_up(): Also ask given node. At the moment, the buffer tree walk starts at the parent of the given node. Users of the btr API can not execute a command for a node unless it has at least one child. This unnecessary restriction is removed in this commit by letting the tree walk start at the given node rather than its parent. This actually simplifies the code a bit. --- diff --git a/buffer_tree.c b/buffer_tree.c index c62cbf13..5756898b 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -878,37 +878,36 @@ size_t btr_get_output_queue_size(struct btr_node *btrn) } /** - * Execute a inter-node command on a parent node. + * Execute a inter-node command on the given node or on a parent node. * * \param btrn The node to start looking. * \param command The command to execute. * \param value_result Additional arguments and result value. * - * This function traverses the buffer tree upwards and looks for parent nodes - * of \a btrn that understands \a command. On the first such node the command - * is executed, and the result is stored in \a value_result. + * This function traverses the buffer tree from \a btrn upwards and looks for + * the first node that understands \a command. On this node \a command is + * executed, and the result is stored in \a value_result. * * \return \p -ENOTSUP if no parent node of \a btrn understands \a command. * Otherwise the return value of the command handler is returned. + * + * \sa \ref receiver::execute, filter::execute, writer::execute. */ int btr_exec_up(struct btr_node *btrn, const char *command, char **value_result) { int ret; for (; btrn; btrn = btrn->parent) { - struct btr_node *parent = btrn->parent; - if (!parent) - return -ERRNO_TO_PARA_ERROR(ENOTSUP); - if (!parent->execute) + if (!btrn->execute) continue; - PARA_INFO_LOG("parent: %s, cmd: %s\n", parent->name, command); - ret = parent->execute(parent, command, value_result); + PARA_INFO_LOG("executing %s on %s\n", command, btrn->name); + ret = btrn->execute(btrn, command, value_result); if (ret == -ERRNO_TO_PARA_ERROR(ENOTSUP)) continue; if (ret < 0) return ret; if (value_result && *value_result) - PARA_INFO_LOG("%s(%s): %s\n", command, parent->name, + PARA_INFO_LOG("%s(%s): %s\n", command, btrn->name, *value_result); return 1; }