void errl_Init ( const char *termName, void (*log_cb)( void *, char *, char, pwr_tStatus, int, int), void *userdata ) { pthread_mutexattr_t mutexattr; pthread_attr_t pthreadattr; #if 0 struct mq_attr mqattr; #endif char name[64]; char *busid = getenv(pwr_dEnvBusId); static int initDone = 0; int policy; struct sched_param param; key_t key; int fd; int flags = O_RDWR | O_CREAT; mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; errl_log_cb = log_cb; errl_log_userdata = userdata; if (initDone) return; if ((pthread_getschedparam(pthread_self(), &policy, ¶m)) == -1) { perror("rt_errl: pthread_getprio(pthread_self() "); return; } pthread_mutexattr_init(&mutexattr); if (pthread_mutex_init(&fileMutex, &mutexattr) == -1) { perror("rt_logmod: pthread_mutex_init(&fileMutex, mutexattr) "); return; } if (pthread_mutex_init(&termMutex, &mutexattr) == -1) { perror("rt_logmod: pthread_mutex_init(&termMutex, mutexattr) "); return; } pthread_mutexattr_destroy(&mutexattr); #if 0 mqattr.mq_msgsize = LOG_MAX_MSG_SIZE; /* max mess size */ mqattr.mq_maxmsg = MAX_NO_MSG; /* max no of msg in this queue */ mqattr.mq_flags = 0; // O_NONBLOCK; oflags = O_CREAT | O_RDWR; mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; #endif sprintf(name, "%s_%s", LOG_QUEUE_NAME, busid ? busid : ""); fd = open(name, flags, mode); if ( fd == -1) { printf("Message Queue, open failed on %s, errno: %d\n", name, errno); } key = ftok(name, 'm'); close( fd); mqid = msgget( key, IPC_CREAT | 0660); if (mqid == -1) { perror("Open message queue: msgget "); return; } pthread_attr_init(&pthreadattr); if (pthread_create(&tid, &pthreadattr, log_thread, NULL) == -1) { perror("rt_logmod: pthread_create "); pthread_attr_destroy(&pthreadattr); return; } pthread_attr_destroy(&pthreadattr); param.sched_priority -= 1; pthread_setschedparam(tid, policy, ¶m); if (termName && *termName) errl_SetTerm(termName); logToStdout = getenv("PWR_LOG_TO_STDOUT") != NULL ? TRUE : FALSE; initDone = 1; return; }
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; }
void errl_Init ( const char *termName, void (*log_cb)( void *, char *, char, pwr_tStatus, int, int), void *userdata ) { pthread_mutexattr_t mutexattr; pthread_attr_t pthreadattr; struct mq_attr mqattr; mode_t mode; int oflags; char name[64]; char *busid = getenv(pwr_dEnvBusId); static int initDone = 0; int policy; struct sched_param param; errl_log_cb = log_cb; errl_log_userdata = userdata; if (initDone) return; if ((pthread_getschedparam(pthread_self(), &policy, ¶m)) == -1) { perror("rt_errl: pthread_getprio(pthread_self() "); return; } pthread_mutexattr_init(&mutexattr); if (pthread_mutex_init(&fileMutex, &mutexattr) == -1) { perror("rt_logmod: pthread_mutex_init(&fileMutex, mutexattr) "); return; } if (pthread_mutex_init(&termMutex, &mutexattr) == -1) { perror("rt_logmod: pthread_mutex_init(&termMutex, mutexattr) "); return; } pthread_mutexattr_destroy(&mutexattr); mqattr.mq_msgsize = LOG_MAX_MSG_SIZE; /* max mess size */ mqattr.mq_maxmsg = MAX_NO_MSG; /* max no of msg in this queue */ mqattr.mq_flags = 0; // O_NONBLOCK; oflags = O_CREAT | O_RDWR; mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; sprintf(name, "%s_%s", LOG_QUEUE_NAME, busid ? busid : ""); mqid = mq_open(name, oflags, mode, &mqattr); if (mqid == (mqd_t)-1) { if (errno == EINVAL) { mqattr.mq_maxmsg = DEF_MAX_NO_MSG; /* Try with smaller queue */ mqid = mq_open(name, oflags, mode, &mqattr); if (mqid == (mqd_t)-1) { perror("rt_logmod: mq_open "); return; } } else { perror("rt_logmod: mq_open "); return; } } pthread_attr_init(&pthreadattr); if (pthread_create(&tid, &pthreadattr, log_thread, NULL) == -1) { perror("rt_logmod: pthread_create "); pthread_attr_destroy(&pthreadattr); return; } pthread_attr_destroy(&pthreadattr); param.sched_priority -= 1; pthread_setschedparam(tid, policy, ¶m); if (termName && *termName) errl_SetTerm(termName); logToStdout = getenv("PWR_LOG_TO_STDOUT") != NULL ? TRUE : FALSE; initDone = 1; return; }