ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/init.C
(Generate patch)

Comparing deliantra/server/server/init.C (file contents):
Revision 1.28 by pippijn, Wed Jan 3 00:46:53 2007 UTC vs.
Revision 1.37 by root, Fri Jan 19 19:07:05 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 22 * The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 23 */
23 24
24#include <global.h> 25#include <global.h>
25#include <material.h> 26#include <material.h>
26#include <loader.h> 27#include <loader.h>
27#include <sproto.h> 28#include <sproto.h>
755 else 756 else
756 { 757 {
757 LOG (llevError, "load_settings: Unknown value for " "real_wiz: %s\n", cp); 758 LOG (llevError, "load_settings: Unknown value for " "real_wiz: %s\n", cp);
758 } 759 }
759 } 760 }
760 else if (!strcasecmp (buf, "explore_mode"))
761 {
762 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
763 {
764 settings.explore_mode = TRUE;
765 }
766 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
767 {
768 settings.explore_mode = FALSE;
769 }
770 else
771 {
772 LOG (llevError, "load_settings: Unknown value for " "explore_mode: %s\n", cp);
773 }
774 }
775 else if (!strcasecmp (buf, "spellpoint_level_depend")) 761 else if (!strcasecmp (buf, "spellpoint_level_depend"))
776 { 762 {
777 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) 763 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
778 { 764 {
779 settings.spellpoint_level_depend = TRUE; 765 settings.spellpoint_level_depend = TRUE;
993 } 979 }
994 980
995 close_and_delete (fp, comp); 981 close_and_delete (fp, comp);
996} 982}
997 983
998
999/* 984/*
1000 * init() is called only once, when starting the program. 985 * init() is called only once, when starting the program.
1001 */ 986 */
1002 987
1003void 988void
1004init (int argc, char **argv) 989init (int argc, char **argv)
1005{ 990{
1006 init_done = 0; /* Must be done before init_signal() */ 991 init_done = 0; /* Must be done before init_signal() */
992 rndm.seed (time (0));
993
1007 logfile = stderr; 994 logfile = stderr;
1008 parse_args (argc, argv, 1); /* First arg pass - right now it does 995 parse_args (argc, argv, 1); /* First arg pass - right now it does
1009 * nothing, but in future specifying the 996 * nothing, but in future specifying the
1010 * LibDir in this pass would be reasonable*/ 997 * LibDir in this pass would be reasonable*/
1011 998
1022 if (strcmp (settings.dm_mail, "") != 0) 1009 if (strcmp (settings.dm_mail, "") != 0)
1023 { 1010 {
1024 fprintf (logfile, "Maintained locally by: %s\n", settings.dm_mail); 1011 fprintf (logfile, "Maintained locally by: %s\n", settings.dm_mail);
1025 fprintf (logfile, "Questions and bugs should be mailed to above address.\n"); 1012 fprintf (logfile, "Questions and bugs should be mailed to above address.\n");
1026 } 1013 }
1027
1028 SRANDOM (time (NULL));
1029 1014
1030 init_startup (); /* Write (C), check shutdown/forbid files */ 1015 init_startup (); /* Write (C), check shutdown/forbid files */
1031 init_uuid (); 1016 init_uuid ();
1032 init_signals (); /* Sets up signal interceptions */ 1017 init_signals (); /* Sets up signal interceptions */
1033 init_commands (); /* Sort command tables */ 1018 init_commands (); /* Sort command tables */
1228} 1213}
1229 1214
1230/* Signal handlers: */ 1215/* Signal handlers: */
1231 1216
1232void 1217void
1218rec_sigabrt (int i)
1219{
1220 signal (SIGABRT, SIG_DFL);
1221
1222 LOG (llevError, "SIGABRT received.\n");
1223 cleanup ("SIGABRT received", 1);
1224}
1225
1226void
1233rec_sigsegv (int i) 1227rec_sigsegv (int i)
1234{ 1228{
1229 signal (SIGSEGV, SIG_DFL);
1230
1235 LOG (llevError, "SIGSEGV received.\n"); 1231 LOG (llevError, "SIGSEGV received.\n");
1236 fatal_signal (1, 1); 1232 cleanup ("SIGSEGV received", 1);
1237}
1238
1239void
1240rec_sigint (int i)
1241{
1242 LOG (llevInfo, "SIGINT received.\n");
1243 fatal_signal (0, 1);
1244}
1245
1246void
1247rec_sighup (int i)
1248{
1249 LOG (llevInfo, "SIGHUP received\n");
1250
1251 if (init_done)
1252 cleanup (0);
1253
1254 exit (0);
1255} 1233}
1256 1234
1257void 1235void
1258rec_sigquit (int i) 1236rec_sigquit (int i)
1259{ 1237{
1238 signal (SIGQUIT, SIG_IGN);
1239
1260 LOG (llevInfo, "SIGQUIT received\n"); 1240 LOG (llevInfo, "SIGQUIT received\n");
1261 fatal_signal (1, 1); 1241 cleanup ("SIGQUIT received", 1);
1262} 1242}
1263 1243
1264void 1244void
1265rec_sigbus (int i) 1245rec_sigbus (int i)
1266{ 1246{
1267#ifdef SIGBUS 1247 signal (SIGBUS, SIG_DFL);
1248
1268 LOG (llevError, "SIGBUS received\n"); 1249 LOG (llevError, "SIGBUS received\n");
1269 fatal_signal (1, 1); 1250 cleanup ("SIGBUS received", 1);
1270#endif
1271}
1272
1273void
1274rec_sigterm (int i)
1275{
1276 LOG (llevInfo, "SIGTERM received\n");
1277 fatal_signal (0, 1);
1278}
1279
1280void
1281fatal_signal (int make_core, int close_sockets)
1282{
1283 cleanup (make_core);
1284} 1251}
1285 1252
1286void 1253void
1287init_signals (void) 1254init_signals (void)
1288{ 1255{
1289 signal (SIGHUP, rec_sighup); 1256 // large stack, but it's important data we want to save, and it is not usually
1290 signal (SIGINT, rec_sigint); 1257 // being physically allocated anyways
1291 signal (SIGQUIT, rec_sigquit); 1258 const size_t stacksize = 8 * 1024 * 1024 + SIGSTKSZ;
1292 signal (SIGSEGV, rec_sigsegv); 1259
1293 signal (SIGPIPE, SIG_IGN); 1260 stack_t ss;
1294#ifdef SIGBUS 1261 ss.ss_sp = malloc (stacksize);
1295 signal (SIGBUS, rec_sigbus); 1262 ss.ss_flags = 0;
1296#endif 1263 ss.ss_size = stacksize;
1297 signal (SIGTERM, rec_sigterm); 1264 sigaltstack (&ss, 0);
1265
1266 struct sigaction sa;
1267
1268 sigfillset (&sa.sa_mask);
1269 sa.sa_flags = SA_ONSTACK | SA_RESTART;
1270
1271 sa.sa_handler = SIG_IGN; sigaction (SIGPIPE, &sa, 0);
1272 sa.sa_handler = rec_sigabrt; sigaction (SIGABRT, &sa, 0);
1273 sa.sa_handler = rec_sigquit; sigaction (SIGQUIT, &sa, 0);
1274 sa.sa_handler = rec_sigsegv; sigaction (SIGSEGV, &sa, 0);
1275 sa.sa_handler = rec_sigbus; sigaction (SIGBUS, &sa, 0);
1298} 1276}
1299 1277
1300/* init_races() - reads the races file in the lib/ directory, then 1278/* init_races() - reads the races file in the lib/ directory, then
1301 * overwrites old 'race' entries. This routine allow us to quickly 1279 * overwrites old 'race' entries. This routine allow us to quickly
1302 * re-configure the 'alignment' of monsters, objects. Useful for 1280 * re-configure the 'alignment' of monsters, objects. Useful for
1303 * putting together lists of creatures, etc that belong to gods. 1281 * putting together lists of creatures, etc that belong to gods.
1304 */ 1282 */
1305
1306void 1283void
1307init_races (void) 1284init_races (void)
1308{ 1285{
1309 FILE *file; 1286 FILE *file;
1310 char race[MAX_BUF], fname[MAX_BUF], buf[MAX_BUF], *cp, variable[MAX_BUF]; 1287 char race[MAX_BUF], fname[MAX_BUF], buf[MAX_BUF], *cp, variable[MAX_BUF];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines