From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 26 Apr 2007 20:40:29 -0000 Subject: [Cluster-devel] cluster/rgmanager ChangeLog src/daemons/reslist.c Message-ID: <20070426204029.6081.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL5 Changes by: lhh at sourceware.org 2007-04-26 21:40:28 Modified files: rgmanager : ChangeLog rgmanager/src/daemons: reslist.c Log message: Fix #231521 Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.31.2.4&r2=1.31.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/reslist.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.14.2.2&r2=1.14.2.3 --- cluster/rgmanager/ChangeLog 2007/04/19 20:21:34 1.31.2.4 +++ cluster/rgmanager/ChangeLog 2007/04/26 20:40:28 1.31.2.5 @@ -1,3 +1,7 @@ +2007-04-26 Lon Hohberger + * src/daemons/reslist.c: Try all direct ancestors while + performing run-time inheritance resolution #231521 + 2007-04-19 Lon Hohberger * src/daemons/groups.c, rg_state.c: Apply patch from Andrey Mirkin to fix bug #237144; prevents exclusive services from --- cluster/rgmanager/src/daemons/reslist.c 2007/03/23 00:06:34 1.14.2.2 +++ cluster/rgmanager/src/daemons/reslist.c 2007/04/26 20:40:28 1.14.2.3 @@ -79,17 +79,27 @@ @param node Resource tree node to look examine @param attrname Attribute to retrieve. + @param ptype Resource type to look for (if inheritance) @return value of attribute or NULL if not found */ -char * -attr_value(resource_node_t *node, char *attrname) +static char * +_attr_value(resource_node_t *node, char *attrname, char *ptype) { - resource_t *res = node->rn_resource; + resource_t *res; resource_attr_t *ra; - char *c, *p_type; + char *c, p_type[32]; ssize_t len; int x; + if (!node) + return NULL; + + res = node->rn_resource; + + /* Go up the tree if it's not the right parent type */ + if (ptype && strcmp(res->r_rule->rr_type, ptype)) + return _attr_value(node->rn_parent, attrname, ptype); + for (x = 0; res->r_attrs && res->r_attrs[x].ra_name; x++) { if (strcmp(attrname, res->r_attrs[x].ra_name)) continue; @@ -108,28 +118,29 @@ if (!c) { /* Someone doesn't care or uses older semantics on inheritance */ - return attr_value(node->rn_parent, ra->ra_value); + return _attr_value(node->rn_parent, ra->ra_value, + NULL); } - - p_type = node->rn_parent->rn_resource->r_rule->rr_type; + len = (c - ra->ra_value); - - /* Different sizes? */ - if (strlen(p_type) != len) - return NULL; - - /* Check for parent type match */ - if (strncmp(p_type, ra->ra_value, len) != 0) - return NULL; - + memset(p_type, 0, sizeof(p_type)); + memcpy(p_type, ra->ra_value, len); + /* Skip the "%" and recurse */ - return attr_value(node->rn_parent, ++c); + return _attr_value(node->rn_parent, ++c, p_type); } return NULL; } +char * +attr_value(resource_node_t *node, char *attrname) +{ + return _attr_value(node, attrname, NULL); +} + + /** Run to the top of the tree. Used to determine certain attributes of the resource group in-line, during resource tree operations.