static void VerifyProcesses(EvalContext *ctx, Attributes a, Promise *pp) { CfLock thislock; char lockname[CF_BUFSIZE]; if (a.restart_class) { snprintf(lockname, CF_BUFSIZE - 1, "proc-%s-%s", pp->promiser, a.restart_class); } else { snprintf(lockname, CF_BUFSIZE - 1, "proc-%s-norestart", pp->promiser); } thislock = AcquireLock(ctx, lockname, VUQNAME, CFSTARTTIME, a.transaction, pp, false); if (thislock.lock == NULL) { return; } ScopeDeleteSpecial("this", "promiser"); ScopeNewSpecial(ctx, "this", "promiser", pp->promiser, DATA_TYPE_STRING); PromiseBanner(pp); VerifyProcessOp(ctx, PROCESSTABLE, a, pp); ScopeDeleteSpecial("this", "promiser"); YieldCurrentLock(thislock); }
void VerifyExecPromise(EvalContext *ctx, Promise *pp) { Attributes a = { {0} }; a = GetExecAttributes(ctx, pp); ScopeNewSpecial(ctx, "this", "promiser", pp->promiser, DATA_TYPE_STRING); if (!SyntaxCheckExec(a, pp)) { // cfPS(ctx, LOG_LEVEL_ERR, PROMISE_RESULT_FAIL, pp, a, ""); ScopeDeleteSpecial("this", "promiser"); return; } if (PromiseKeptExec(a, pp)) { // cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_NOOP, pp, a, ""); ScopeDeleteSpecial("this", "promiser"); return; } char *lock_name = GetLockNameExec(a, pp); CfLock thislock = AcquireLock(ctx, lock_name, VUQNAME, CFSTARTTIME, a.transaction, pp, false); free(lock_name); if (thislock.lock == NULL) { // cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_FAIL, pp, a, ""); ScopeDeleteSpecial("this", "promiser"); return; } PromiseBanner(pp); switch (RepairExec(ctx, a, pp)) { case ACTION_RESULT_OK: // cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_CHANGE, pp, a, ""); break; case ACTION_RESULT_TIMEOUT: // cfPS(ctx, LOG_LEVEL_ERR, PROMISE_RESULT_TIMEOUT, pp, a, ""); break; case ACTION_RESULT_FAILED: // cfPS(ctx, LOG_LEVEL_INFO, PROMISE_RESULT_FAIL, pp, a, ""); break; default: ProgrammingError("Unexpected ActionResult value"); } YieldCurrentLock(thislock); ScopeDeleteSpecial("this", "promiser"); }
void VerifyMethodsPromise(EvalContext *ctx, Promise *pp) { Attributes a = { {0} }; a = GetMethodAttributes(ctx, pp); VerifyMethod(ctx, "usebundle", a, pp); ScopeDeleteSpecial("this", "promiser"); }
void ScopeNewSpecial(EvalContext *ctx, const char *scope, const char *lval, const void *rval, DataType dt) { assert(ScopeIsReserved(scope)); Rval rvald; if (EvalContextVariableGet(ctx, (VarRef) { NULL, scope, lval }, &rvald, NULL)) { ScopeDeleteSpecial(scope, lval); } EvalContextVariablePut(ctx, (VarRef) { NULL, scope, lval }, (Rval) { rval, DataTypeToRvalType(dt) }, dt); }
/** * @WARNING Don't call ScopeDelete*() before this, it's unnecessary. */ void ScopeNewSpecial(EvalContext *ctx, SpecialScope scope, const char *lval, const void *rval, DataType dt) { Rval rvald; VarRef *ref = VarRefParseFromScope(lval, SpecialScopeToString(scope)); if (EvalContextVariableGet(ctx, ref, &rvald, NULL)) { ScopeDeleteSpecial(scope, lval); } EvalContextVariablePut(ctx, ref, (Rval) { rval, DataTypeToRvalType(dt) }, dt); VarRefDestroy(ref); }
void ScopeDeleteScalar(VarRef lval) { assert(!ScopeIsReserved(lval.scope)); if (ScopeIsReserved(lval.scope)) { ScopeDeleteSpecial(lval.scope, lval.lval); } Scope *scope = ScopeGet(lval.scope); if (scope == NULL) { return; } if (HashDeleteElement(scope->hashtable, lval.lval) == false) { Log(LOG_LEVEL_DEBUG, "Attempt to delete non-existent variable %s in scope %s\n", lval.lval, lval.scope); } }