/* * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation, * YDC Corporation, IPA (Information-technology Promotion Agency, Japan). * All rights reserved. * * Redistribution and use of this software in source and binary forms, with * or without modification, are permitted provided that the following * conditions and disclaimer are agreed and accepted by the user: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. Neither the names of the copyrighters, the name of the project which * is related to this software (hereinafter referred to as "project") nor * the names of the contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * 4. No merchantable use may be permitted without prior written * notification to the copyrighters. However, using this software for the * purpose of testing or evaluating any products including merchantable * products may be permitted without any notification to the copyrighters. * * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * * $TAHI: v6eval/lib/Cm/CmMain.cc,v 1.18 2003/10/23 04:37:30 akisada Exp $ */ #include "CmMain.h" #include #include #include #include #include #include #include #include #include #include #include #include extern int causeStopSignals[]; static int stopSingals[]={SIGINT,SIGQUIT,SIGTERM,0}; extern void applicationMain(CmMain*); //---------------------------------------------------------------------- // シグナルは捕捉処理 static void sigCatch(int sig,int code,struct sigcontext*,STR) { static char fmt[]= "%02d:%02d:%02d.%06d\tsigCatch(sig=%d,code=%d) pid=%d,application=%s\n"; static struct timeval t[1]; struct timezone z[1]; struct tm *m; CmMain *cm=CmMain::instance(); gettimeofday(t,z); m=localtime((const time_t *)&t[0].tv_sec); STR name=cm->applicationName(); eoutf(fmt,m->tm_hour,m->tm_min,m->tm_sec,t[0].tv_usec, sig,code,getpid(),name?name:""); int *p, s; for(p=stopSingals;(s=*p);p++) { if(s==sig) {exit(sig);}} if(sig!=SIGIOT) {signal(sig,(exitHandler)sigCatch);} ::abort();} //---------------------------------------------------------------------- // 再起動処理 void CmMain::save(int argc) { STR *argv=orgArgs_, *p, *q, s; applicationName(argv[0]); saveArgs_=(STR*)new STR[argc+2]; for(p=argv,q=saveArgs_;(s=*p);p++,q++) {*q=s;} *q=0;} void CmMain::restart() { int i, max=getdtablesize(); pid_t pid=vfork(); if(pid< 0) {eoutf("cannot restart %s\n",command()); exit(1);} if(pid!=0) {exit(0);} SETPGRP(0,0); for(i=3;iut_line),A(u->ut_name),A(u->ut_host)); #undef A return;} void CmMain::makeCatchEye(const STR pgmName) { static char catch1[]="@(#) %02d/%02d/%02d %02d:%02d:%02d %s STARTED by %s@%s"; time_t now=time(0); struct tm *m=localtime(&now); struct passwd *pw=getpwuid(getuid()); CSTR p=pw?pw->pw_name:"unknown"; sprintf(catchStart_,catch1,m->tm_year,m->tm_mon+1,m->tm_mday, m->tm_hour,m->tm_min,m->tm_sec,pgmName,p,myHostname()); makeCatch2Eye(catchStart_+strlen(catchStart_));} //---------------------------------------------------------------------- // 起動時情報 STR CmMain::applicationName(STR pgm) { STR s; if(applicationName_) return applicationName_; makeCatchEye(applicationName_=(s=strrchr(pgm,'/'))?s+1:pgm); return applicationName_;} //---------------------------------------------------------------------- // 生成/消滅 CmMain::CmMain(int argc,STR *argv,STR *envp): argCount_(argc),orgArgs_(argv),saveEnvp_(envp) { save(argc); instance_=this;} CmMain::~CmMain() { delete [] saveArgs_;} //---------------------------------------------------------------------- // プロセスを停止するシグナル一覧 #if defined(__hpux) int causeStopSignals[]={ SIGHUP , SIGINT , SIGQUIT , SIGILL , SIGTRAP , SIGABRT , SIGEMT , SIGFPE , /*SIGKILL ,*/ SIGBUS , SIGSEGV , SIGSYS , SIGPIPE , SIGALRM , SIGTERM , SIGUSR1 , SIGUSR2 , /*SIGCHLD ,*//*SIGPWR ,*/ SIGVTALRM , SIGPROF , /*SIGIO ,*//*SIGWINCH ,*//*SIGSTOP ,*/ /*SIGTSTP ,*//*SIGCONT ,*//*SIGTTIN ,*//*SIGTTOU ,*/ /*SIGURG ,*/ SIGLOST , 0}; #elif defined(sparc) # if !defined(solaris) int causeStopSignals[]={ SIGHUP , SIGINT , SIGQUIT , SIGILL , SIGTRAP , SIGABRT , SIGEMT , SIGFPE , /*SIGKILL ,*/ SIGBUS , SIGSEGV , SIGSYS , SIGPIPE , SIGALRM , SIGTERM , /*SIGURG ,*/ /*SIGSTOP ,*//*SIGTSTP ,*//*SIGCONT ,*//*SIGCHLD ,*/ /*SIGTTIN ,*//*SIGTTOU ,*//*SIGIO ,*/ SIGXCPU , SIGXFSZ , SIGVTALRM, SIGPROF , /*SIGWINCH ,*/ /*SIGLOST ,*/ SIGUSR1 , SIGUSR2 , 0}; # else int causeStopSignals[]={ SIGHUP , SIGINT , SIGQUIT , SIGILL , SIGTRAP , SIGABRT , SIGEMT , SIGFPE , /*SIGKILL ,*/ SIGBUS , SIGSEGV , SIGSYS , SIGPIPE , SIGALRM , SIGTERM , /*SIGURG ,*/ /*SIGSTOP ,*//*SIGTSTP ,*//*SIGCONT ,*//*SIGCHLD ,*/ /*SIGTTIN ,*//*SIGTTOU ,*//*SIGIO ,*/ SIGXCPU , SIGXFSZ , SIGVTALRM, SIGPROF , /*SIGWINCH ,*/ SIGLOST , SIGUSR1 , SIGUSR2 , 0}; # endif #elif defined(__H3050) int causeStopSignals[]={ SIGHUP , SIGINT , SIGQUIT , SIGILL , SIGTRAP , SIGABRT , SIGEMT , SIGFPE , /*SIGKILL ,*/ SIGBUS , SIGSEGV , SIGSYS , SIGPIPE , SIGALRM , SIGTERM , SIGUSR1 , SIGUSR2 , /*SIGCHLD ,*//*SIGPWR ,*/ SIGVTALRM , SIGPROF , /*SIGIO ,*//*SIGWINDOW,*//*SIGSTOP ,*/ /*SIGTSTP ,*//*SIGCONT ,*//*SIGTTIN ,*//*SIGTTOU ,*/ /*SIGURG ,*/ SIGLOST , SIGDIL , 0}; #else int causeStopSignals[]={0}; #endif CmMain* CmMain::instance_=0; STR CmMain::applicationName_; char CmMain::catchStart_[256]; static char copyRight_[]= "Copyright (C) 1999 Yokogawa Electric Corporation and\n"\ " Yokogawa Digital Computer Corporation.\n"\ "All rights reserved.\n"; char dbgFlags[256]; uint32_t logLevel=0; CSTR __CmMain__funcNeverCalld() {return copyRight_;}