void setExitHandler() { if (getenv("SQLMX_UDR_NO_EXIT_HANDLER")) { return; } UDR_DEBUG0("[EXIT HANDLER] Setting up the MXUDR Exit handler"); Int32 rc = atexit(UdrExitHandler); UDR_DEBUG0("[EXIT HANDLER] Completed setting up the MXUDR Exit handler"); }
// 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; }
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(); }
// Udr exit handler routine // Main purpose of this handler routine is to check if the UDR called exit // which it is not supposed to do. In case UDR called exit, we log an // event message and abort. void UdrExitHandler() { const char *msg1 = COPYRIGHT_UDRSERV_PRODNAME_H " Exit Handler"; char msg2[TEXT_SIZE]; char msg3[2 * TEXT_SIZE]; // to accommodate 3-part ANSI name for routine UDR_DEBUG0("[EXIT HANDLER] Entered MXUDR Exit handler"); NABoolean isRoutineActive; getActiveRoutineInfoMsg(msg3, isRoutineActive); // If the UDR was active and it called exit intentionally, // log a message and capture TFDS state. if (isRoutineActive == TRUE) { UDR_DEBUG0("[EXIT HANDLER] UDR invoked exit()"); strcpy(msg2, "UDR invoked exit() "); comTFDS(msg1, msg2, msg3, NULL, NULL, FALSE, FALSE); } // Call MPI exit handler routine from this exit handler my_mpi_fclose(); }
// --------------------------------------------------------------------------- // 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; }
// Saves the UDR trap signal handlers NABoolean saveUdrTrapSignalHandlers() { UDR_DEBUG0("[SIGNAL] Save UDR Trap signal handlers"); struct sigaction oldAction; 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; } signalAttrTable[i].udrSigAction.sa_handler = oldAction.sa_handler; signalAttrTable[i].udrSigAction.sa_mask = oldAction.sa_mask; signalAttrTable[i].udrSigAction.sa_flags = oldAction.sa_flags; } return TRUE; }
// Sets the UDR server signal handlers to default so that the JVM won't complain. NABoolean setSignalHandlersToDefault() { struct sigaction oldAction, sigAct; sigemptyset(&(sigAct.sa_mask)); sigAct.sa_flags = 0; sigAct.sa_handler = SIG_DFL; UDR_DEBUG0("[SIGNAL] Set signal handlers to default before Java LM initialization"); for(Int32 i=0; i<sizeof(signalAttrTable)/sizeof(SignalAttr); i++){ if (sigaction(signalAttrTable[i].sigType, &sigAct, &oldAction)) { char msg[256]; sprintf(msg, "[UDR WARNING] sigaction() failed, cannot change %s to the default handler\n", signalAttrTable[i].sigName); logStdErr(msg); return FALSE; } } return TRUE; }