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