afs_int32 SBOZO_Restart(struct rx_call *acall, char *ainstance) { struct bnode *tb; afs_int32 code; char caller[MAXKTCNAMELEN]; if (!afsconf_SuperUser(bozo_confdir, acall, caller)) { code = BZACCESS; goto fail; } if (DoLogging) bozo_Log("%s is executing Restart '%s'\n", caller, ainstance); tb = bnode_FindInstance(ainstance); if (!tb) { code = BZNOENT; goto fail; } bnode_Hold(tb); bnode_SetStat(tb, BSTAT_SHUTDOWN); code = bnode_WaitStatus(tb, BSTAT_SHUTDOWN); /* this can fail */ bnode_ResetErrorCount(tb); bnode_SetStat(tb, BSTAT_NORMAL); bnode_Release(tb); fail: osi_auditU(acall, BOS_RestartEvent, code, AUD_STR, ainstance, AUD_END); return code; }
/* set temp status */ afs_int32 SBOZO_SetTStatus(struct rx_call *acall, char *ainstance, afs_int32 astatus) { struct bnode *tb; afs_int32 code; char caller[MAXKTCNAMELEN]; if (!afsconf_SuperUser(bozo_confdir, acall, caller)) { code = BZACCESS; goto fail; } if (DoLogging) bozo_Log("%s is executing SetTempStatus '%s'\n", caller, ainstance); tb = bnode_FindInstance(ainstance); if (!tb) { code = BZNOENT; goto fail; } bnode_Hold(tb); bnode_ResetErrorCount(tb); code = bnode_SetStat(tb, astatus); bnode_Release(tb); fail: osi_auditU(acall, BOS_SetTempStatusEvent, code, AUD_STR, ainstance, AUD_END); return code; }
static int stproc(struct bnode *abnode, void *arock) { if (abnode->fileGoal == BSTAT_SHUTDOWN) return 0; /* don't do these guys */ bnode_Hold(abnode); bnode_ResetErrorCount(abnode); bnode_SetStat(abnode, BSTAT_NORMAL); bnode_Release(abnode); return 0; }
/* called to SIGKILL a process if it doesn't terminate normally * or to retry start after an error stop. */ static int ez_timeout(struct bnode *bn) { struct ezbnode *abnode = (struct ezbnode *)bn; if (abnode->waitingForShutdown) { /* send kill and turn off timer */ bnode_StopProc(abnode->proc, SIGKILL); abnode->killSent = 1; bnode_SetTimeout((struct bnode *)abnode, 0); } else if (!abnode->running && abnode->b.flags & BNODE_ERRORSTOP) { /* was stopped for too many errors, retrying */ /* reset error count after running for a bit */ bnode_SetTimeout(bn, ERROR_RESET_TIME); bnode_SetStat(bn, BSTAT_NORMAL); } else { bnode_SetTimeout(bn, 0); /* one shot timer */ bnode_ResetErrorCount(bn); } return 0; }