static pwr_tStatus start(ini_sContext* cp) { pwr_tStatus sts; char console[80]; int state; int fd; if (streq(cp->console, "")) strcpy(console, "/dev/console"); else strcpy(console, cp->console); if ((fd = open(console, O_APPEND | O_WRONLY)) == -1) errl_Init(NULL, ini_errl_cb, cp); else { close(fd); errl_Init(console, ini_errl_cb, cp); } errh_Init("pwr_ini", errh_eAnix_ini); if (cp->flags.b.interactive) errh_Interactive(); mh_UtilCreateEvent(); ini_CheckContext(&sts, cp); ini_ReadBootFile(&sts, cp); ini_ReadNodeFile(&sts, cp); ini_CheckNode(&sts, cp); cp->me = tree_Find(&sts, cp->nid_t, &cp->node.nid); if (cp->me == NULL) { errh_LogFatal(&cp->log, "Cannot find my own node in %s\n", cp->nodefile.name); exit(QCOM__WEIRD); } if (!checkErrors(cp)) exit(0); if (cp->flags.b.verbose) logCardinality(cp); ini_CreateDb(&sts, cp); ini_LoadNode(&sts, cp); ini_BuildNode(&sts, cp); if (cp->np != NULL) { if (cp->np->ErrLogTerm[0] != '\0') { errh_LogInfo(&cp->log, "Setting log terminal to: %s", cp->np->ErrLogTerm); errl_SetTerm(cp->np->ErrLogTerm); } /* Logfile is always $pwrp_log/pwr.log from V4.0.0 and handled by Linux log * rotation */ char fname[256]; sprintf(fname, "$pwrp_log/pwr_%s.log", cp->nodename); dcli_translate_filename(fname, fname); errl_SetFile(fname); errh_LogInfo(&cp->log, "Setting log file to: %s", fname); /* if (cp->np->ErrLogFile[0] != '\0') { struct tm *tp; char fname[256]; time_t t; time(&t); tp = localtime(&t); strftime(fname, sizeof(fname), cp->np->ErrLogFile, tp ); dcli_translate_filename( fname, fname); errl_SetFile(fname); errh_LogInfo(&cp->log, "Setting log file to: %s", cp->np->ErrLogFile); } */ } ini_SetSystemStatus(cp, PWR__STARTUP); errh_SetStatus(PWR__STARTUP); sts = ini_RcReadAndSet(cp->dir, cp->nodename, cp->busid); if (EVEN(sts)) errh_LogError(&cp->log, "ini_RcReadAndSet, %m", sts); sts = ini_SetAttribute(cp->aliasfile.name, cp->nodename, 0); if (EVEN(sts) && sts != INI__FILE) errh_LogError(&cp->log, "ini_SetAttribute, %m", sts); qini_BuildDb(&sts, cp->nid_t, cp->me, NULL, cp->busid); sts = redu_get_initial_state(cp->nodename, cp->busid, &state); if (ODD(sts)) { cp->np->RedundancyState = state; qcom_SetRedundancyState(state); } create_locks(); io_init_signals(); load_backup(); ini_ProcTable(&sts, cp); ini_ProcIter(&sts, cp, proc_mProcess_system, 0, ini_ProcLoad); ini_ProcIter(&sts, cp, proc_mProcess_system, 0, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_system, 0, ini_ProcPrio); net_Connect(&sts, &gdbroot->my_aid, &gdbroot->my_qid, NULL, "pwr_ini"); /*if (!qcom_Init(&sts, 0)) {*/ if (EVEN(sts)) { errh_LogFatal(&cp->log, "net_Connect, %m", sts); exit(sts); } qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcInit | ini_mEvent_newPlcStart); ini_ProcIter(&sts, cp, proc_mProcess_user, 0, ini_ProcLoad); ini_ProcIter(&sts, cp, proc_mProcess_user, 0, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_user, 0, ini_ProcPrio); qcom_CreateQ(&sts, &cp->eventQ, NULL, "iniEvent"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_CreateQ, %m", sts); exit(sts); } qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_newPlcStartDone | cp->plc_sigmask, qcom_cTmoEternal); sts = ini_SetAttributeAfterPlc(cp->aliasfile.name, cp->nodename, 0); if (EVEN(sts) && sts != INI__FILE) errh_LogError(&cp->log, "ini_SetAttributeAfterPlc, %m", sts); ini_SetSystemStatus(cp, PWR__RUNNING); errh_SetStatus(PWR__SRUN); return sts; }
static pwr_tStatus interactive(int argc, char** argv, ini_sContext* cp) { pwr_tStatus sts; qcom_sQid qid; qcom_sPut put; qcom_sGet get; char *bp, *sp; int i; int len; int totlen; errh_Interactive(); if (!qcom_Init(&sts, 0, "pwr_ini_restart")) { errh_LogFatal(&cp->log, "qcom_Init, %m", sts); exit(sts); } qcom_CreateQ(&sts, &cp->myQ, NULL, "pwr_ini_restart"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_CreateQ, %m", sts); exit(sts); } for (i = 0, totlen = 0; i < argc; i++) { len = strlen(argv[i]); totlen += 1 + len; errh_LogInfo(&cp->log, "argv[%d]: %d \"%s\"", i, len, argv[i]); } bp = malloc(totlen); for (i = 0, sp = bp; i < argc; i++) { len = strlen(argv[i]); memcpy(sp, argv[i], len + 1); sp += len + 1; } qid.qix = 550715; qid.nid = 0; put.type.b = 10; put.type.s = 1; put.reply = cp->myQ; put.data = bp; put.size = totlen; put.allocate = 1; qcom_Put(&sts, &qid, &put); while (1) { char* s; get.data = NULL; s = qcom_Get(&sts, &cp->myQ, &get, 100000); if (sts == QCOM__TMO && sts == QCOM__QEMPTY) { break; } else if (s != NULL) { printf("%s\n", s); qcom_Free(NULL, s); } if (get.type.s == 2) break; } return sts; }
static pwr_tStatus start( ini_sContext *cp) { pwr_tStatus sts; char console[80]; qini_sNode *nep; qcom_sAid aid; int fd; if ( strcmp( cp->console, "") == 0) strcpy( console, "/dev/console"); else strcpy( console, cp->console); if ((fd = open(console, O_APPEND | O_WRONLY)) == -1) errl_Init(NULL, ini_errl_cb, cp); else { close(fd); errl_Init(console, ini_errl_cb, cp); } errh_Init("pwr_ini", errh_eAnix_ini); if ( cp->flags.b.interactive) errh_Interactive(); ini_CheckContext(&sts, cp); ini_ReadBootFile(&sts, cp); ini_ReadNodeFile(&sts, cp); for (nep = tree_Minimum(&sts, cp->nid_t); nep != NULL; nep = tree_Successor(&sts, cp->nid_t, nep)) { if ( strcmp( cp->nodename, nep->name) == 0) { cp->me = nep; break; } } if (cp->me == NULL) { errh_LogFatal(&cp->log, "Cannot find my own node in %s\n", cp->nodefile.name); exit(QCOM__WEIRD); } if (!checkErrors(cp)) exit(0); /* Logfile is always $pwrp_log/pwr.log from V4.0.0 and handled by Linux log rotation */ char fname[256]; sprintf(fname, "$pwrp_log/pwr_%s.log", cp->nodename); dcli_translate_filename(fname, fname); errl_SetFile(fname); errh_LogInfo(&cp->log, "Setting log file to: %s", fname); // ini_SetSystemStatus( cp, PWR__STARTUP); errh_SetStatus( PWR__STARTUP); qini_BuildDb(&sts, cp->nid_t, cp->me, NULL, cp->busid); ini_ProcTable(&sts, cp); ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_system, ini_ProcPrio); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcStart); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_ProcPrio); qcom_Init(&sts, &aid, "pwr_sev_init"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_Init, %m", sts); exit(sts); } qcom_CreateQ(&sts, &cp->eventQ, NULL, "iniEvent"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_CreateQ, %m", sts); exit(sts); } // ini_SetSystemStatus( cp, PWR__RUNNING); errh_SetStatus( PWR__SRUN); return sts; }