From mboxrd@z Thu Jan 1 00:00:00 1970 From: mgrac@sourceware.org Date: 22 Jun 2007 08:40:21 -0000 Subject: [Cluster-devel] cluster/rgmanager ChangeLog src/daemons/reslist.c Message-ID: <20070622084021.1238.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: RHEL4 Changes by: mgrac at sourceware.org 2007-06-22 08:40:20 Modified files: rgmanager : ChangeLog rgmanager/src/daemons: reslist.c Log message: Fix: #245171 (same patch as in #231521 for RHEL5) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/ChangeLog.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.2.25&r2=1.5.2.26 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/reslist.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.6.2.10&r2=1.6.2.11 --- cluster/rgmanager/ChangeLog 2007/05/03 15:02:45 1.5.2.25 +++ cluster/rgmanager/ChangeLog 2007/06/22 08:40:20 1.5.2.26 @@ -1,3 +1,7 @@ +2007-06-22 Marek Grac + * src/daemons/reslist.c: Apply patch from Lon (same as in RHEL5) to + fix #245171 attr inheritance should try all direct ancestors. + 2007-05-03 Lon Hohberger * Merge patch from Crosswalk development team: * Scott Cannata --- cluster/rgmanager/src/daemons/reslist.c 2007/03/20 19:40:06 1.6.2.10 +++ cluster/rgmanager/src/daemons/reslist.c 2007/06/22 08:40:20 1.6.2.11 @@ -73,17 +73,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; @@ -102,28 +112,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.