/** * @brief handle_signal */ void handle_signal(int sig, siginfo_t* si, void* ctx) { ini_sContext* cp = (ini_sContext*)ctx; switch (sig) { case SIGTERM: errh_LogInfo(&cp->log, "SIGNAL CAUGHT (%d). Exiting!\n", sig, cp->node.bodySize); stop(cp); if (cp->flags.b.daemonize) { if (pid_fd != -1) { lockf(pid_fd, F_ULOCK, 0); close(pid_fd); } if (pid_filename != NULL) { unlink(pid_filename); } } break; case SIGHUP: errh_LogInfo(&cp->log, "SIGNAL CAUGHT (%d). Restarting!\n", sig, cp->node.bodySize); // TODO restart :) break; default: // Noop break; } }
void ini_ReadBootFile ( pwr_tStatus *status, ini_sContext *cp ) { char day[80]; char time[80]; char buffer[256]; char *s; int i; int n; int nvol; /* pwr_tProjVersion ver;*/ FILE *f; pwr_dStatus(sts, status, INI__SUCCESS); f = ini_OpenFile(sts, cp, &cp->bootfile); if (f == NULL) return; errh_LogInfo(&cp->log, "Reading Boot file %s", cp->bootfile.name); for ( i = 0, nvol = 0, s = fgets(buffer, sizeof(buffer) - 1, f); s != NULL; s = fgets(buffer, sizeof(buffer) - 1, f) ) { if (*s == '!') { s++; continue; } switch (i) { case 0: /* Creation Date. */ i++; time[0] = day[0] = '\0'; n = sscanf(s, "%s %s", day, time); break; case 1: i++; cp->proj[0] = '\0'; n = sscanf(s, "%s", cp->proj); errh_LogInfo(&cp->log, "Created at %s %s for project: %s", day, time, cp->proj); break; case 2: i++; cp->group[0] = '\0'; n = sscanf(s, "%s", cp->group); break; } } fclose(f); }
static int checkErrors(ini_sContext* cp) { if (cp->warnings == 0 && cp->errors == 0 && cp->fatals == 0) return 1; if (cp->fatals > 0) { errh_LogFatal(&cp->log, "Found %d warning(s), %d error(s) and %d fatal error(s)", cp->warnings, cp->errors, cp->fatals); if (cp->flags.b.ignoreFatal) { errh_LogInfo(&cp->log, "Ignoring fatal errors, errors and warnings, continued..."); return 1; } else { return ask_yes_no("Do you want to continue"); } } if (cp->errors > 0) { errh_LogError(&cp->log, "Found %d warning(s), %d error(s) and %d fatal error(s)", cp->warnings, cp->errors, cp->fatals); if (cp->flags.b.ignoreError) { errh_LogInfo(&cp->log, "Ignoring errors and warnings, continued..."); return 1; } else { return ask_yes_no("Do you want to continue"); } } if (cp->warnings > 0) { errh_LogWarning(&cp->log, "Found %d warning(s), %d error(s) and %d fatal error(s)", cp->warnings, cp->errors, cp->fatals); if (cp->flags.b.ignoreWarning) { errh_LogInfo(&cp->log, "Ignoring warnings, continued..."); return 1; } else { return ask_yes_no("Do you want to continue"); } } return 1; }
static void logCardinality ( ini_sContext *cp ) { lst_sEntry *vl; ivol_sVolume *vp; errh_LogInfo(&cp->log, "Cardinality: %d, bodysize: %d\n", cp->node.cardinality, cp->node.bodySize); for (vp = lst_Succ(NULL, &cp->vol_lh, &vl); vp != NULL; vp = lst_Succ(NULL, vl, &vl)) errh_LogInfo(&cp->log, "Volume: %s, id: %d, cardinality: %d, bodysize: %d\n", vp->volume.name, vp->vid, vp->volume.cardinality, vp->volume.rbodySize); }
static void logChanges ( ini_sContext *cp ) { lst_sEntry *vl; lst_sEntry *ol; ivol_sVolume *vp; ivol_sObject *iop; int cre, upd, upd_io; for (vp = lst_Succ(NULL, &cp->vol_lh, &vl); vp != NULL; vp = lst_Succ(NULL, vl, &vl)) { cre = upd = upd_io = 0; for (iop = lst_Succ(NULL, &vp->cre_lh, &ol); iop != NULL; iop = lst_Succ(NULL, ol, &ol)) { errh_LogInfo(&cp->log, "cre: %s\n", iop->oh.name); cre++; } for (iop = lst_Succ(NULL, &vp->upd_io_lh, &ol); iop != NULL; iop = lst_Succ(NULL, ol, &ol)) { printf("upd: %s, (", iop->op->g.f.name.orig); if (iop->flags.b.father) printf("father, "); if (iop->flags.b.name) printf("name, "); if (iop->flags.b.server) printf("server, "); if (iop->flags.b.classid) printf("class, "); if (iop->flags.b.size) printf("size, "); if (iop->flags.b.flags) printf("flags, "); if (iop->flags.b.body) printf("body, "); printf(")\n"); upd_io++; } for (iop = lst_Succ(NULL, &vp->upd_lh, &ol); iop != NULL; iop = lst_Succ(NULL, ol, &ol)) { printf("upd: %s, (", iop->op->g.f.name.orig); if (iop->flags.b.father) printf("father, "); if (iop->flags.b.name) printf("name, "); if (iop->flags.b.server) printf("server, "); if (iop->flags.b.classid) printf("class, "); if (iop->flags.b.size) printf("size, "); if (iop->flags.b.flags) printf("flags, "); if (iop->flags.b.body) printf("body, "); printf(")\n"); upd++; } errh_LogInfo(&cp->log, "Volume: %s, id: %d, cre: %d, upd_io: %d, upd: %d\n", vp->volume.name, vp->vid, cre, upd_io, upd); } }
void ini_ProcStart ( pwr_tStatus *status, ini_sContext *cp, ini_sProc *pp ) { pwr_dStatus(sts, status, INI__SUCCESS); if (pp->flags.b.running) return; if (pp->flags.b.run) { errh_LogInfo(&cp->log, "Starting %s, file: %s, prio: %d", pp->id, pp->proc.file, pp->proc.p_prio); } else { errh_LogInfo(&cp->log, "%s, file: %s, prio: %d, will not be started.", pp->id, pp->proc.file, pp->proc.p_prio); return; } *sts = proc_Start(&pp->proc); if (EVEN(*sts)) errh_LogError(&cp->log, "Error starting %s, %m", pp->id, *sts); }
int main (int argc, char **argv) { ini_sContext *cp; pwr_tStatus sts; cp = createContext(argc, argv); ver_WriteVersionInfo("Proview/R Storage Environment"); if (cp->flags.b.stop) { sts = stop(argc, argv, cp); } else { sts = start(cp); sts = events(cp); errh_LogInfo(&cp->log, "Ich sterbe!!"); } exit(sts); }
int main(int argc, char** argv) { ini_sContext* cp; pwr_tStatus sts; set_valid_time(); cp = createContext(argc, argv); ver_WriteVersionInfo("ProviewR Runtime Environment"); if (cp->flags.b.restart) { sts = interactive(argc, argv, cp); } else if (cp->flags.b.stop) { sts = stop(cp); } else { // Now lets daemonize if asked to if (cp->flags.b.daemonize) { daemonize(); } sts = start(cp); // Now lets create the pid file before starting our endless event loop if (cp->flags.b.daemonize) { create_pidfile(); } sts = events(cp); errh_LogInfo(&cp->log, "Ich sterbe!!"); } exit(sts); }
pwr_tBoolean ini_ReadNodeFile ( pwr_tStatus *status, ini_sContext *cp ) { FILE *f; pwr_dStatus(sts, status, INI__SUCCESS); f = ini_OpenFile(sts, cp, &cp->nodefile); if (f == NULL) return NO; errh_LogInfo(&cp->log, "Reading Node file %s", cp->nodefile.name); qini_ParseFile(f, cp->nid_t, &cp->warnings, &cp->errors, &cp->fatals); fclose(f); return YES; }
int main (int argc, char **argv) { ini_sContext *cp; pwr_tStatus sts; set_valid_time(); cp = createContext(argc, argv); ver_WriteVersionInfo("Proview Runtime Environment"); if (cp->flags.b.restart) { sts = interactive(argc, argv, cp); } else if (cp->flags.b.stop) { sts = stop(argc, argv, cp); } else { sts = start(cp); sts = events(cp); errh_LogInfo(&cp->log, "Ich sterbe!!"); } exit(sts); }
FILE *ini_OpenFile ( pwr_tStatus *status, ini_sContext *cp, ini_sFile *fp ) { FILE *f; pwr_dStatus(sts, status, INI__SUCCESS); f = fopen(fp->name, "r"); if (f == NULL) { if (fp->errcount) (*fp->errcount)++; if (fp->logOpenFail) fp->logOpenFail(&cp->log, "Could not open file %s", fp->name); return NULL; } if (cp->flags.b.verbose) errh_LogInfo(&cp->log, "Opened file %s", fp->name); return f; }
static pwr_tStatus events ( ini_sContext *cp ) { lst_sEntry *pl; ini_sProc *pp; pid_t pid; pid_t last_pid = 1; pwr_tStatus sts = INI__SUCCESS; qcom_sGet get; #if defined OS_POSIX int tmo_ms = 1000; #else int tmo_ms = qcom_cTmoEternal; #endif cp->myQ.qix = 550715; cp->myQ.nid = 0; qcom_CreateQ(&sts, &cp->myQ, NULL, "events"); if (EVEN(sts)) { errh_LogFatal(&cp->log, "qcom_CreateQ, %m", sts); exit(sts); } for (;;) { int status; get.data = NULL; qcom_Get(&sts, &cp->myQ, &get, tmo_ms); /* Request for termination ?? */ if (sts != QCOM__TMO && sts != QCOM__QEMPTY && get.type.b == 11) { sts = terminate(cp); return sts; } /* Request for restart */ if (sts != QCOM__TMO && sts != QCOM__QEMPTY && get.data != NULL) { int len, i, argc, totlen; char **argv, *s; ini_sContext *ncp; for (argc = 0, s = get.data, totlen = 0; totlen < get.size; argc++) { len = strlen(s); s += len + 1; totlen += len + 1; } argv = (char **) calloc(sizeof(void*), argc); for (i = 0, s = get.data; i < argc; i++) { len = strlen(s); argv[i] = s; s += len + 1; } ncp = createContext(argc, argv); if (ncp != NULL) { ncp->log.put.type.b = 10; ncp->log.put.type.s = 1; ncp->log.send = 1; ncp->log.put.reply = cp->myQ; ncp->log.logQ = get.reply; ncp->eventQ = cp->eventQ; ncp->yourQ = get.reply; restart(ncp); free(ncp); } free(argv); qcom_Free(NULL, get.data); } #if defined OS_POSIX if (lst_Succ(NULL, &cp->proc_lh, &pl) == NULL) break; pid = waitpid(-1, &status, WNOHANG|WUNTRACED); if (pid == 0) continue; if (pid == last_pid) break; for (pp = lst_Succ(NULL, &cp->proc_lh, &pl); pp != NULL; pp = lst_Succ(NULL, pl, &pl)) { if (pp->proc.pid == pid) { errh_LogInfo(&cp->log, "Process %s exited with status %d", pp->proc.name, status); break; } } #endif } return INI__SUCCESS; }
static pwr_tStatus restart ( ini_sContext *cp ) { pwr_tStatus sts; char time[24]; lst_sEntry *pl; ini_sProc *pp; ini_CheckContext(&sts, cp); ini_ReadBootFile(&sts, cp); ini_CheckNode(&sts, cp); checkErrors(cp); if (cp->flags.b.verbose) logCardinality(cp); qcom_SignalAnd(&sts, &qcom_cQini, 0); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_swapInit); ini_ReloadNode(&sts, cp); if (cp->flags.b.verbose) logChanges(cp); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_rebuildInit); ini_RebuildNode(&sts, cp); ini_DecodeBodies(&sts, cp, 0); ini_DecodeBodies(&sts, cp, 1); if (cp->flags.b.verbose) errh_LogInfo(&cp->log, "Update bodies of io objects"); ini_UpdateBodies(&sts, cp, 1); io_init_signals(); ini_ProcTable(&sts, cp); // ini_ProcLoad(&sts, cp, cp->plc); // ini_ProcStart(&sts, cp, cp->plc); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_mProc_plc, ini_ProcLoad); ini_ProcIter(&sts, cp, proc_mProcess_user, ini_mProc_plc, ini_ProcStart); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcInit); qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_newPlcInitDone | cp->plc_sigmask, qcom_cTmoEternal); errh_LogInfo(&cp->log, "Entering time critical period, stopping old PLC"); qcom_SignalAnd(&sts, &qcom_cQini, ~cp->plc_sigmask); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_oldPlcStop); qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_oldPlcStopDone | cp->plc_sigmask, qcom_cTmoEternal); qcom_SignalAnd(&sts, &qcom_cQini, ~ini_mEvent_oldPlcStop); ini_UpdateBodies(&sts, cp, 0); qcom_SignalAnd(&sts, &qcom_cQini, ~cp->plc_sigmask); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_newPlcStart); qcom_WaitAnd(&sts, &cp->eventQ, &qcom_cQini, ini_mEvent_newPlcStartDone | cp->plc_sigmask, qcom_cTmoEternal); errh_LogInfo(&cp->log, "Time critical period over, new PLC is running"); qcom_SignalOr(&sts, &qcom_cQini, ini_mEvent_swapDone); for (pp = lst_Succ(NULL, &cp->proc_lh, &pl); pp != NULL; pp = lst_Succ(NULL, pl, &pl)) { if ( pp->flags.m & ini_mProc_plc && pp->objectp) { pwr_sClass_PlcProcess *plc = pp->objectp; time_GetTime(&plc->LastChgTime); if ( time_Dcomp(&plc->StartTime, &plc->StopTime) == 1) time_Dsub(&plc->StallTime, &plc->StartTime, &plc->StopTime); else plc->StallTime = pwr_cNDeltaTime; time_DtoAscii(&plc->StallTime, 1, time, sizeof(time)); cp->np->RestartStallTime = plc->StallTime; } } cp->log.put.type.s = 2; errh_LogInfo(&cp->log, "IO stall time: %s", time); ini_FreeBodies(&sts, cp, 0); ini_FreeBodies(&sts, cp, 1); 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; 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]; #if defined OS_POSIX 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); } #else errl_Init("CONSOLE:", ini_errl_cb, cp); #endif 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); io_init_signals(); load_backup(); #if defined OS_ELN ker$initialization_done(NULL); #endif 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 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; }
void ini_ProcTable(pwr_tStatus* status, ini_sContext* cp) { FILE* f; ini_sProc* pp; char* s; char buffer[256]; char sev_server_args[20] = "-n"; pwr_dStatus(sts, status, INI__SUCCESS); pp = ini_ProcInsert(sts, cp, "pwr_qmon", "pwr_qmon_%d", 0, 1, "rt_qmon", cPrio_qmon, 0, 0, "-n", 0); pp->flags.b.qmon = 1; pp->proc.flags.b.system = 1; if (cp->flags.b.rootvolume) strcpy(sev_server_args, ""); pp = ini_ProcInsert(sts, cp, "pwr_sev_server", "pwr_sev_server_%d", 0, 1, "sev_server", cPrio_sev_server, 0, 0, sev_server_args, 0); pp->proc.flags.b.system = 1; f = ini_OpenFile(sts, cp, &cp->applfile); if (f != NULL) { if (cp->flags.b.verbose) errh_LogInfo( &cp->log, "Reading Application file %s\n", cp->applfile.name); for (;;) { char* nl; s = fgets(buffer, sizeof(buffer) - 1, f); if (s == NULL) break; nl = strchr(s, '\n'); if (nl != NULL) *nl = '\0'; if (cp->flags.b.verbose) errh_LogInfo(&cp->log, " %s", buffer); if (buffer[0] == '#') continue; do { int i_load = -1; int i_run = -1; int i_debug = -1; int i_prio = -1; char* id = NULL; char* name = NULL; char* load = NULL; char* run = NULL; char* file = NULL; char* prio = NULL; char* debug = NULL; char* arg = NULL; id = strtok(s, ","); if (id == NULL) break; name = strtok(NULL, ","); if (name == NULL) break; load = strtok(NULL, ","); if (load == NULL) break; run = strtok(NULL, ","); if (run == NULL) break; file = strtok(NULL, ","); if (file == NULL) break; prio = strtok(NULL, ","); if (prio == NULL) break; debug = strtok(NULL, ","); if (debug == NULL) break; arg = strtok(NULL, ","); if (arg == NULL) break; while (isspace(*id)) id++; while (isspace(*name)) name++; while (isspace(*load)) load++; while (isspace(*run)) run++; while (isspace(*file)) file++; while (isspace(*prio)) prio++; while (isspace(*debug)) debug++; while (isspace(*arg)) arg++; if (id[0] == '\0') break; if (strstr(load, "no")) i_load = 0; else if (strstr(load, "load")) i_load = 1; if (strstr(run, "no")) i_run = 0; else if (strstr(run, "run")) i_run = 1; if (strstr(debug, "no")) i_debug = 0; else if (strstr(debug, "debug")) i_debug = 1; if (strcspn(prio, "0123456789") > 0) i_prio = -1; else i_prio = atoi(prio); pp = ini_ProcInsert( sts, cp, id, name, i_load, i_run, file, i_prio, i_debug, 0, arg, 0); if (!pp->proc.flags.b.system && !pp->proc.flags.b.base) pp->proc.flags.b.user = 1; } while (0); } fclose(f); } }