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.10 by root, Mon Sep 11 01:49:03 2006 UTC vs.
Revision 1.28 by pippijn, Wed Jan 3 00:46:53 2007 UTC

16 16
17 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 20
21 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 22*/
23 23
24#include <global.h> 24#include <global.h>
25#include <material.h> 25#include <material.h>
26#include <loader.h> 26#include <loader.h>
27#ifndef __CEXTRACT__
28# include <sproto.h> 27#include <sproto.h>
29#endif
30
31/* global weathermap */
32weathermap_t **weathermap;
33 28
34void 29void
35set_logfile (char *val) 30set_logfile (char *val)
36{ 31{
37 settings.logfilename = val; 32 settings.logfilename = val;
211 206
212void 207void
213set_csport (char *val) 208set_csport (char *val)
214{ 209{
215 settings.csport = atoi (val); 210 settings.csport = atoi (val);
216#ifndef WIN32 /* ***win32: set_csport: we remove csport error secure check here, do this later */
217 if (settings.csport <= 0 || settings.csport > 32765 || (settings.csport < 1024 && getuid () != 0)) 211 if (settings.csport <= 0 || settings.csport > 32765 || (settings.csport < 1024 && getuid () != 0))
218 { 212 {
219 LOG (llevError, "%d is an invalid csport number.\n", settings.csport); 213 LOG (llevError, "%d is an invalid csport number.\n", settings.csport);
220 exit (1); 214 exit (1);
221 } 215 }
222#endif /* win32 */
223} 216}
224 217
225/* Most of this is shamelessly stolen from XSysStats. But since that is 218/* Most of this is shamelessly stolen from XSysStats. But since that is
226 * also my program, no problem. 219 * also my program, no problem.
227 */ 220 */
243 * pass system very easy, and it is very easy to add in new options. 236 * pass system very easy, and it is very easy to add in new options.
244 */ 237 */
245struct Command_Line_Options options[] = { 238struct Command_Line_Options options[] = {
246 239
247/* Pass 1 functions - STuff that can/should be called before we actually 240/* Pass 1 functions - STuff that can/should be called before we actually
248 * initialize any data. 241 * initialise any data.
249 */ 242 */
250 {"-h", 0, 1, help}, 243 {"-h", 0, 1, help},
251 244
252/* Honor -help also, since it is somewhat common */ 245/* Honor -help also, since it is somewhat common */
253 {"-help", 0, 1, help}, 246 {"-help", 0, 1, help},
265 {"-treasures", 1, 1, (void (*)()) set_treasures}, 258 {"-treasures", 1, 1, (void (*)()) set_treasures},
266 {"-uniquedir", 1, 1, (void (*)()) set_uniquedir}, 259 {"-uniquedir", 1, 1, (void (*)()) set_uniquedir},
267 {"-templatedir", 1, 1, (void (*)()) set_templatedir}, 260 {"-templatedir", 1, 1, (void (*)()) set_templatedir},
268 {"-tmpdir", 1, 1, (void (*)()) set_tmpdir}, 261 {"-tmpdir", 1, 1, (void (*)()) set_tmpdir},
269 {"-log", 1, 1, (void (*)()) set_logfile}, 262 {"-log", 1, 1, (void (*)()) set_logfile},
270
271#ifdef WIN32
272
273/* Windows service stuff */
274 {"-regsrv", 0, 1, service_register},
275 {"-unregsrv", 0, 1, service_unregister},
276 {"-srv", 0, 1, service_handle},
277#endif
278 263
279/* Pass 2 functions. Most of these could probably be in pass 1, 264/* Pass 2 functions. Most of these could probably be in pass 1,
280 * as they don't require much of anything to bet set up. 265 * as they don't require much of anything to bet set up.
281 */ 266 */
282 {"-csport", 1, 2, (void (*)()) set_csport}, 267 {"-csport", 1, 2, (void (*)()) set_csport},
394 FILE *fp; 379 FILE *fp;
395 materialtype_t *mt; 380 materialtype_t *mt;
396 int i, value; 381 int i, value;
397 382
398 sprintf (filename, "%s/materials", settings.datadir); 383 sprintf (filename, "%s/materials", settings.datadir);
399 LOG (llevDebug, "Reading material type data from %s...", filename); 384 LOG (llevDebug, "Reading material type data from %s...\n", filename);
400 if ((fp = fopen (filename, "r")) == NULL) 385 if ((fp = fopen (filename, "r")) == NULL)
401 { 386 {
402 LOG (llevError, "Cannot open %s for reading\n", filename); 387 LOG (llevError, "Cannot open %s for reading\n", filename);
403 mt = get_empty_mat (); 388 mt = get_empty_mat ();
404 mt->next = NULL; 389 mt->next = NULL;
564 { 549 {
565 cp = ""; 550 cp = "";
566 has_val = 0; 551 has_val = 0;
567 } 552 }
568 553
569 if (!strcasecmp (buf, "metaserver_notification"))
570 {
571 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
572 {
573 settings.meta_on = TRUE;
574 }
575 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
576 {
577 settings.meta_on = FALSE;
578 }
579 else
580 {
581 LOG (llevError, "load_settings: Unknown value for metaserver_notification: %s\n", cp);
582 }
583 }
584 else if (!strcasecmp (buf, "metaserver_server"))
585 {
586 if (has_val)
587 strcpy (settings.meta_server, cp);
588 else
589 LOG (llevError, "load_settings: metaserver_server must have a value.\n");
590 }
591 else if (!strcasecmp (buf, "motd")) 554 if (!strcasecmp (buf, "motd"))
592 { 555 {
593 if (has_val) 556 if (has_val)
594 strcpy (settings.motd, cp); 557 strcpy (settings.motd, cp);
595 else 558 else
596 LOG (llevError, "load_settings: motd must have a value.\n"); 559 LOG (llevError, "load_settings: motd must have a value.\n");
600 if (has_val) 563 if (has_val)
601 strcpy (settings.dm_mail, cp); 564 strcpy (settings.dm_mail, cp);
602 else 565 else
603 LOG (llevError, "load_settings: dm_mail must have a value.\n"); 566 LOG (llevError, "load_settings: dm_mail must have a value.\n");
604 } 567 }
605 else if (!strcasecmp (buf, "metaserver_host"))
606 {
607 if (has_val)
608 strcpy (settings.meta_host, cp);
609 else
610 LOG (llevError, "load_settings: metaserver_host must have a value.\n");
611 }
612 else if (!strcasecmp (buf, "metaserver_port"))
613 {
614 int port = atoi (cp);
615
616 if (port < 1 || port > 65535)
617 LOG (llevError, "load_settings: metaserver_port must be between 1 and 65535, %d is invalid\n", port);
618 else
619 settings.meta_port = port;
620 }
621 else if (!strcasecmp (buf, "metaserver_comment"))
622 {
623 strcpy (settings.meta_comment, cp);
624 }
625 else if (!strcasecmp (buf, "worldmapstartx")) 568 else if (!strcasecmp (buf, "worldmapstartx"))
626 { 569 {
627 int size = atoi (cp); 570 int size = atoi (cp);
628 571
629 if (size < 0) 572 if (size < 0)
812 else 755 else
813 { 756 {
814 LOG (llevError, "load_settings: Unknown value for " "real_wiz: %s\n", cp); 757 LOG (llevError, "load_settings: Unknown value for " "real_wiz: %s\n", cp);
815 } 758 }
816 } 759 }
817 else if (!strcasecmp (buf, "recycle_tmp_maps"))
818 {
819 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
820 {
821 settings.recycle_tmp_maps = TRUE;
822 }
823 else if (!strcasecmp (cp, "off") || !strcasecmp (cp, "false"))
824 {
825 settings.recycle_tmp_maps = FALSE;
826 }
827 else
828 {
829 LOG (llevError, "load_settings: Unknown value for " "recycle_tmp_maps: %s\n", cp);
830 }
831 }
832 else if (!strcasecmp (buf, "explore_mode")) 760 else if (!strcasecmp (buf, "explore_mode"))
833 { 761 {
834 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) 762 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
835 { 763 {
836 settings.explore_mode = TRUE; 764 settings.explore_mode = TRUE;
841 } 769 }
842 else 770 else
843 { 771 {
844 LOG (llevError, "load_settings: Unknown value for " "explore_mode: %s\n", cp); 772 LOG (llevError, "load_settings: Unknown value for " "explore_mode: %s\n", cp);
845 } 773 }
846 }
847 else if (!strcasecmp (buf, "who_format"))
848 {
849 if (has_val)
850 strcpy (settings.who_format, cp);
851 }
852 else if (!strcasecmp (buf, "who_wiz_format"))
853 {
854 if (has_val)
855 strcpy (settings.who_wiz_format, cp);
856 } 774 }
857 else if (!strcasecmp (buf, "spellpoint_level_depend")) 775 else if (!strcasecmp (buf, "spellpoint_level_depend"))
858 { 776 {
859 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true")) 777 if (!strcasecmp (cp, "on") || !strcasecmp (cp, "true"))
860 { 778 {
1071 else 989 else
1072 { 990 {
1073 LOG (llevError, "Unknown value in settings file: %s\n", buf); 991 LOG (llevError, "Unknown value in settings file: %s\n", buf);
1074 } 992 }
1075 } 993 }
994
1076 close_and_delete (fp, comp); 995 close_and_delete (fp, comp);
1077} 996}
1078 997
1079 998
1080/* 999/*
1082 */ 1001 */
1083 1002
1084void 1003void
1085init (int argc, char **argv) 1004init (int argc, char **argv)
1086{ 1005{
1087
1088 init_done = 0; /* Must be done before init_signal() */ 1006 init_done = 0; /* Must be done before init_signal() */
1089 logfile = stderr; 1007 logfile = stderr;
1090 parse_args (argc, argv, 1); /* First arg pass - right now it does 1008 parse_args (argc, argv, 1); /* First arg pass - right now it does
1091 * nothing, but in future specifying the 1009 * nothing, but in future specifying the
1092 * LibDir in this pass would be reasonable*/ 1010 * LibDir in this pass would be reasonable*/
1093 1011
1012 cfperl_init ();
1094 init_library (); /* Must be called early */ 1013 init_library (); /* Must be called early */
1095 load_settings (); /* Load the settings file */ 1014 load_settings (); /* Load the settings file */
1096 init_weather ();
1097 load_materials (); 1015 load_materials ();
1098 parse_args (argc, argv, 2); 1016 parse_args (argc, argv, 2);
1099 fprintf (logfile, "Welcome to CrossFire, v%s\n", VERSION); 1017 fprintf (logfile, "Welcome to CrossFire, v%s\n", VERSION);
1018 fprintf (logfile, "Copyright (C) 2005, 2006, 2007 Marc Lehmann.\n");
1100 fprintf (logfile, "Copyright (C) 1994 Mark Wedel.\n"); 1019 fprintf (logfile, "Copyright (C) 1994 Mark Wedel.\n");
1101 fprintf (logfile, "Copyright (C) 1992 Frank Tore Johansen.\n"); 1020 fprintf (logfile, "Copyright (C) 1992 Frank Tore Johansen.\n");
1102 1021
1103 if (strcmp (settings.dm_mail, "") != 0) 1022 if (strcmp (settings.dm_mail, "") != 0)
1104 { 1023 {
1105 fprintf (logfile, "Maintained locally by: %s\n", settings.dm_mail); 1024 fprintf (logfile, "Maintained locally by: %s\n", settings.dm_mail);
1106 fprintf (logfile, "Questions and bugs should be mailed to above address.\n"); 1025 fprintf (logfile, "Questions and bugs should be mailed to above address.\n");
1107 } 1026 }
1027
1108 SRANDOM (time (NULL)); 1028 SRANDOM (time (NULL));
1109 1029
1110 init_startup (); /* Write (C), check shutdown/forbid files */ 1030 init_startup (); /* Write (C), check shutdown/forbid files */
1031 init_uuid ();
1111 init_signals (); /* Sets up signal interceptions */ 1032 init_signals (); /* Sets up signal interceptions */
1112 init_commands (); /* Sort command tables */ 1033 init_commands (); /* Sort command tables */
1113 read_map_log (); /* Load up the old temp map files */
1114 init_skills (); 1034 init_skills ();
1115 1035
1116 parse_args (argc, argv, 3); 1036 parse_args (argc, argv, 3);
1117 1037
1118#ifndef WIN32 /* ***win32: no BecomeDaemon in windows */
1119 if (settings.daemonmode) 1038 if (settings.daemonmode)
1120 logfile = BecomeDaemon (settings.logfilename[0] == '\0' ? "logfile" : settings.logfilename); 1039 logfile = BecomeDaemon (settings.logfilename[0] == '\0' ? "logfile" : settings.logfilename);
1121#endif
1122 1040
1123 init_beforeplay (); 1041 init_beforeplay ();
1124 init_ericserver (); 1042 init_ericserver ();
1125 metaserver_init ();
1126 init_done = 1; 1043 init_done = 1;
1127} 1044}
1128 1045
1129void 1046void
1130usage (void) 1047usage (void)
1291 printf ("Save player:\t<true>\n"); 1208 printf ("Save player:\t<true>\n");
1292 printf ("Save mode:\t%4.4o\n", SAVE_MODE); 1209 printf ("Save mode:\t%4.4o\n", SAVE_MODE);
1293 printf ("Playerdir:\t<VAR>/%s\n", settings.playerdir); 1210 printf ("Playerdir:\t<VAR>/%s\n", settings.playerdir);
1294 printf ("Itemsdir:\t<VAR>/%s\n", settings.uniquedir); 1211 printf ("Itemsdir:\t<VAR>/%s\n", settings.uniquedir);
1295 printf ("Tmpdir:\t\t%s\n", settings.tmpdir); 1212 printf ("Tmpdir:\t\t%s\n", settings.tmpdir);
1296 printf ("Map max timeout:\t%d\n", MAP_MAXTIMEOUT);
1297 printf ("Max objects:\t%d\n", MAX_OBJECTS);
1298#ifdef USE_CALLOC 1213#ifdef USE_CALLOC
1299 printf ("Use_calloc:\t<true>\n"); 1214 printf ("Use_calloc:\t<true>\n");
1300#else 1215#else
1301 printf ("Use_calloc:\t<false>\n"); 1216 printf ("Use_calloc:\t<false>\n");
1302#endif 1217#endif
1305 printf ("Editor:\t\t%s\n", X_EDITOR); 1220 printf ("Editor:\t\t%s\n", X_EDITOR);
1306#endif 1221#endif
1307 1222
1308 printf ("Max_time:\t%d\n", MAX_TIME); 1223 printf ("Max_time:\t%d\n", MAX_TIME);
1309 1224
1310#ifdef WIN32 /* ***win32 compile_info(): remove execl... */
1311 printf ("Logfilename:\t%s\n", settings.logfilename);
1312 exit (0);
1313#else
1314 execl ("/bin/uname", "uname", "-a", NULL); 1225 execl ("/bin/uname", "uname", "-a", NULL);
1315 LOG (llevError, "Oops, shouldn't have gotten here: execl(/bin/uname) failed: %s\n", strerror (errno)); 1226 LOG (llevError, "Oops, shouldn't have gotten here: execl(/bin/uname) failed: %s\n", strerror (errno));
1316 exit (-1); 1227 exit (-1);
1317#endif
1318} 1228}
1319 1229
1320/* Signal handlers: */ 1230/* Signal handlers: */
1321 1231
1322void 1232void
1323rec_sigsegv (int i) 1233rec_sigsegv (int i)
1324{ 1234{
1325 LOG (llevError, "\nSIGSEGV received.\n"); 1235 LOG (llevError, "SIGSEGV received.\n");
1326 fatal_signal (1, 1); 1236 fatal_signal (1, 1);
1327} 1237}
1328 1238
1329void 1239void
1330rec_sigint (int i) 1240rec_sigint (int i)
1331{ 1241{
1332 LOG (llevInfo, "\nSIGINT received.\n"); 1242 LOG (llevInfo, "SIGINT received.\n");
1333 fatal_signal (0, 1); 1243 fatal_signal (0, 1);
1334} 1244}
1335 1245
1336void 1246void
1337rec_sighup (int i) 1247rec_sighup (int i)
1338{ 1248{
1339 LOG (llevInfo, "\nSIGHUP received\n"); 1249 LOG (llevInfo, "SIGHUP received\n");
1250
1340 if (init_done) 1251 if (init_done)
1341 {
1342 emergency_save (0);
1343 cleanup (); 1252 cleanup (0);
1344 } 1253
1345 exit (0); 1254 exit (0);
1346} 1255}
1347 1256
1348void 1257void
1349rec_sigquit (int i) 1258rec_sigquit (int i)
1350{ 1259{
1351 LOG (llevInfo, "\nSIGQUIT received\n"); 1260 LOG (llevInfo, "SIGQUIT received\n");
1352 fatal_signal (1, 1); 1261 fatal_signal (1, 1);
1353} 1262}
1354 1263
1355void 1264void
1356rec_sigbus (int i) 1265rec_sigbus (int i)
1357{ 1266{
1358#ifdef SIGBUS 1267#ifdef SIGBUS
1359 LOG (llevError, "\nSIGBUS received\n"); 1268 LOG (llevError, "SIGBUS received\n");
1360 fatal_signal (1, 1); 1269 fatal_signal (1, 1);
1361#endif 1270#endif
1362} 1271}
1363 1272
1364void 1273void
1365rec_sigterm (int i) 1274rec_sigterm (int i)
1366{ 1275{
1367 LOG (llevInfo, "\nSIGTERM received\n"); 1276 LOG (llevInfo, "SIGTERM received\n");
1368 fatal_signal (0, 1); 1277 fatal_signal (0, 1);
1369} 1278}
1370 1279
1371void 1280void
1372fatal_signal (int make_core, int close_sockets) 1281fatal_signal (int make_core, int close_sockets)
1373{ 1282{
1374 if (init_done) 1283 cleanup (make_core);
1375 {
1376 emergency_save (0);
1377 clean_tmp_files ();
1378 }
1379 if (make_core)
1380 abort ();
1381 exit (0);
1382} 1284}
1383 1285
1384void 1286void
1385init_signals (void) 1287init_signals (void)
1386{ 1288{
1387#ifndef WIN32 /* init_signals() remove signals */
1388 signal (SIGHUP, rec_sighup); 1289 signal (SIGHUP, rec_sighup);
1389 signal (SIGINT, rec_sigint); 1290 signal (SIGINT, rec_sigint);
1390 signal (SIGQUIT, rec_sigquit); 1291 signal (SIGQUIT, rec_sigquit);
1391 signal (SIGSEGV, rec_sigsegv); 1292 signal (SIGSEGV, rec_sigsegv);
1392 signal (SIGPIPE, SIG_IGN); 1293 signal (SIGPIPE, SIG_IGN);
1393# ifdef SIGBUS 1294#ifdef SIGBUS
1394 signal (SIGBUS, rec_sigbus); 1295 signal (SIGBUS, rec_sigbus);
1395# endif 1296#endif
1396 signal (SIGTERM, rec_sigterm); 1297 signal (SIGTERM, rec_sigterm);
1397#endif
1398} 1298}
1399 1299
1400/* init_races() - reads the races file in the lib/ directory, then 1300/* init_races() - reads the races file in the lib/ directory, then
1401 * overwrites old 'race' entries. This routine allow us to quickly 1301 * overwrites old 'race' entries. This routine allow us to quickly
1402 * re-configure the 'alignment' of monsters, objects. Useful for 1302 * re-configure the 'alignment' of monsters, objects. Useful for
1415 return; 1315 return;
1416 init_done = 1; 1316 init_done = 1;
1417 first_race = 0; 1317 first_race = 0;
1418 1318
1419 sprintf (fname, "%s/races", settings.datadir); 1319 sprintf (fname, "%s/races", settings.datadir);
1420 LOG (llevDebug, "Reading races from %s...", fname); 1320 LOG (llevDebug, "Reading races from %s...\n", fname);
1421 if (!(file = fopen (fname, "r"))) 1321 if (!(file = fopen (fname, "r")))
1422 { 1322 {
1423 LOG (llevError, "Cannot open races file %s: %s\n", fname, strerror (errno)); 1323 LOG (llevError, "Cannot open races file %s: %s\n", fname, strerror (errno));
1424 return; 1324 return;
1425 } 1325 }
1465 1365
1466 if (cp[strlen (cp) - 1] == '\n') 1366 if (cp[strlen (cp) - 1] == '\n')
1467 cp[strlen (cp) - 1] = '\0'; 1367 cp[strlen (cp) - 1] = '\0';
1468 1368
1469 /* set creature race to race value */ 1369 /* set creature race to race value */
1470 if ((mon = find_archetype (cp)) == NULL) 1370 if ((mon = archetype::find (cp)) == NULL)
1471 LOG (llevError, "\nCreature %s in race file lacks archetype", cp); 1371 LOG (llevError, "Creature %s in race file lacks archetype\n", cp);
1472 else 1372 else
1473 { 1373 {
1474 if (set_race && (!mon->clone.race || strcmp (mon->clone.race, race))) 1374 if (set_race && (!mon->clone.race || strcmp (mon->clone.race, race)))
1475 { 1375 {
1476 if (mon->clone.race) 1376 if (mon->clone.race)
1477 LOG (llevDebug, "\n Resetting race to %s from %s for archetype %s", race, &mon->clone.race, &mon->name); 1377 LOG (llevDebug, "Resetting race to %s from %s for archetype %s\n", race, &mon->clone.race, &mon->name);
1478 1378
1479 mon->clone.race = race; 1379 mon->clone.race = race;
1480 } 1380 }
1481 1381
1482 /* if the arch is a monster, add it to the race list */ 1382 /* if the arch is a monster, add it to the race list */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines