// KDat - a tar-based DAT archiver // Copyright (C) 2001-2002 Lawrence Widman, kdat@cardiothink.com // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include #include #include #include //#include //#include void error_handler(int err_sig); /* include the following in main(): signal(SIGHUP, error_handler); signal(SIGINT, error_handler); signal(SIGFPE, error_handler); signal(SIGSEGV, error_handler); signal(SIGTERM, error_handler); printf("Error_handler installed\n"); */ // from /usr/include/bits/signum.h: // #define SIGHUP 1 /* Hangup (POSIX). */ // #define SIGINT 2 /* Interrupt (ANSI). */ // #define SIGFPE 8 /* Floating-point exception (ANSI). */ // #define SIGSEGV 11 /* Segmentation violation (ANSI). */ // #define SIGTERM 15 /* Termination (ANSI). */ void error_handler(int err_sig) { TQString base1a, base1b, base2a, base2b, msg1, msg2, msg3; int i; base1a = i18n( " caught.\nExit the program from File->Quit or do " "\"kill -9 \" if you like.\n" ); base1b = base1a; // deep copy base2a = i18n( "You can dump core by selecting the \"Abort\" button.\n" "Please notify the maintainer (see Help->About KDat)." ); base2b = base2a; // deep copy msg1 = base1a.append(base2a); msg2 = base1b.append("It is strongly recommended to do this!\n"); msg2 = msg2.append(base2b); msg3 = i18n( "An Error Signal was Received" ); switch (err_sig) { case SIGHUP: fprintf(stderr, "kdat: SIGHUP signal (\"Hangup (POSIX)\") caught\n"); i = TQMessageBox::critical( (TQWidget *)NULL, msg3, i18n( "SIGHUP signal (\"Hangup (POSIX)\")" ).append( msg1 ), TQMessageBox::Ignore, TQMessageBox::Abort, TQMessageBox::NoButton); if( i == TQMessageBox::Abort ){ abort(); } break; case SIGINT: fprintf(stderr, "kdat: SIGINT signal (\"Interrupt (ANSI)\") caught\n"); i = TQMessageBox::critical( (TQWidget *)NULL, msg3, i18n( "SIGINT signal (\"Interrupt (ANSI)\")" ).append( msg1 ), TQMessageBox::Ignore, TQMessageBox::Abort, TQMessageBox::NoButton); if( i == TQMessageBox::Abort ){ abort(); } break; case SIGFPE: fprintf(stderr, "kdat: SIGFPE signal (\"Floating-point exception (ANSI)\") caught\n"); i = TQMessageBox::critical( (TQWidget *)NULL, msg3, i18n("SIGFPE signal (\"Floating-point exception (ANSI)\")").append (msg2), TQMessageBox::Ignore, TQMessageBox::Abort, TQMessageBox::NoButton); if( i == TQMessageBox::Abort ){ abort(); } break; case SIGSEGV: fprintf(stderr, "kdat: SIGSEGV signal (\"Segmentation violation (ANSI)\") caught\n"); i = TQMessageBox::critical( (TQWidget *)NULL, msg3, i18n( "SIGSEGV signal (\"Segmentation violation (ANSI)\")").append(msg2), /* button1, button2 */ TQMessageBox::Ignore, TQMessageBox::Abort, TQMessageBox::NoButton); if( i == TQMessageBox::Abort ){ abort(); } break; case SIGTERM: fprintf(stderr, "kdat: SIGTERM signal (\"Termination (ANSI)\") caught\n"); i = TQMessageBox::critical( (TQWidget *)NULL, msg3, i18n( "SIGTERM signal (\"Termination (ANSI)\")").append(msg1), TQMessageBox::Ignore, TQMessageBox::Abort, TQMessageBox::NoButton); if( i == TQMessageBox::Abort ){ abort(); } break; } // Deinstall the signal handlers // signal(SIGHUP, SIG_DFL); // signal(SIGINT, SIG_DFL); // signal(SIGFPE, SIG_DFL); // signal(SIGSEGV, SIG_DFL); // signal(SIGTERM, SIG_DFL); }