From mboxrd@z Thu Jan 1 00:00:00 1970 From: lhh@sourceware.org Date: 20 Oct 2006 20:29:40 -0000 Subject: [Cluster-devel] cluster/rgmanager/src/daemons resrules.c Message-ID: <20061020202940.32671.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: lhh at sourceware.org 2006-10-20 20:29:40 Modified files: rgmanager/src/daemons: resrules.c Log message: Compatibility fix for resource agents between linux-cluster and linux-ha Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/daemons/resrules.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.2&r2=1.9.2.3 --- cluster/rgmanager/src/daemons/resrules.c 2005/03/21 22:01:30 1.9.2.2 +++ cluster/rgmanager/src/daemons/resrules.c 2006/10/20 20:29:39 1.9.2.3 @@ -19,10 +19,10 @@ #include #include #include -#include #include #include #include +#include #include #include #include @@ -53,12 +53,6 @@ newrule->rr_type); return -1; } - if (newrule->rr_root && curr->rr_root) { - fprintf(stderr, "Error storing %s: root " - "resource type %s exists already\n", - newrule->rr_type, curr->rr_type); - return -1; - } } while (!list_done(rulelist, curr)); @@ -186,30 +180,6 @@ } -/** - Get and store the root attribute. - - @param doc Pre-parsed XML document pointer. - @param ctx Pre-allocated XML XPath context pointer. - @param base XPath prefix to search - @param rr Resource rule to store new information in. - */ -void -_get_root(xmlDocPtr doc, xmlXPathContextPtr ctx, char *base, - resource_rule_t *rr) -{ - char xpath[256]; - char *ret = NULL; - - snprintf(xpath, sizeof(xpath), "%s/attributes/@root", base); - ret = xpath_get_one(doc, ctx, xpath); - if (ret) { - rr->rr_root = 1; - free(ret); - } -} - - int expand_time(char *val) { @@ -356,8 +326,6 @@ free(act); } while (1); - - } @@ -426,6 +394,48 @@ /** + Take the first unique + required attr and call it the 'primary' attr + for rgmanager. If there's no primary, index 0 becomes the primary attr. + */ +int +choose_primary(resource_attr_t *attrs) +{ + int x = 0, primary = 0; + int flags; + char *name, *val; + + if (!attrs) + return 0; + + for (x = 0; attrs[x].ra_name; x++) { + + if ((attrs[x].ra_flags & (RA_UNIQUE | RA_REQUIRED)) == + (RA_UNIQUE | RA_REQUIRED)) { + primary = x; + break; + } + } + + if (primary != 0) { + flags = attrs[primary].ra_flags | RA_PRIMARY; + name = attrs[primary].ra_name; + val = attrs[primary].ra_value; + + attrs[primary].ra_flags = attrs[0].ra_flags; + attrs[primary].ra_name = attrs[0].ra_name; + attrs[primary].ra_value = attrs[0].ra_value; + + attrs[0].ra_flags = flags; + attrs[0].ra_name = name; + attrs[0].ra_value = val; + } else { + attrs[0].ra_flags |= RA_PRIMARY; + } + + return 0; +} + +/** Store a child type in the child array of a resource rule. XXX Could be rewritten to use list macros. @@ -487,10 +497,7 @@ { int x; - printf("Resource Rules for \"%s\"", rr->rr_type); - if (rr->rr_root) - printf(" [ROOT]"); - printf("\n"); + printf("Resource Rules for \"%s\"\n", rr->rr_type); if (rr->rr_version) printf("OCF API Version: %s\n", rr->rr_version); @@ -551,7 +558,7 @@ children: - printf("Recognized child resource types:\n"); + printf("Explicitly defined child resource types:\n"); if (!rr->rr_childtypes) { printf(" - None -\n\n"); return; @@ -697,6 +704,9 @@ store_attribute(&rr->rr_attrs, attrname, ret, flags); } + if (!primary_found) + choose_primary(rr->rr_attrs); + return 0; } @@ -918,12 +928,11 @@ snprintf(base, sizeof(base), "/resource-agent[%d]/special[@tag=\"rgmanager\"]", ruleid); - _get_root(doc, ctx, base, rr); _get_maxparents(doc, ctx, base, rr); rr->rr_agent = strdup(filename); /* - Second, add the allowable-children fields + Second, add the children fields */ _get_childtypes(doc, ctx, base, rr); @@ -991,6 +1000,10 @@ fn = basename(de->d_name); if (!fn) continue; + + if ((fn != NULL) && (strlen(fn) > 0) && + (fn[strlen(fn)-1] == '~')) + continue; snprintf(path, sizeof(path), "%s/%s", rpath, de->d_name);