Cedric, this is the first I have heard of this. Of course the patch will be included, once it has been through quality control.
M On Tue, 2005-08-30 at 14:21 +0200, Cedric Ware wrote: > Hello, > > Last month, I reported a problem in cfengine, that CFALLCLASSES > was not set when calling an external module via PrepModule, cf: > http://lists.gnu.org/archive/html/help-cfengine/2005-07/msg00025.html > > The problem was that for a module called via PrepModule, the function > CheckForModule (called from functions.c) isn't preceded by a call to > BuildClassEnvironment, as it is for a module in the actionsequence, > where CheckForModule is called from cfagent.c. > > A colleague of mine wrote the patch below, against cfengine 2.1.14, > which moves BuildClassEnvironment from cfagent.c to functions.c and > adds the call before CheckForModule in functions.c. I have been > using it for a few weeks, seemingly without problems. I think it > applies cleanly to cfengine 2.1.15. > > Shouldn't it be integrated in future versions? > > Thank you, > Cedric Ware. > > diff -bBur cfengine-2.1.14/src/cfagent.c cfengine/src/cfagent.c > --- cfengine-2.1.14/src/cfagent.c 2005-07-09 15:42:57.000000000 +0200 > +++ cfengine/src/cfagent.c 2005-07-09 16:00:19.000000000 +0200 > @@ -51,7 +51,10 @@ > enum aseq EvaluateAction ARGLIST((char *action, struct Item **classlist, int > pass)); > void CheckOpts ARGLIST((int argc, char **argv)); > int GetResource ARGLIST((char *var)); > -void BuildClassEnvironment ARGLIST((void)); > +/* moved to functions.c > + void BuildClassEnvironment ARGLIST((void)); > +*/ > + > void Syntax ARGLIST((void)); > void EmptyActionSequence ARGLIST((void)); > void GetEnvironment ARGLIST((void)); > @@ -1880,95 +1883,6 @@ > > /*******************************************************************/ > > -void BuildClassEnvironment() > - > -{ struct Item *ip; > - int size = 0; > - char file[CF_BUFSIZE], *sp; > - FILE *fp; > - > -Debug("(BuildClassEnvironment)\n"); > - > -snprintf(ALLCLASSBUFFER,CF_BUFSIZE,"%s=",CF_ALLCLASSESVAR); > - > -if (!IsPrivileged()) > - { > - Verbose("\n(Non privileged user...)\n\n"); > - > - if ((sp = getenv("HOME")) == NULL) > - { > - FatalError("You do not have a HOME variable pointing to your home > directory"); > - } > - > - snprintf(file,CF_BUFSIZE,"%s/.cfagent/allclasses",sp); > - } > -else > - { > - snprintf(file,CF_BUFSIZE,"%s/state/allclasses",WORKDIR); > - } > - > - > -if ((fp = fopen(file,"w")) == NULL) > - { > - CfLog(cfinform,"Could not open allclasses cache file",""); > - return; > - } > - > -for (ip = VHEAP; ip != NULL; ip=ip->next) > - { > - if (IsDefinedClass(ip->name)) > - { > - if ((size += strlen(ip->name)) > CF_ALLCLASSSIZE - CF_BUFFERMARGIN) > - { > - Verbose("Class buffer overflowed, dumping class environment for > modules\n"); > - Verbose("This would probably crash the exec interface on most > machines\n"); > - } > - else > - { > - size++; /* Allow for : separator */ > - strcat(ALLCLASSBUFFER,ip->name); > - strcat(ALLCLASSBUFFER,":"); > - } > - > - fprintf(fp,"%s\n",ip->name); > - } > - } > - > - for (ip = VALLADDCLASSES; ip != NULL; ip=ip->next) > - { > - if (IsDefinedClass(ip->name)) > - { > - if ((size += strlen(ip->name)) > 4*CF_BUFSIZE - CF_BUFFERMARGIN) > - { > - Verbose("Class buffer overflowed, dumping class environment for > modules\n"); > - Verbose("This would probably crash the exec interface on most > machines\n"); > - } > - else > - { > - size++; /* Allow for : separator */ > - strcat(ALLCLASSBUFFER,ip->name); > - strcat(ALLCLASSBUFFER,":"); > - } > - > - fprintf(fp,"%s\n",ip->name); > - } > - } > - > - Debug2("---\nENVIRONMENT: %s\n---\n",ALLCLASSBUFFER); > - > - if (USEENVIRON) > - { > - if (putenv(ALLCLASSBUFFER) == -1) > - { > - perror("putenv"); > - } > - } > - > - fclose(fp); > -} > - > -/*******************************************************************/ > - > void Syntax() > > { int i; > diff -bBur cfengine-2.1.14/src/functions.c cfengine/src/functions.c > --- cfengine-2.1.14/src/functions.c 2005-07-09 15:42:57.000000000 +0200 > +++ cfengine/src/functions.c 2005-07-09 16:00:11.000000000 +0200 > @@ -1718,6 +1718,8 @@ > > Debug("PrepModule(%s,%s)\n",argv[0],argv[1]); > > +BuildClassEnvironment(); > + > if (CheckForModule(argv[0],argv[1])) > { > strcpy(value,CF_ANYCLASS); > @@ -1825,3 +1827,92 @@ > return true; > } > > +/*******************************************************************/ > + > +void BuildClassEnvironment() > + > +{ struct Item *ip; > + int size = 0; > + char file[CF_BUFSIZE], *sp; > + FILE *fp; > + > +Debug("(BuildClassEnvironment)\n"); > + > +snprintf(ALLCLASSBUFFER,CF_BUFSIZE,"%s=",CF_ALLCLASSESVAR); > + > +if (!IsPrivileged()) > + { > + Verbose("\n(Non privileged user...)\n\n"); > + > + if ((sp = getenv("HOME")) == NULL) > + { > + FatalError("You do not have a HOME variable pointing to your home > directory"); > + } > + > + snprintf(file,CF_BUFSIZE,"%s/.cfagent/allclasses",sp); > + } > +else > + { > + snprintf(file,CF_BUFSIZE,"%s/state/allclasses",WORKDIR); > + } > + > + > +if ((fp = fopen(file,"w")) == NULL) > + { > + CfLog(cfinform,"Could not open allclasses cache file",""); > + return; > + } > + > +for (ip = VHEAP; ip != NULL; ip=ip->next) > + { > + if (IsDefinedClass(ip->name)) > + { > + if ((size += strlen(ip->name)) > CF_ALLCLASSSIZE - CF_BUFFERMARGIN) > + { > + Verbose("Class buffer overflowed, dumping class environment for > modules\n"); > + Verbose("This would probably crash the exec interface on most > machines\n"); > + } > + else > + { > + size++; /* Allow for : separator */ > + strcat(ALLCLASSBUFFER,ip->name); > + strcat(ALLCLASSBUFFER,":"); > + } > + > + fprintf(fp,"%s\n",ip->name); > + } > + } > + > + for (ip = VALLADDCLASSES; ip != NULL; ip=ip->next) > + { > + if (IsDefinedClass(ip->name)) > + { > + if ((size += strlen(ip->name)) > 4*CF_BUFSIZE - CF_BUFFERMARGIN) > + { > + Verbose("Class buffer overflowed, dumping class environment for > modules\n"); > + Verbose("This would probably crash the exec interface on most > machines\n"); > + } > + else > + { > + size++; /* Allow for : separator */ > + strcat(ALLCLASSBUFFER,ip->name); > + strcat(ALLCLASSBUFFER,":"); > + } > + > + fprintf(fp,"%s\n",ip->name); > + } > + } > + > + Debug2("---\nENVIRONMENT: %s\n---\n",ALLCLASSBUFFER); > + > + if (USEENVIRON) > + { > + if (putenv(ALLCLASSBUFFER) == -1) > + { > + perror("putenv"); > + } > + } > + > + fclose(fp); > +} > + > diff -bBur cfengine-2.1.14/src/prototypes.h cfengine/src/prototypes.h > --- cfengine-2.1.14/src/prototypes.h 2005-07-09 15:42:57.000000000 +0200 > +++ cfengine/src/prototypes.h 2005-07-09 16:00:01.000000000 +0200 > @@ -156,7 +156,7 @@ > int IsTCPType ARGLIST((char *s)); > int IsProcessType ARGLIST((char *s)); > void HandleFriendStatus ARGLIST((char *args,char *value)); > - > +void BuildClassEnvironment ARGLIST((void)); > > /* granules.c */ > > > > _______________________________________________ > Help-cfengine mailing list > Help-cfengine@gnu.org > http://lists.gnu.org/mailman/listinfo/help-cfengine _______________________________________________ Help-cfengine mailing list Help-cfengine@gnu.org http://lists.gnu.org/mailman/listinfo/help-cfengine