00001 /* 00002 * Empire - A multi-player, client/server Internet based war game. 00003 * Copyright (C) 1986-2007, Dave Pare, Jeff Bailey, Thomas Ruschak, 00004 * Ken Stevens, Steve McClure 00005 * 00006 * This program is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation; either version 2 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 * 00020 * --- 00021 * 00022 * See files README, COPYING and CREDITS in the root of the source 00023 * tree for related information and legal notices. It is expected 00024 * that future projects/authors will amend these files as needed. 00025 * 00026 * --- 00027 * 00028 * posix.c: Thread-related code common to POSIX systems 00029 * 00030 * Known contributors to this file: 00031 * Markus Armbruster, 2006 00032 */ 00033 00034 #include <config.h> 00035 00036 #include <signal.h> 00037 #include <unistd.h> 00038 #include "empthread.h" 00039 #include "journal.h" 00040 #include "prototypes.h" 00041 00042 static void panic(int sig); 00043 00044 void 00045 empth_init_signals(void) 00046 { 00047 struct sigaction act; 00048 00049 act.sa_flags = 0; 00050 sigemptyset(&act.sa_mask); 00051 act.sa_handler = panic; 00052 sigaction(SIGBUS, &act, NULL); 00053 sigaction(SIGSEGV, &act, NULL); 00054 sigaction(SIGILL, &act, NULL); 00055 sigaction(SIGFPE, &act, NULL); 00056 act.sa_handler = SIG_IGN; 00057 sigaction(SIGPIPE, &act, NULL); 00058 } 00059 00060 /* we're going down. try to close the files at least */ 00061 static void 00062 panic(int sig) 00063 { 00064 struct sigaction act; 00065 00066 act.sa_flags = 0; 00067 sigemptyset(&act.sa_mask); 00068 act.sa_handler = SIG_DFL; 00069 sigaction(SIGBUS, &act, NULL); 00070 sigaction(SIGSEGV, &act, NULL); 00071 sigaction(SIGILL, &act, NULL); 00072 sigaction(SIGFPE, &act, NULL); 00073 00074 /* 00075 * This code calls functions that are not safe to call from a 00076 * signal handler! That could probably be rectified with some 00077 * effort. However, we're already in a bad state. Is it wise to 00078 * flush that state to disk, possibly overwriting good state? 00079 * FIXME make the code safe as far as practical 00080 */ 00081 logerror("server received fatal signal %d", sig); 00082 log_last_commands(); 00083 ef_fin_srv(); 00084 journal_shutdown(); 00085 /* End of unsafe code */ 00086 00087 if (CANT_HAPPEN(sig != SIGBUS && sig != SIGSEGV 00088 && sig != SIGILL && sig != SIGFPE)) 00089 _exit(1); 00090 if (raise(sig)) 00091 _exit(1); 00092 }
1.5.2