From df48485aeab897c50fd792a740d1a5aed4378fc9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 18 Oct 2015 02:57:26 +0200 Subject: peer_group: move to a new header, add recursive lookup macros --- src/peer_group.h | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/peer_group.h (limited to 'src/peer_group.h') diff --git a/src/peer_group.h b/src/peer_group.h new file mode 100644 index 0000000..ce3a2dc --- /dev/null +++ b/src/peer_group.h @@ -0,0 +1,92 @@ +/* + Copyright (c) 2012-2015, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + \file + + Peer groups +*/ + + +#pragma once + +#include "fastd.h" + + +/** + A group of peers + + Peer groups may be nested and form a tree +*/ +struct fastd_peer_group { + fastd_peer_group_t *next; /**< The next sibling in the group tree */ + fastd_peer_group_t *parent; /**< The group's parent group */ + fastd_peer_group_t *children; /**< The group's first child */ + + char *name; /**< The group's name; NULL for the root group */ + fastd_string_stack_t *peer_dirs; /**< List of peer directories which belong to this group */ + + /* constraints */ + int max_connections; /**< The maximum number of connections to allow in this group; -1 for no limit */ + fastd_string_stack_t *methods; /**< The list of configured method names */ +}; + + +/** + Looks up an attribute in the peer group tree + + Returns a pointer to the attribute, going up the group tree to the first group + where the attribute is not NULL if such a group exists. + + @param group the peer group + @param attr the name of the member + + \hideinitializer + */ +#define fastd_peer_group_lookup(group, attr) ({ \ + const fastd_peer_group_t *_grp = (group); \ + \ + while (_grp->parent && !_grp->attr) \ + _grp = _grp->parent; \ + \ + &_grp->attr; \ + }) + +/** + Looks up an attribute in the peer group tree, for a given peer + + Returns a pointer to the attribute, going up the group tree to the first group + where the attribute is not NULL if such a group exists. Uses the default group + if no peer is given. + + @param peer the peer + @param attr the name of the member + + \hideinitializer + */ +#define fastd_peer_group_lookup_peer(peer, attr) ({ \ + const fastd_peer_t *_peer = (peer); \ + _peer ? fastd_peer_group_lookup(_peer->group, attr) : &conf.peer_group->attr; \ + }) -- cgit v1.2.3