// Restores the UDR server signal handlers to JVM signal handlers before re-entering // any Java code. NABoolean restoreJavaSignalHandlers() { UDR_DEBUG0("[SIGNAL] Restore Java signal handlers before entering Java LM"); struct sigaction oldAction, sigAct; sigemptyset(&(sigAct.sa_mask)); sigAct.sa_flags = 0; for(Int32 i=0; i<sizeof(signalAttrTable)/sizeof(SignalAttr); i++){ if (sigaction (signalAttrTable[i].sigType, (struct sigaction*)NULL, &oldAction)) { cerr << "[MXUDR DEBUG SIGNAL HANDLER] " << "sigaction() failed, cannot obtain old signal handler for " << signalAttrTable[i].sigName << endl; return FALSE; } if ( oldAction.sa_handler == signalAttrTable[i].javaSigAction.sa_handler ) { UDR_DEBUG1("[SIGNAL] Java signal handler for %s already active in restoreJavaSignalHandlers", signalAttrTable[i].sigName); continue; } sigAct.sa_handler = signalAttrTable[i].javaSigAction.sa_handler; sigAct.sa_mask = signalAttrTable[i].javaSigAction.sa_mask; sigAct.sa_flags = signalAttrTable[i].javaSigAction.sa_flags; if (sigaction (signalAttrTable[i].sigType, &sigAct, (struct sigaction*)NULL)) { cerr << "[MXUDR DEBUG SIGNAL HANDLER] " << "sigaction() failed, cannot restore Java signal handler for " << signalAttrTable[i].sigName << endl; return FALSE; } } return TRUE; }
// --------------------------------------------------------------------------- // cfgFileIsOpen: open config file, if already open, return TRUE // --------------------------------------------------------------------------- NABoolean UdrCfgParser::cfgFileIsOpen(NAString &errorText) { if(cfgFile) return TRUE; NABoolean envFound = FALSE; if(cfgFileName = getenv("MXUDRCFG")) { envFound = TRUE; UDR_DEBUG1("UdrCfgParser(): MXUDRCFG cfgFileName is %s", cfgFileName); } else { NAString s("c:/tdm_sql/udr/mxudrcfg"); char installdir[1024]; Lng32 resultlength = 0; Int32 res = ComRtGetInstallDir(installdir, 1024, &resultlength); if (res == 0) { s = installdir; s += "/mxudrcfg"; } cfgFileName = strdup(s.data()); UDR_DEBUG1("UdrCfgParser(): default cfgFileName is %s", cfgFileName); } cfgFile = fopen(cfgFileName, "rt"); if (cfgFile == NULL) { if ((envFound) || ((!envFound) && (errno != ENOENT)) ) { errorText +="*** ERROR: UdrCfgParser(): could not open config file "; errorText += cfgFileName; errorText += ": "; errorText += strerror(errno); errorText += ". Check envvar MXUDRCFG setting.\n"; } return FALSE; } UDR_DEBUG0("UdrCfgParser(): Open config file successful"); return TRUE; }
void comTFDS(const char *msg1, const char *msg2, const char *msg3, const char *msg4, const char *msg5, NABoolean dialOut , NABoolean writeToSeaLog ) { setSignalHandlersToDefault(); if(!msg1) msg1 = ""; if(!msg2) msg2 = ""; if(!msg3) msg3 = ""; if(!msg4) msg4 = ""; if(!msg5) msg5 = ""; UDR_DEBUG1("[SIGNAL] %s", msg1); UDR_DEBUG1("[SIGNAL] %s", msg2); UDR_DEBUG1("[SIGNAL] %s", msg3); UDR_DEBUG1("[SIGNAL] %s", msg4); UDR_DEBUG1("[SIGNAL] %s", msg5); UDR_DEBUG0("[SIGNAL] Logging an EMS message"); char msg[TEXT_SIZE]; strncpy(msg, msg1, sizeof(msg)); strncat(msg, ", ", sizeof(msg)-strlen(msg)); strncat(msg, msg2, sizeof(msg)-strlen(msg)); strncat(msg, ", ", sizeof(msg)-strlen(msg)); strncat(msg, msg3, sizeof(msg)-strlen(msg)); strncat(msg, ", ", sizeof(msg)-strlen(msg)); strncat(msg, msg4, sizeof(msg)-strlen(msg)); strncat(msg, ", ", sizeof(msg)-strlen(msg)); strncat(msg, msg5, sizeof(msg)-strlen(msg)); if (writeToSeaLog) logEMS(msg); else logStdErr(msg); UDR_DEBUG0("[SIGNAL] Aborting..."); abort(); }
void UdrSignalHandler( Int32 signo ) { // Block any more signals inside signal handler sigset_t sigMask; sigfillset (&sigMask); sigprocmask(SIG_BLOCK, &sigMask, NULL); UDR_DEBUG1("[SIGNAL] Caught signal %d", signo); const char *msg1 = COPYRIGHT_UDRSERV_PRODNAME_H " Signal Handler"; char msg2[TEXT_SIZE]; char msg3[2 * TEXT_SIZE]; // to accommodate 3-part ANSI name for routine sprintf(msg2, "SIGNAL %d: ", signo); // TEXT_SIZE is big enough. const char *sigText; switch( signo ) { case SIGHUP: sigText = "Hangup."; break; case SIGINT: sigText = "Interrupt."; break; case SIGQUIT: sigText = "Quit."; break; case SIGILL: sigText = "Instruction failure."; break; case SIGABRT: sigText = "Abnormal termination."; break; case SIGBUS: sigText = "Bus error."; break; case SIGFPE: sigText = "Arithmetic overflow."; break; case SIGSEGV: sigText = "Illegal address reference."; break; case SIGPIPE: sigText = "Pipe error."; break; case SIGALRM: sigText = "Alarm."; break; case SIGTERM: sigText = "Software Terminate."; break; case SIGUSR1: sigText = "User defined 1."; break; case SIGUSR2: sigText = "User defined 2."; break; case SIGTSTP: sigText = "Interactive Stop."; break; case SIGVTALRM: sigText = "Virtual alarm clock."; break; case SIGXCPU: sigText = "CPU time limit exceeded."; break; case SIGXFSZ: sigText = "File size limit exceeded."; break; case SIGSTKFLT: sigText = "Stack fault."; break; case SIGIO: sigText = "I/O now possible."; break; case SIGPWR: sigText = "Power failure."; break; case SIGUNUSED: sigText = "Unused signal."; break; case SIGTTIN: sigText = "Background Read error."; break; case SIGTTOU: sigText = "Background Write error."; break; default: sigText = "Unknown error."; } strncat(msg2, sigText, sizeof(msg2) - strlen(msg2)); NABoolean isRoutineActive; getActiveRoutineInfoMsg(msg3, isRoutineActive); comTFDS(msg1, msg2, msg3, NULL, NULL, TRUE, FALSE); } // UdrTrapHandler()