Пример #1
0
/**
 * @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;
  }
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
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);
  }
}
Пример #6
0
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);
}
Пример #7
0
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);
}
Пример #8
0
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);
}
Пример #9
0
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;
}
Пример #10
0
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);
}
Пример #11
0
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;
}
Пример #12
0
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;
}
Пример #13
0
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;
}
Пример #14
0
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;
}
Пример #15
0
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;
}
Пример #16
0
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;
}
Пример #17
0
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);
  }
}