void NewScalar(const char *scope, const char *lval, const char *rval, enum cfdatatype dt) { Rval rvald; Scope *ptr; CfDebug("NewScalar(%s,%s,%s)\n", scope, lval, rval); ptr = GetScope(scope); if (ptr == NULL) { CfOut(cf_error, "", "!! Attempt to add variable \"%s\" to non-existant scope \"%s\" - ignored", lval, scope); return; } // Newscalar allocates memory through NewAssoc if (GetVariable(scope, lval, &rvald) != cf_notype) { DeleteScalar(scope, lval); } /* * We know AddVariableHash does not change passed Rval structure or its * contents, but we have no easy way to express it in C type system, hence cast. */ AddVariableHash(scope, lval, (Rval) {(char *) rval, CF_SCALAR}, dt, NULL, 0); }
void NewList(char *scope, char *lval, void *rval, enum cfdatatype dt) { Rval rvald; if (GetVariable(scope, lval, &rvald) != cf_notype) { DeleteVariable(scope, lval); } AddVariableHash(scope, lval, (Rval) {rval, CF_LIST}, dt, NULL, 0); }
void NewList(char *scope,char *lval,void *rval,enum cfdatatype dt) { char *sp1; struct Rval rvald; if (GetVariable(scope,lval,&rvald.item,&rvald.rtype) != cf_notype) { DeleteVariable(scope,lval); } sp1 = strdup(lval); AddVariableHash(scope,sp1,rval,CF_LIST,dt,NULL,0); }
static void IdempNewScalar(char *scope,char *lval,char *rval,enum cfdatatype dt) { struct Rval rvald; Debug("IdempNewScalar(%s,%s,%s)\n",scope,lval,rval); if (GetVariable(scope,lval,&rvald.item,&rvald.rtype) != cf_notype) { return; } AddVariableHash(scope,lval,rval,CF_SCALAR,dt,NULL,0); }
void NewScalar(char *scope,char *lval,char *rval,enum cfdatatype dt) { struct Rval rvald; struct Scope *ptr; Debug("NewScalar(%s,%s,%s)\n",scope,lval,rval); ptr = GetScope(scope); if (ptr == NULL) { CfOut(cf_error, "", "!! Attempt to add variable \"%s\" to non-existant scope \"%s\" - ignored", lval, scope); return; } // Newscalar allocates memory through NewAssoc if (GetVariable(scope,lval,&rvald.item,&rvald.rtype) != cf_notype) { DeleteScalar(scope,lval); } AddVariableHash(scope,lval,rval,CF_SCALAR,dt,NULL,0); }
int MapBodyArgs(const char *scopeid, Rlist *give, const Rlist *take) { Rlist *rpg = NULL; const Rlist *rpt = NULL; FnCall *fp; enum cfdatatype dtg = cf_notype, dtt = cf_notype; char *lval; void *rval; int len1, len2; CfDebug("MapBodyArgs(begin)\n"); len1 = RlistLen(give); len2 = RlistLen(take); if (len1 != len2) { CfOut(cf_error, "", " !! Argument mismatch in body template give[+args] = %d, take[-args] = %d", len1, len2); return false; } for (rpg = give, rpt = take; rpg != NULL && rpt != NULL; rpg = rpg->next, rpt = rpt->next) { dtg = StringDataType(scopeid, (char *) rpg->item); dtt = StringDataType(scopeid, (char *) rpt->item); if (dtg != dtt) { CfOut(cf_error, "", "Type mismatch between logical/formal parameters %s/%s\n", (char *) rpg->item, (char *) rpt->item); CfOut(cf_error, "", "%s is %s whereas %s is %s\n", (char *) rpg->item, CF_DATATYPES[dtg], (char *) rpt->item, CF_DATATYPES[dtt]); } switch (rpg->type) { case CF_SCALAR: lval = (char *) rpt->item; rval = rpg->item; CfDebug("MapBodyArgs(SCALAR,%s,%s)\n", lval, (char *) rval); AddVariableHash(scopeid, lval, (Rval) {rval, CF_SCALAR}, dtg, NULL, 0); break; case CF_LIST: lval = (char *) rpt->item; rval = rpg->item; AddVariableHash(scopeid, lval, (Rval) {rval, CF_LIST}, dtg, NULL, 0); break; case CF_FNCALL: fp = (FnCall *) rpg->item; dtg = FunctionReturnType(fp->name); FnCallResult res = EvaluateFunctionCall(fp, NULL); if (res.status == FNCALL_FAILURE && THIS_AGENT_TYPE != cf_common) { // Unresolved variables if (VERBOSE) { printf (" !! Embedded function argument does not resolve to a name - probably too many evaluation levels for "); ShowFnCall(stdout, fp); printf(" (try simplifying)\n"); } } else { DeleteFnCall(fp); rpg->item = res.rval.item; rpg->type = res.rval.rtype; lval = (char *) rpt->item; rval = rpg->item; AddVariableHash(scopeid, lval, (Rval) {rval, CF_SCALAR}, dtg, NULL, 0); } break; default: /* Nothing else should happen */ FatalError("Software error: something not a scalar/function in argument literal"); } } CfDebug("MapBodyArgs(end)\n"); return true; }
static void CheckControlPromises(char *scope,char *agent,struct Constraint *controllist) { struct Constraint *cp; struct BodySyntax *bp = NULL; struct Rlist *rp; int i = 0; struct Rval returnval; char rettype; void *retval; Debug("CheckControlPromises(%s)\n",agent); for (i = 0; CF_ALL_BODIES[i].bs != NULL; i++) { bp = CF_ALL_BODIES[i].bs; if (strcmp(agent,CF_ALL_BODIES[i].btype) == 0) { break; } } if (bp == NULL) { FatalError("Unknown agent"); } for (cp = controllist; cp != NULL; cp=cp->next) { if (IsExcluded(cp->classes)) { continue; } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_bundlesequence].lval) == 0) { returnval = ExpandPrivateRval(CONTEXTID,cp->rval,cp->type); } else { returnval = EvaluateFinalRval(CONTEXTID,cp->rval,cp->type,true,NULL); } DeleteVariable(scope,cp->lval); if (!AddVariableHash(scope,cp->lval,returnval.item,returnval.rtype,GetControlDatatype(cp->lval,bp),cp->audit->filename,cp->lineno)) { CfOut(cf_error,""," !! Rule from %s at/before line %d\n",cp->audit->filename,cp->lineno); } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_output_prefix].lval) == 0) { strncpy(VPREFIX,returnval.item,CF_MAXVARSIZE); } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_domain].lval) == 0) { strcpy(VDOMAIN,cp->rval); CfOut(cf_verbose,"","SET domain = %s\n",VDOMAIN); DeleteScalar("sys","domain"); DeleteScalar("sys","fqhost"); snprintf(VFQNAME,CF_MAXVARSIZE,"%s.%s",VUQNAME,VDOMAIN); NewScalar("sys","fqhost",VFQNAME,cf_str); NewScalar("sys","domain",VDOMAIN,cf_str); DeleteClass("undefined_domain"); NewClass(VDOMAIN); } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_ignore_missing_inputs].lval) == 0) { CfOut(cf_verbose,"","SET ignore_missing_inputs %s\n",cp->rval); IGNORE_MISSING_INPUTS = GetBoolean(cp->rval); } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_ignore_missing_bundles].lval) == 0) { CfOut(cf_verbose,"","SET ignore_missing_bundles %s\n",cp->rval); IGNORE_MISSING_BUNDLES = GetBoolean(cp->rval); } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_goalpatterns].lval) == 0) { GOALS = NULL; for (rp = (struct Rlist *)returnval.item; rp != NULL; rp=rp->next) { PrependRScalar(&GOALS,rp->item,CF_SCALAR); } CfOut(cf_verbose,"","SET goal_patterns list\n"); continue; } if (strcmp(cp->lval,CFG_CONTROLBODY[cfg_goalcategories].lval) == 0) { GOALCATEGORIES = NULL; for (rp = (struct Rlist *)returnval.item; rp != NULL; rp=rp->next) { PrependRScalar(&GOALCATEGORIES,rp->item,CF_SCALAR); } CfOut(cf_verbose,"","SET goal_categories list\n"); continue; } DeleteRvalItem(returnval.item,returnval.rtype); } }